Show icons for what was detected

This commit is contained in:
Nicolas Mowen 2024-02-17 18:03:51 -07:00
parent 153a8be7c1
commit b2485d147c
3 changed files with 50 additions and 19 deletions

View File

@ -183,6 +183,13 @@ function PreviewContent({
if (relevantPreview && !isVisible) { if (relevantPreview && !isVisible) {
return <div />; return <div />;
} else if (!relevantPreview && isCurrentHour(startTs)) {
return (
<img
className="w-full"
src={`${apiHost}api/preview/${camera}/${startTs}/thumbnail.jpg`}
/>
);
} else if (!relevantPreview && !isCurrentHour(startTs)) { } else if (!relevantPreview && !isCurrentHour(startTs)) {
return ( return (
<img <img
@ -200,9 +207,6 @@ function PreviewContent({
muted: true, muted: true,
fluid: true, fluid: true,
loadingSpinner: false, loadingSpinner: false,
poster: relevantPreview
? ""
: `${apiHost}api/preview/${camera}/${startTs}/thumbnail.jpg`,
sources: relevantPreview sources: relevantPreview
? [ ? [
{ {

View File

@ -6,6 +6,7 @@ import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
import { FrigateConfig } from "@/types/frigateConfig"; import { FrigateConfig } from "@/types/frigateConfig";
import { ReviewSegment, ReviewSeverity } from "@/types/review"; import { ReviewSegment, ReviewSeverity } from "@/types/review";
import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; import { formatUnixTimestampToDateTime } from "@/utils/dateUtil";
import { getIconForLabel } from "@/utils/iconUtil";
import axios from "axios"; import axios from "axios";
import { useCallback, useMemo, useRef, useState } from "react"; import { useCallback, useMemo, useRef, useState } from "react";
import { LuCalendar, LuFilter, LuVideo } from "react-icons/lu"; import { LuCalendar, LuFilter, LuVideo } from "react-icons/lu";
@ -13,7 +14,7 @@ import { MdCircle } from "react-icons/md";
import useSWR from "swr"; import useSWR from "swr";
import useSWRInfinite from "swr/infinite"; import useSWRInfinite from "swr/infinite";
const API_LIMIT = 12; const API_LIMIT = 20;
export default function Events() { export default function Events() {
const { data: config } = useSWR<FrigateConfig>("config"); const { data: config } = useSWR<FrigateConfig>("config");
@ -83,7 +84,11 @@ export default function Events() {
// preview videos // preview videos
const previewTimes = useMemo(() => { const previewTimes = useMemo(() => {
if (!reviewPages) { if (
!reviewPages ||
reviewPages.length == 0 ||
reviewPages.at(-1)!!.length == 0
) {
return undefined; return undefined;
} }
@ -178,26 +183,26 @@ export default function Events() {
); );
return ( return (
<> <div key={value.id}>
<div <div
ref={lastRow ? lastReviewRef : null} ref={lastRow ? lastReviewRef : null}
key={value.id}
className="relative h-[234px] rounded-2xl overflow-hidden" className="relative h-[234px] rounded-2xl overflow-hidden"
style={{ style={{
aspectRatio: detectConfig.width / detectConfig.height, aspectRatio: detectConfig.width / detectConfig.height,
}} }}
> >
{relevantPreview ? ( <PreviewThumbnailPlayer
<PreviewThumbnailPlayer relevantPreview={relevantPreview}
relevantPreview={relevantPreview} camera={value.camera}
camera={value.camera} startTs={value.start_time}
startTs={value.start_time} isMobile={false}
isMobile={false} eventId=""
eventId="" />
/> {(severity == "alert" || severity == "detection") && (
) : ( <div className="absolute top-1 right-1 flex">
<div> {value.data.objects.map((object) => {
{value.camera} {value.data.objects} return getIconForLabel(object);
})}
</div> </div>
)} )}
<div className="absolute left-1 right-1 bottom-1 flex justify-between"> <div className="absolute left-1 right-1 bottom-1 flex justify-between">
@ -211,7 +216,7 @@ export default function Events() {
</div> </div>
</div> </div>
{lastRow && !isDone && <ActivityIndicator />} {lastRow && !isDone && <ActivityIndicator />}
</> </div>
); );
}); });
})} })}

View File

@ -0,0 +1,22 @@
import {
LuBox,
LuCar,
LuDog,
LuLassoSelect,
LuPersonStanding,
} from "react-icons/lu";
export function getIconForLabel(label: string, className?: string) {
switch (label) {
case "car":
return <LuCar className={className} />;
case "dog":
return <LuDog className={className} />;
case "package":
return <LuBox className={className} />;
case "person":
return <LuPersonStanding className={className} />;
default:
return <LuLassoSelect className={className} />;
}
}