import React, { createContext, useContext, useRef, useState, useCallback, } from "react"; // The shape of our context type TimeContextType = { currentTime: number; setCurrentTime: (t: number) => void; subscribe: (cb: (t: number) => void) => () => void; isPlaying: boolean; setIsPlaying: React.Dispatch>; duration: number; setDuration: React.Dispatch>; }; const TimeContext = createContext(undefined); export const useTime = () => { const ctx = useContext(TimeContext); if (!ctx) throw new Error("useTime must be used within a TimeProvider"); return ctx; }; export const TimeProvider: React.FC<{ children: React.ReactNode; duration: number; }> = ({ children, duration: initialDuration }) => { const [currentTime, setCurrentTime] = useState(0); const [isPlaying, setIsPlaying] = useState(false); const [duration, setDuration] = useState(initialDuration); const listeners = useRef void>>(new Set()); // Call this to update time and notify all listeners const updateTime = useCallback((t: number) => { setCurrentTime(t); listeners.current.forEach((fn) => fn(t)); }, []); // Components can subscribe to time changes (for imperative updates) const subscribe = useCallback((cb: (t: number) => void) => { listeners.current.add(cb); return () => listeners.current.delete(cb); }, []); return ( {children} ); };