From cb5c093d1d0c1a44dcc4473957c35ab4fcc0df4a Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Tue, 12 Mar 2024 10:35:11 -0600 Subject: [PATCH] Use skeleton for gif loading --- .../image/AnimatedEventThumbnail.tsx | 37 ++++++++++++------- web/src/views/live/LiveDashboardView.tsx | 2 +- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/web/src/components/image/AnimatedEventThumbnail.tsx b/web/src/components/image/AnimatedEventThumbnail.tsx index 2489c89a0..40bddd46c 100644 --- a/web/src/components/image/AnimatedEventThumbnail.tsx +++ b/web/src/components/image/AnimatedEventThumbnail.tsx @@ -1,18 +1,17 @@ import { baseUrl } from "@/api/baseUrl"; import TimeAgo from "../dynamic/TimeAgo"; import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; -import { useCallback, useMemo } from "react"; -import { useApiHost } from "@/api"; +import { useCallback, useMemo, useState } from "react"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; import { ReviewSegment } from "@/types/review"; import { useNavigate } from "react-router-dom"; +import { Skeleton } from "../ui/skeleton"; type AnimatedEventThumbnailProps = { event: ReviewSegment; }; export function AnimatedEventThumbnail({ event }: AnimatedEventThumbnailProps) { - const apiHost = useApiHost(); const { data: config } = useSWR("config"); // interaction @@ -24,13 +23,15 @@ export function AnimatedEventThumbnail({ event }: AnimatedEventThumbnailProps) { // image behavior + const [loaded, setLoaded] = useState(false); + const [error, setError] = useState(0); const imageUrl = useMemo(() => { - if (Date.now() / 1000 < event.start_time + 20) { - return `${apiHost}api/preview/${event.camera}/${event.start_time}/thumbnail.jpg`; + if (error > 0) { + return `${baseUrl}api/review/${event.id}/preview.gif?key=${error}`; } return `${baseUrl}api/review/${event.id}/preview.gif`; - }, [apiHost, event]); + }, [error, event]); const aspectRatio = useMemo(() => { if (!config) { @@ -44,14 +45,22 @@ export function AnimatedEventThumbnail({ event }: AnimatedEventThumbnailProps) { return ( -
+
+ setLoaded(true)} + onError={() => { + if (error < 2) { + setError(error + 1); + } + }} + /> + {!loaded && }
diff --git a/web/src/views/live/LiveDashboardView.tsx b/web/src/views/live/LiveDashboardView.tsx index 0e50ae871..ffae25eab 100644 --- a/web/src/views/live/LiveDashboardView.tsx +++ b/web/src/views/live/LiveDashboardView.tsx @@ -117,7 +117,7 @@ export default function LiveDashboardView({ {events && events.length > 0 && ( -
+
{events.map((event) => { return ; })}