|
|
@@ -7,6 +7,26 @@ import { useSettings, monoFontFamily } from "@/context/settings"
|
|
|
import { playSound, SOUND_OPTIONS } from "@/utils/sound"
|
|
|
import { Link } from "./link"
|
|
|
|
|
|
+
|
|
|
+let demoSoundState = {
|
|
|
+ cleanup: undefined as (() => void) | undefined,
|
|
|
+ timeout: undefined as NodeJS.Timeout | undefined,
|
|
|
+}
|
|
|
+
|
|
|
+// To prevent audio from overlapping/playing very quickly when navigating the settings menus,
|
|
|
+// delay the playback by 100ms during quick selection changes and pause existing sounds.
|
|
|
+const playDemoSound = (src: string) => {
|
|
|
+ if (demoSoundState.cleanup) {
|
|
|
+ demoSoundState.cleanup();
|
|
|
+ }
|
|
|
+
|
|
|
+ clearTimeout(demoSoundState.timeout)
|
|
|
+
|
|
|
+ demoSoundState.timeout = setTimeout(() => {
|
|
|
+ demoSoundState.cleanup = playSound(src)
|
|
|
+ }, 100)
|
|
|
+}
|
|
|
+
|
|
|
export const SettingsGeneral: Component = () => {
|
|
|
const theme = useTheme()
|
|
|
const language = useLanguage()
|
|
|
@@ -211,12 +231,12 @@ export const SettingsGeneral: Component = () => {
|
|
|
label={(o) => language.t(o.label)}
|
|
|
onHighlight={(option) => {
|
|
|
if (!option) return
|
|
|
- playSound(option.src)
|
|
|
+ playDemoSound(option.src)
|
|
|
}}
|
|
|
onSelect={(option) => {
|
|
|
if (!option) return
|
|
|
settings.sounds.setAgent(option.id)
|
|
|
- playSound(option.src)
|
|
|
+ playDemoSound(option.src)
|
|
|
}}
|
|
|
variant="secondary"
|
|
|
size="small"
|
|
|
@@ -235,12 +255,12 @@ export const SettingsGeneral: Component = () => {
|
|
|
label={(o) => language.t(o.label)}
|
|
|
onHighlight={(option) => {
|
|
|
if (!option) return
|
|
|
- playSound(option.src)
|
|
|
+ playDemoSound(option.src)
|
|
|
}}
|
|
|
onSelect={(option) => {
|
|
|
if (!option) return
|
|
|
settings.sounds.setPermissions(option.id)
|
|
|
- playSound(option.src)
|
|
|
+ playDemoSound(option.src)
|
|
|
}}
|
|
|
variant="secondary"
|
|
|
size="small"
|
|
|
@@ -259,12 +279,12 @@ export const SettingsGeneral: Component = () => {
|
|
|
label={(o) => language.t(o.label)}
|
|
|
onHighlight={(option) => {
|
|
|
if (!option) return
|
|
|
- playSound(option.src)
|
|
|
+ playDemoSound(option.src)
|
|
|
}}
|
|
|
onSelect={(option) => {
|
|
|
if (!option) return
|
|
|
settings.sounds.setErrors(option.id)
|
|
|
- playSound(option.src)
|
|
|
+ playDemoSound(option.src)
|
|
|
}}
|
|
|
variant="secondary"
|
|
|
size="small"
|