| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- "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<Movie | null>(null);
- const [rollState, setRollState] = useState<RollState>("idle");
- const timerRef = useRef<ReturnType<typeof setTimeout>>(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 };
- }
|