"use client"; import { useState, useCallback, useRef, useEffect } from "react"; import type { Movie } from "@/types/movie"; import { selectRandomMovie } from "@/lib/dice/randomizer"; export type RollState = "idle" | "rolling" | "complete"; const ANIMATION_DURATION_MS = 2500; export interface UseRollReturn { result: Movie | null; rollState: RollState; roll: (eligibleMovies: Movie[]) => void; reset: () => void; } export function useRoll(): UseRollReturn { const [result, setResult] = useState(null); const [rollState, setRollState] = useState("idle"); const timerRef = useRef>(null); useEffect(() => { return () => { if (timerRef.current) clearTimeout(timerRef.current); }; }, []); const roll = useCallback((eligibleMovies: Movie[]) => { if (timerRef.current) clearTimeout(timerRef.current); const winner = selectRandomMovie(eligibleMovies); setRollState("rolling"); setResult(winner); timerRef.current = setTimeout(() => { setRollState("complete"); }, ANIMATION_DURATION_MS); }, []); const reset = useCallback(() => { if (timerRef.current) clearTimeout(timerRef.current); setResult(null); setRollState("idle"); }, []); return { result, rollState, roll, reset }; }