import { useCallback, useRef } from "react"; import { MdOndemandVideo } from "react-icons/md"; import { useDemoActions, useDemoRecording } from "./DemoProvider"; import { createDemoStreamingRecording } from "../demo/streaming"; import styles from "./LoadDemoButton.module.css"; export function LoadDemoButton() { const recording = useDemoRecording(); const { setRecording } = useDemoActions(); const inputRef = useRef(null); const parseTokenRef = useRef(0); const handleClick = useCallback(() => { if (recording) { // Unload the current recording. parseTokenRef.current += 1; setRecording(null); return; } inputRef.current?.click(); }, [recording, setRecording]); const handleFileChange = useCallback( async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; // Reset the input so the same file can be re-selected. e.target.value = ""; try { const buffer = await file.arrayBuffer(); const parseToken = parseTokenRef.current + 1; parseTokenRef.current = parseToken; const recording = await createDemoStreamingRecording(buffer); if (parseTokenRef.current !== parseToken) { return; } // Metadata-first: mission/game-mode sync happens immediately. setRecording(recording); } catch (err) { console.error("Failed to load demo:", err); } }, [setRecording], ); return ( <> ); }