import { useMemo, useState } from "react"; import { Button } from "../ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"; import { SelectSeparator } from "../ui/select"; import { TimeRange } from "@/types/timeline"; import { useFormattedTimestamp } from "@/hooks/use-date-utils"; import { getUTCOffset } from "@/utils/dateUtil"; import { TimezoneAwareCalendar } from "./ReviewActivityCalendar"; import { FaArrowRight, FaCalendarAlt } from "react-icons/fa"; import { isDesktop, isIOS } from "react-device-detect"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; import { useTranslation } from "react-i18next"; type CustomTimeSelectorProps = { latestTime: number; range?: TimeRange; setRange: (range: TimeRange | undefined) => void; startLabel: string; endLabel: string; }; export function CustomTimeSelector({ latestTime, range, setRange, startLabel, endLabel, }: CustomTimeSelectorProps) { const { t } = useTranslation(["common"]); const { data: config } = useSWR("config"); // times const timezoneOffset = useMemo( () => config?.ui.timezone ? Math.round(getUTCOffset(new Date(), config.ui.timezone)) : undefined, [config?.ui.timezone], ); const localTimeOffset = useMemo( () => Math.round( getUTCOffset( new Date(), Intl.DateTimeFormat().resolvedOptions().timeZone, ), ), [], ); const startTime = useMemo(() => { let time = range?.after || latestTime - 3600; if (timezoneOffset) { time = time + (timezoneOffset - localTimeOffset) * 60; } return time; }, [range, latestTime, timezoneOffset, localTimeOffset]); const endTime = useMemo(() => { let time = range?.before || latestTime; if (timezoneOffset) { time = time + (timezoneOffset - localTimeOffset) * 60; } return time; }, [range, latestTime, timezoneOffset, localTimeOffset]); const formattedStart = useFormattedTimestamp( startTime, config?.ui.time_format == "24hour" ? t("time.formattedTimestamp.24hour") : t("time.formattedTimestamp.12hour"), ); const formattedEnd = useFormattedTimestamp( endTime, config?.ui.time_format == "24hour" ? t("time.formattedTimestamp.24hour") : t("time.formattedTimestamp.12hour"), ); const startClock = useMemo(() => { const date = new Date(startTime * 1000); return `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date.getSeconds().toString().padStart(2, "0")}`; }, [startTime]); const endClock = useMemo(() => { const date = new Date(endTime * 1000); return `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date.getSeconds().toString().padStart(2, "0")}`; }, [endTime]); // calendars const [startOpen, setStartOpen] = useState(false); const [endOpen, setEndOpen] = useState(false); return (
{ if (!open) { setStartOpen(false); } }} > { if (!day) { return; } setRange({ before: endTime, after: day.getTime() / 1000 + 1, }); }} /> { const clock = e.target.value; const [hour, minute, second] = isIOS ? [...clock.split(":"), "00"] : clock.split(":"); const start = new Date(startTime * 1000); start.setHours( parseInt(hour), parseInt(minute), parseInt(second ?? 0), 0, ); setRange({ before: endTime, after: start.getTime() / 1000, }); }} /> { if (!open) { setEndOpen(false); } }} > { if (!day) { return; } setRange({ after: startTime, before: day.getTime() / 1000, }); }} /> { const clock = e.target.value; const [hour, minute, second] = isIOS ? [...clock.split(":"), "00"] : clock.split(":"); const end = new Date(endTime * 1000); end.setHours( parseInt(hour), parseInt(minute), parseInt(second ?? 0), 0, ); setRange({ before: end.getTime() / 1000, after: startTime, }); }} />
); }