Files
gerbeur/src/contexts/PlayerContext.ts

44 lines
1.3 KiB
TypeScript

import { createContext } from "react";
export type PlayerItem =
| { kind: "embed"; embedUrl: string; title?: string; type: string }
| { kind: "file"; fileUrl: string; mimeType: string; title?: string };
export interface PlayerContextValue {
// Playback state — readable by any consumer
current: PlayerItem | null;
playing: boolean;
currentTime: number;
duration: number;
// Control — callable by any consumer
play(item: PlayerItem): void;
stop(): void;
seekTo(time: number): void;
togglePlay(): void;
// Internal: GlobalPlayer registers MediaPlayer's imperative handles here
// so seekTo / togglePlay can reach into the actual media element.
seekRef: { current: ((t: number) => void) | null };
toggleRef: { current: (() => void) | null };
// Internal: GlobalPlayer calls these to push state back into the provider
onPlayStateChange(playing: boolean): void;
onTimeUpdate(time: number, duration: number): void;
}
export const PlayerContext = createContext<PlayerContextValue>({
current: null,
playing: false,
currentTime: 0,
duration: 0,
play: () => {},
stop: () => {},
seekTo: () => {},
togglePlay: () => {},
seekRef: { current: null },
toggleRef: { current: null },
onPlayStateChange: () => {},
onTimeUpdate: () => {},
});