import TimeAgo from "../dynamic/TimeAgo"; import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; import { useCallback, useEffect, useMemo, useState } from "react"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; import { REVIEW_PADDING, ReviewSegment } from "@/types/review"; import { useNavigate } from "react-router-dom"; import { RecordingStartingPoint } from "@/types/record"; import axios from "axios"; import { VideoPreview } from "../player/PreviewThumbnailPlayer"; import { isCurrentHour } from "@/utils/dateUtil"; import { useCameraPreviews } from "@/hooks/use-camera-previews"; import { baseUrl } from "@/api/baseUrl"; type AnimatedEventCardProps = { event: ReviewSegment; }; export function AnimatedEventCard({ event }: AnimatedEventCardProps) { const { data: config } = useSWR("config"); const currentHour = useMemo(() => isCurrentHour(event.start_time), [event]); const initialTimeRange = useMemo(() => { return { after: Math.round(event.start_time), before: Math.round(event.end_time || event.start_time + 20), }; }, [event]); // preview const previews = useCameraPreviews(initialTimeRange, { camera: event.camera, fetchPreviews: !currentHour, }); // visibility const [windowVisible, setWindowVisible] = useState(true); const visibilityListener = useCallback(() => { setWindowVisible(document.visibilityState == "visible"); }, []); useEffect(() => { addEventListener("visibilitychange", visibilityListener); return () => { removeEventListener("visibilitychange", visibilityListener); }; }, [visibilityListener]); // interaction const navigate = useNavigate(); const onOpenReview = useCallback(() => { navigate("review", { state: { severity: event.severity, recording: { camera: event.camera, startTime: event.start_time - REVIEW_PADDING, severity: event.severity, } as RecordingStartingPoint, }, }); axios.post(`reviews/viewed`, { ids: [event.id] }); }, [navigate, event]); // image behavior const aspectRatio = useMemo(() => { if (!config) { return 1; } const detect = config.cameras[event.camera].detect; return detect.width / detect.height; }, [config, event]); return (
{previews ? ( {}} setIgnoreClick={() => {}} isPlayingBack={() => {}} windowVisible={windowVisible} /> ) : (
{`${[ ...new Set([ ...(event.data.objects || []), ...(event.data.sub_labels || []), ...(event.data.audio || []), ]), ] .filter((item) => item !== undefined && !item.includes("-verified")) .map((text) => text.charAt(0).toUpperCase() + text.substring(1)) .sort() .join(", ") .replaceAll("-verified", "")} detected`}
); }