import { LuCamera, LuCar, LuCat, LuCircle, LuCircleDot, LuDog, LuEar, LuPackage, LuPersonStanding, LuPlay, LuPlayCircle, LuTruck, } from "react-icons/lu"; import { GiDeer } from "react-icons/gi"; import { IoMdExit } from "react-icons/io"; import { MdFaceUnlock, MdOutlineLocationOn, MdOutlinePictureInPictureAlt, } from "react-icons/md"; import { FaBicycle } from "react-icons/fa"; import { endOfHourOrCurrentTime } from "./dateUtil"; export 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 "heard": return ; case "external": return ; } } /** * Get icon representing detection, either label specific or generic detection icon * @param timelineItem timeline item * @returns icon for label */ export function getTimelineDetectionIcon(timelineItem: Timeline) { switch (timelineItem.data.label) { case "bicycle": return ; case "car": return ; case "cat": return ; case "deer": return ; case "dog": return ; case "package": return ; case "person": return ; default: return ; } } export 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 "gone": return `${label} left`; case "heard": return `${label} heard`; case "external": return `${label} detected`; } } export function getChunkedTimeRange(timestamp: number) { const endOfThisHour = new Date(); endOfThisHour.setHours(endOfThisHour.getHours() + 1, 0, 0, 0); const data: { start: number; end: number }[] = []; const startDay = new Date(timestamp * 1000); startDay.setHours(0, 0, 0, 0); const startTimestamp = startDay.getTime() / 1000; let start = startDay.getTime() / 1000; let end = 0; for (let i = 0; i < 24; i++) { startDay.setHours(startDay.getHours() + 1); if (startDay > endOfThisHour) { break; } end = endOfHourOrCurrentTime(startDay.getTime() / 1000); data.push({ start, end, }); start = startDay.getTime() / 1000; } return { start: startTimestamp, end, ranges: data }; }