From d02940b9cb8cb63801b24a8c13a07f6476562371 Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Mon, 7 Oct 2024 20:31:04 +0200 Subject: [PATCH] wip: poc for playing a sound on time end --- apps/client/src/assets/sounds/buzzer.mp3 | Bin 0 -> 66037 bytes apps/client/src/common/hooks/useSocket.ts | 8 +++++++ .../src/features/viewers/timer/Timer.tsx | 21 ++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 apps/client/src/assets/sounds/buzzer.mp3 diff --git a/apps/client/src/assets/sounds/buzzer.mp3 b/apps/client/src/assets/sounds/buzzer.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3c1db389418472cfa274fa15e87e96b890162244 GIT binary patch literal 66037 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 G@xK61tE#2| literal 0 HcmV?d00001 diff --git a/apps/client/src/common/hooks/useSocket.ts b/apps/client/src/common/hooks/useSocket.ts index 43fb648f0e..b3df9f1556 100644 --- a/apps/client/src/common/hooks/useSocket.ts +++ b/apps/client/src/common/hooks/useSocket.ts @@ -176,6 +176,14 @@ export const useTimer = () => { return useRuntimeStore(featureSelector); }; +export const useTimerPhase = () => { + const featureSelector = (state: RuntimeStore) => ({ + phase: state.timer.phase, + }); + + return useRuntimeStore(featureSelector); +}; + export const useClock = () => { const featureSelector = (state: RuntimeStore) => ({ clock: state.clock, diff --git a/apps/client/src/features/viewers/timer/Timer.tsx b/apps/client/src/features/viewers/timer/Timer.tsx index 44f9b96671..cd04cd0aa7 100644 --- a/apps/client/src/features/viewers/timer/Timer.tsx +++ b/apps/client/src/features/viewers/timer/Timer.tsx @@ -1,4 +1,6 @@ +import { useMemo } from 'react'; import { useSearchParams } from 'react-router-dom'; +import { usePrevious } from '@mantine/hooks'; import { AnimatePresence, motion } from 'framer-motion'; import { CustomFields, @@ -12,12 +14,14 @@ import { ViewSettings, } from 'ontime-types'; +import sound from '../../../assets/sounds/buzzer.mp3'; import { overrideStylesURL } from '../../../common/api/constants'; import { FitText } from '../../../common/components/fit-text/FitText'; import MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar'; import TitleCard from '../../../common/components/title-card/TitleCard'; import ViewParamsEditor from '../../../common/components/view-params-editor/ViewParamsEditor'; import { useRuntimeStylesheet } from '../../../common/hooks/useRuntimeStylesheet'; +import { useTimerPhase } from '../../../common/hooks/useSocket'; import { useWindowTitle } from '../../../common/hooks/useWindowTitle'; import { ViewExtendedTimer } from '../../../common/models/TimeManager.type'; import { formatTime, getDefaultFormat } from '../../../common/utils/time'; @@ -59,12 +63,28 @@ interface TimerProps { viewSettings: ViewSettings; } +const usePhaseEvent = () => { + const { phase } = useTimerPhase(); + const previousValue = usePrevious(phase); + + const audio = useMemo(() => new Audio(sound), []); + + if (previousValue !== TimerPhase.None && previousValue !== phase && phase === TimerPhase.Overtime) { + try { + audio.play(); + } catch (error) { + console.error('Audio playback prevented', error); + } + } +}; + export default function Timer(props: TimerProps) { const { auxTimer, customFields, eventNow, eventNext, isMirrored, message, settings, time, viewSettings } = props; const { shouldRender } = useRuntimeStylesheet(viewSettings?.overrideStyles && overrideStylesURL); const { getLocalizedString } = useTranslation(); const [searchParams] = useSearchParams(); + usePhaseEvent(); useWindowTitle('Timer'); @@ -172,6 +192,7 @@ export default function Timer(props: TimerProps) { return (
+