mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-08 20:25:26 +03:00
Show icons for what was detected
This commit is contained in:
parent
153a8be7c1
commit
b2485d147c
@ -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
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
})}
|
})}
|
||||||
|
|||||||
22
web/src/utils/iconUtil.tsx
Normal file
22
web/src/utils/iconUtil.tsx
Normal 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} />;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user