Update CustomSounds
Some checks are pending
Sync to Codeberg / Sync Codeberg and Github (push) Waiting to run
Test / Test (push) Waiting to run

This commit is contained in:
thororen1234 2025-01-17 09:01:28 -05:00
parent 2432364123
commit 806e9330cd
3 changed files with 80 additions and 64 deletions

View file

@ -5,21 +5,21 @@
*/ */
import { classNameFactory } from "@api/Styles"; import { classNameFactory } from "@api/Styles";
import { makeRange } from "@components/PluginSettings/components";
import { Margins } from "@utils/margins"; import { Margins } from "@utils/margins";
import { classes } from "@utils/misc"; import { classes } from "@utils/misc";
import { useForceUpdater } from "@utils/react"; import { useForceUpdater } from "@utils/react";
import { findByCodeLazy, findLazy } from "@webpack"; import { findByCodeLazy, findLazy } from "@webpack";
import { Button, Card, Forms, Slider, Switch, useRef } from "@webpack/common"; import { Button, Card, Forms, Slider, Switch, Tooltip, useRef } from "@webpack/common";
import { ComponentType, Ref, SyntheticEvent } from "react"; import { ComponentType, Ref, SyntheticEvent } from "react";
import { SoundOverride, SoundPlayer, SoundType } from "../types"; import { SoundOverride, SoundPlayer, SoundType } from "../types";
type FileInput = ComponentType<{ type FileInput = ComponentType<{
ref: Ref<HTMLInputElement>; ref: Ref<HTMLInputElement>;
onChange: (e: SyntheticEvent<HTMLInputElement>) => void; onChange: (event: SyntheticEvent<HTMLInputElement>) => void;
multiple?: boolean; multiple?: boolean;
filters?: { name?: string; extensions: string[]; }[]; filters?: { name?: string; extensions: string[]; }[];
disabled?: boolean;
}>; }>;
const playSound: (id: string) => SoundPlayer = findByCodeLazy(".playWithListener().then"); const playSound: (id: string) => SoundPlayer = findByCodeLazy(".playWithListener().then");
@ -43,29 +43,23 @@ export function SoundOverrideComponent({ type, override, onChange }: { type: Sou
className={Margins.bottom16} className={Margins.bottom16}
hideBorder={true} hideBorder={true}
> >
{type.name} <span className={cl("id")}>({type.id})</span> <Tooltip text={type.id}>
{tooltipProps => <span {...tooltipProps}>{type.name}</span>}
</Tooltip>
</Switch> </Switch>
<Forms.FormTitle>Sound File</Forms.FormTitle>
<div className={classes(cl("file"), Margins.bottom16)} >
<Forms.FormText className={cl("file-name")}>{override.url.length === 0 ? "Discord Default" : (override.fileName || "Custom Sound")}</Forms.FormText>
<Button <Button
color={Button.Colors.PRIMARY} color={Button.Colors.PRIMARY}
className={Margins.bottom16} size={Button.Sizes.SMALL}
onClick={() => {
if (sound.current != null)
sound.current.stop();
sound.current = playSound(type.id);
}}
disabled={!override.enabled} disabled={!override.enabled}
className={cl("file-replace")}
> >
Preview Replace
</Button>
<Forms.FormTitle>Replacement Sound</Forms.FormTitle>
<Button
color={Button.Colors.PRIMARY}
disabled={!override.enabled}
className={classes(Margins.right8, Margins.bottom16, cl("upload"))}
>
Upload
<FileInput <FileInput
ref={fileInputRef} ref={fileInputRef}
disabled={!override.enabled}
onChange={event => { onChange={event => {
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
@ -80,6 +74,7 @@ export function SoundOverrideComponent({ type, override, onChange }: { type: Sou
const reader = new FileReader; const reader = new FileReader;
reader.onload = () => { reader.onload = () => {
override.url = reader.result as string; override.url = reader.result as string;
override.fileName = file.name;
onChange(); onChange();
update(); update();
}; };
@ -91,20 +86,20 @@ export function SoundOverrideComponent({ type, override, onChange }: { type: Sou
</Button> </Button>
<Button <Button
color={Button.Colors.RED} color={Button.Colors.RED}
size={Button.Sizes.SMALL}
onClick={() => { onClick={() => {
override.url = ""; override.url = "";
onChange(); onChange();
update(); update();
}} }}
disabled={!(override.enabled && override.url.length !== 0)} disabled={!(override.enabled && override.url.length !== 0)}
style={{ display: "inline" }} className={cl("file-reset")}
className={classes(Margins.right8, Margins.bottom16)}
> >
Clear Reset
</Button> </Button>
</div>
<Forms.FormTitle>Volume</Forms.FormTitle> <Forms.FormTitle>Volume</Forms.FormTitle>
<Slider <Slider
markers={makeRange(0, 100, 10)}
initialValue={override.volume} initialValue={override.volume}
onValueChange={value => { onValueChange={value => {
override.volume = value; override.volume = value;
@ -114,6 +109,18 @@ export function SoundOverrideComponent({ type, override, onChange }: { type: Sou
className={Margins.bottom16} className={Margins.bottom16}
disabled={!override.enabled} disabled={!override.enabled}
/> />
<Button
color={Button.Colors.PRIMARY}
className={Margins.bottom16}
onClick={() => {
if (sound.current != null)
sound.current.stop();
sound.current = playSound(type.id);
}}
disabled={!override.enabled}
>
Preview
</Button>
</Card> </Card>
); );
} }

View file

@ -2,10 +2,17 @@
padding: 1em 1em 0; padding: 1em 1em 0;
} }
.vc-custom-sounds-id { .vc-custom-sounds-file {
color: var(--text-muted); display: flex;
align-items: center;
gap: 0.5em;
} }
.vc-custom-sounds-upload { .vc-custom-sounds-file-name {
flex-grow: 1;
}
.vc-custom-sounds-file-replace,
.vc-custom-sounds-file-reset {
display: inline; display: inline;
} }

View file

@ -11,6 +11,7 @@ export interface SoundType {
export interface SoundOverride { export interface SoundOverride {
enabled: boolean; enabled: boolean;
fileName: string;
url: string; url: string;
volume: number; volume: number;
} }
@ -51,6 +52,7 @@ export const soundTypes: readonly SoundType[] = [
export function makeEmptyOverride(): SoundOverride { export function makeEmptyOverride(): SoundOverride {
return { return {
enabled: false, enabled: false,
fileName: "",
url: "", url: "",
volume: 100 volume: 100
}; };