import { baseUrl } from "@/api/baseUrl"; import TimeAgo from "../dynamic/TimeAgo"; import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; import { useCallback, useMemo, useState } from "react"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; import { ReviewSegment } from "@/types/review"; import { useNavigate } from "react-router-dom"; import { Skeleton } from "../ui/skeleton"; import { RecordingStartingPoint } from "@/types/record"; import axios from "axios"; type AnimatedEventCardProps = { event: ReviewSegment; }; export function AnimatedEventCard({ event }: AnimatedEventCardProps) { const { data: config } = useSWR("config"); // interaction const navigate = useNavigate(); const onOpenReview = useCallback(() => { navigate("review", { state: { severity: event.severity, recording: { camera: event.camera, startTime: event.start_time, severity: event.severity, } as RecordingStartingPoint, }, }); axios.post(`reviews/viewed`, { ids: [event.id] }); }, [navigate, event]); // image behavior const [loaded, setLoaded] = useState(false); const [error, setError] = useState(0); const imageUrl = useMemo(() => { if (error > 0) { return `${baseUrl}api/review/${event.id}/preview.gif?key=${error}`; } return `${baseUrl}api/review/${event.id}/preview.gif`; }, [error, event]); const aspectRatio = useMemo(() => { if (!config) { return 1; } const detect = config.cameras[event.camera].detect; return detect.width / detect.height; }, [config, event]); return (
setLoaded(true)} onError={() => { if (error < 2) { setError(error + 1); } }} /> {!loaded && }
{`${[...event.data.objects, ...event.data.audio].join(", ").replaceAll("-verified", "")} detected`}
); }