import { useCallback, useEffect, useMemo, useState } from "react"; import { ArrowRight, History, Sparkles } from "lucide-react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { type SwipeMode, useSwipeCards } from "@/hooks/queries/recommendations"; import GenrePicker from "./watchtonight/GenrePicker"; import CardStack from "./watchtonight/CardStack"; type Step = "mode-select" | "genre-picker" | "swipe-deck"; interface WatchTonightDialogProps { open: boolean; onOpenChange: (open: boolean) => void; } export default function WatchTonightDialog({ open, onOpenChange }: WatchTonightDialogProps) { const [step, setStep] = useState("mode-select"); const [mode, setMode] = useState("discover"); const [genres, setGenres] = useState([]); // Reset state when dialog closes. useEffect(() => { if (!open) { // Small delay to let close animation finish before resetting. const t = setTimeout(() => { setStep("mode-select"); setMode("discover"); setGenres([]); }, 200); return () => clearTimeout(t); } }, [open]); const swipeEnabled = open && step === "swipe-deck"; const { data, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage } = useSwipeCards( swipeEnabled, mode, genres, ); const cards = useMemo(() => data?.pages.flatMap((p) => p.cards) ?? [], [data]); const hasMore = hasNextPage ?? false; const handleModeSelect = useCallback((selectedMode: SwipeMode) => { setMode(selectedMode); if (selectedMode === "continue") { setStep("swipe-deck"); } else { setStep("genre-picker"); } }, []); const handleGenresConfirm = useCallback(() => { setStep("swipe-deck"); }, []); const handleNeedMore = useCallback(() => { if (hasNextPage && !isFetchingNextPage) { void fetchNextPage(); } }, [fetchNextPage, hasNextPage, isFetchingNextPage]); const handleClose = useCallback(() => { onOpenChange(false); }, [onOpenChange]); const handleReset = useCallback(() => { setStep("mode-select"); setGenres([]); }, []); // Dynamic dialog sizing based on step. const dialogClass = step === "swipe-deck" ? "gap-0 overflow-hidden p-0 sm:max-w-md" : "gap-0 overflow-hidden p-0 sm:max-w-lg"; return ( Watch Tonight {step === "mode-select" && "What are you in the mood for?"} {step === "genre-picker" && "Pick some genres to narrow things down"} {step === "swipe-deck" && (mode === "continue" ? "Swipe through your in-progress titles" : "Swipe right to play, left to skip")}
{/* Step 1: Mode Selection */} {step === "mode-select" && (
)} {/* Step 2: Genre Picker */} {step === "genre-picker" && (
)} {/* Step 3: Swipe Deck */} {step === "swipe-deck" && ( )}
); }