From 929dd74ec120cfc62708386f99f6f91fd047b55a Mon Sep 17 00:00:00 2001 From: Mathis HERRIOT <197931332+0x485254@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:30:28 +0100 Subject: [PATCH] feat: add `AudioProvider` for global audio state management - Introduced `AudioProvider` with context for managing global mute state and active video. - Added `useAudio` hook to access AudioContext conveniently. --- frontend/src/providers/audio-provider.tsx | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 frontend/src/providers/audio-provider.tsx diff --git a/frontend/src/providers/audio-provider.tsx b/frontend/src/providers/audio-provider.tsx new file mode 100644 index 0000000..964f2a5 --- /dev/null +++ b/frontend/src/providers/audio-provider.tsx @@ -0,0 +1,45 @@ +"use client"; + +import type React from "react"; +import { createContext, useCallback, useContext, useState } from "react"; + +interface AudioContextType { + isGlobalMuted: boolean; + activeVideoId: string | null; + toggleGlobalMute: () => void; + setActiveVideo: (id: string | null) => void; +} + +const AudioContext = createContext(undefined); + +export function AudioProvider({ children }: { children: React.ReactNode }) { + const [isGlobalMuted, setIsGlobalMuted] = useState(true); + const [activeVideoId, setActiveVideoId] = useState(null); + + const toggleGlobalMute = useCallback(() => { + setIsGlobalMuted((prev) => !prev); + }, []); + + const setActiveVideo = useCallback((id: string | null) => { + setActiveVideoId(id); + if (id !== null) { + setIsGlobalMuted(false); + } + }, []); + + return ( + + {children} + + ); +} + +export function useAudio() { + const context = useContext(AudioContext); + if (context === undefined) { + throw new Error("useAudio must be used within an AudioProvider"); + } + return context; +}