import { useContext, useEffect, useRef, useState } from "react"; import { PlayerContext } from "../contexts/PlayerContext.ts"; import { MediaPlayer } from "./MediaPlayer.tsx"; function itemKey( item: { kind: string; embedUrl?: string; fileUrl?: string } | null, ) { if (!item) return null; return item.kind === "embed" ? item.embedUrl : item.fileUrl; } export function GlobalPlayer() { const { current, startTime, autoplay, stop, seekRef, toggleRef, onPlayStateChange, onTimeUpdate, } = useContext(PlayerContext); const ref = useRef(null); const [reduced, setReduced] = useState(false); const [prevKey, setPrevKey] = useState(itemKey(current)); if (prevKey !== itemKey(current)) { setPrevKey(itemKey(current)); if (current) setReduced(false); } useEffect(() => { if (!current) { document.body.classList.remove("has-player"); document.body.style.removeProperty("--player-height"); return; } const el = ref.current; if (!el) return; document.body.style.setProperty("--player-height", `${el.offsetHeight}px`); document.body.classList.add("has-player"); const observer = new ResizeObserver(() => { document.body.style.setProperty( "--player-height", `${el.offsetHeight}px`, ); }); observer.observe(el); return () => { observer.disconnect(); document.body.classList.remove("has-player"); document.body.style.removeProperty("--player-height"); }; }, [current]); if (!current) return null; const typeClass = current.kind === "embed" ? current.type : current.mimeType.startsWith("video/") ? "file-video" : "file-audio"; const title = current.title ?? (current.kind === "embed" ? current.embedUrl : current.fileUrl); return (
{title}
{current.kind === "embed" ? (