import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { isDesktop } from "react-device-detect"; import { FaCalendarAlt } from "react-icons/fa"; import useSWR from "swr"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Label } from "@/components/ui/label"; import { TimezoneAwareCalendar } from "@/components/overlay/ReviewActivityCalendar"; import { FrigateConfig } from "@/types/frigateConfig"; import { useFormattedTimestamp } from "@/hooks/use-date-utils"; type CustomSuspensionDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; onConfirm: (minutes: number) => void; }; const ONE_HOUR_MS = 60 * 60 * 1000; function pad(n: number): string { return n.toString().padStart(2, "0"); } function isValidDate(d: Date): boolean { return !Number.isNaN(d.getTime()); } export default function CustomSuspensionDialog({ open, onOpenChange, onConfirm, }: CustomSuspensionDialogProps) { const { t } = useTranslation(["views/settings"]); const { data: config } = useSWR("config"); const [until, setUntil] = useState( () => new Date(Date.now() + ONE_HOUR_MS), ); const [calendarOpen, setCalendarOpen] = useState(false); useEffect(() => { if (open) setUntil(new Date(Date.now() + ONE_HOUR_MS)); }, [open]); const formattedDate = useFormattedTimestamp( isValidDate(until) ? Math.floor(until.getTime() / 1000) : 0, t("time.formattedTimestampMonthDayYear.24hour", { ns: "common" }), config?.ui.timezone, ); const isFuture = isValidDate(until) && until.getTime() > Date.now(); const handleApply = () => { if (!isFuture) return; onConfirm(Math.ceil((until.getTime() - Date.now()) / 60_000)); onOpenChange(false); }; return ( {t("notification.customSuspension.title")} {t("notification.customSuspension.description")}
{ if (!day) return; const next = new Date(day); const carry = isValidDate(until) ? until : new Date(); next.setHours( carry.getHours(), carry.getMinutes(), carry.getSeconds(), 0, ); setUntil(next); setCalendarOpen(false); }} /> { const [h, m] = e.target.value.split(":"); const hh = Number.parseInt(h ?? "", 10); const mm = Number.parseInt(m ?? "", 10); if (Number.isNaN(hh) || Number.isNaN(mm)) return; const base = isValidDate(until) ? until : new Date(); const next = new Date(base); next.setHours(hh, mm, 0, 0); setUntil(next); }} />
{!isFuture && (

{t("notification.customSuspension.invalidTime")}

)}
); }