import useSWR from "swr"; import PreviewThumbnailPlayer from "../player/PreviewThumbnailPlayer"; import { Card } from "../ui/card"; import { FrigateConfig } from "@/types/frigateConfig"; import ActivityIndicator from "../ui/activity-indicator"; import { LuCircle, LuClock, LuPlay, LuPlayCircle, LuTruck, } from "react-icons/lu"; import { IoMdExit } from "react-icons/io"; import { MdFaceUnlock, MdOutlineLocationOn, MdOutlinePictureInPictureAlt, } from "react-icons/md"; import { HiOutlineVideoCamera } from "react-icons/hi"; import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; type HistoryCardProps = { timeline: Card; relevantPreview?: Preview; shouldAutoPlay: boolean; }; export default function HistoryCard({ relevantPreview, timeline, shouldAutoPlay, }: HistoryCardProps) { const { data: config } = useSWR("config"); if (!config) { return ; } return (
{formatUnixTimestampToDateTime(timeline.time, { strftime_fmt: config.ui.time_format == "24hour" ? "%H:%M:%S" : "%I:%M:%S", })}
{timeline.camera.replaceAll("_", " ")}
Activity:
{Object.entries(timeline.entries).map(([_, entry]) => { return (
{getTimelineIcon(entry)} {getTimelineItemDescription(entry)}
); })}
); } function getTimelineIcon(timelineItem: Timeline) { switch (timelineItem.class_type) { case "visible": return ; case "gone": return ; case "active": return ; case "stationary": return ; case "entered_zone": return ; case "attribute": switch (timelineItem.data.attribute) { case "face": return ; case "license_plate": return ; default: return ; } case "sub_label": switch (timelineItem.data.label) { case "person": return ; case "car": return ; } } } function getTimelineItemDescription(timelineItem: Timeline) { const label = ( (Array.isArray(timelineItem.data.sub_label) ? timelineItem.data.sub_label[0] : timelineItem.data.sub_label) || timelineItem.data.label ).replaceAll("_", " "); switch (timelineItem.class_type) { case "visible": return `${label} detected`; case "entered_zone": return `${label} entered ${timelineItem.data.zones .join(" and ") .replaceAll("_", " ")}`; case "active": return `${label} became active`; case "stationary": return `${label} became stationary`; case "attribute": { let title = ""; if ( timelineItem.data.attribute == "face" || timelineItem.data.attribute == "license_plate" ) { title = `${timelineItem.data.attribute.replaceAll( "_", " " )} detected for ${label}`; } else { title = `${ timelineItem.data.sub_label } recognized as ${timelineItem.data.attribute.replaceAll("_", " ")}`; } return title; } case "sub_label": return `${timelineItem.data.label} recognized as ${timelineItem.data.sub_label}`; case "gone": return `${label} left`; } }