import { useCallback, useState } from "react"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "../ui/dialog"; import { Button } from "../ui/button"; import { Label } from "../ui/label"; import { RadioGroup, RadioGroupItem } from "../ui/radio-group"; import { Input } from "../ui/input"; import { SelectSeparator } from "../ui/select"; import axios from "axios"; import { toast } from "sonner"; import { isDesktop } from "react-device-detect"; import { Drawer, DrawerContent } from "../ui/drawer"; import ActivityIndicator from "../indicators/activity-indicator"; const RECAP_PERIODS = ["24", "12", "8", "4", "1"] as const; type RecapPeriod = (typeof RECAP_PERIODS)[number]; type RecapDialogProps = { camera: string; open: boolean; onOpenChange: (open: boolean) => void; }; export default function RecapDialog({ camera, open, onOpenChange, }: RecapDialogProps) { const [selectedPeriod, setSelectedPeriod] = useState("24"); const [label, setLabel] = useState("person"); const [isGenerating, setIsGenerating] = useState(false); const onGenerate = useCallback(() => { const now = Date.now() / 1000; const hours = parseInt(selectedPeriod); const startTime = now - hours * 3600; setIsGenerating(true); axios .post(`recap/${camera}`, null, { params: { start_time: startTime, end_time: now, label, }, }) .then((response) => { if (response.status === 200 && response.data.success) { toast.success("Recap generation started", { position: "top-center", description: "Check Exports when it's done.", }); onOpenChange(false); } }) .catch((error) => { const msg = error.response?.data?.message || error.response?.data?.detail || "Unknown error"; toast.error(`Recap failed: ${msg}`, { position: "top-center" }); }) .finally(() => { setIsGenerating(false); }); }, [camera, selectedPeriod, label, onOpenChange]); const Overlay = isDesktop ? Dialog : Drawer; const Content = isDesktop ? DialogContent : DrawerContent; return (
{isDesktop && ( <> Generate Recap )}
setSelectedPeriod(v as RecapPeriod)} > {RECAP_PERIODS.map((period) => (
))}
setLabel(e.target.value)} placeholder="person" />
{isDesktop && }
onOpenChange(false)} > Cancel
); }