import { isDesktop, isIOS } from "react-device-detect"; import { Sheet, SheetContent } from "../../ui/sheet"; import { Drawer, DrawerContent } from "../../ui/drawer"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; import { useFormattedTimestamp } from "@/hooks/use-date-utils"; import { getIconForLabel } from "@/utils/iconUtil"; import { useApiHost } from "@/api"; import { ReviewSegment } from "@/types/review"; import { Event } from "@/types/event"; import { useMemo } from "react"; type ReviewDetailDialogProps = { review?: ReviewSegment; setReview: (review: ReviewSegment | undefined) => void; }; export default function ReviewDetailDialog({ review, setReview, }: ReviewDetailDialogProps) { const { data: config } = useSWR("config", { revalidateOnFocus: false, }); const apiHost = useApiHost(); // data const { data: events } = useSWR( review ? ["event_ids", { ids: review.data.detections.join(",") }] : null, ); const hasMismatch = useMemo(() => { if (!review || !events) { return false; } return events.length != review?.data.detections.length; }, [review, events]); const formattedDate = useFormattedTimestamp( review?.start_time ?? 0, config?.ui.time_format == "24hour" ? "%b %-d %Y, %H:%M" : "%b %-d %Y, %I:%M %p", ); // content const Overlay = isDesktop ? Sheet : Drawer; const Content = isDesktop ? SheetContent : DrawerContent; return ( { if (!open) { setReview(undefined); } }} > {review && (
Camera
{review.camera.replaceAll("_", " ")}
Timestamp
{formattedDate}
Objects
{events?.map((event) => { return (
{getIconForLabel(event.label, "size-3 text-white")} {event.sub_label ?? event.label} ( {Math.round(event.data.top_score * 100)}%)
); })}
{review.data.zones.length > 0 && (
Zones
{review.data.zones.map((zone) => { return (
{zone.replaceAll("_", " ")}
); })}
)}
{hasMismatch && (
Some objects that were detected are not included in this list because the object does not have a snapshot
)}
{events?.map((event) => { return ( ); })}
)}
); }