From 1b73917ba3da9a1d1c8f09e8aedb23eaa85da6c0 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Tue, 26 Mar 2024 10:13:14 -0600 Subject: [PATCH] Fix loading of images --- web/src/components/card/ReviewCard.tsx | 13 ++++++++-- .../indicators/ImageLoadingIndicator.tsx | 20 ++++++++++++++++ .../player/PreviewThumbnailPlayer.tsx | 19 ++++----------- web/src/views/events/RecordingView.tsx | 24 ++++++++++++------- 4 files changed, 51 insertions(+), 25 deletions(-) create mode 100644 web/src/components/indicators/ImageLoadingIndicator.tsx diff --git a/web/src/components/card/ReviewCard.tsx b/web/src/components/card/ReviewCard.tsx index 546409538..1b0922d33 100644 --- a/web/src/components/card/ReviewCard.tsx +++ b/web/src/components/card/ReviewCard.tsx @@ -7,6 +7,8 @@ import { isSafari } from "react-device-detect"; import useSWR from "swr"; import TimeAgo from "../dynamic/TimeAgo"; import { useMemo } from "react"; +import useImageLoaded from "@/hooks/use-image-loaded"; +import ImageLoadingIndicator from "../indicators/ImageLoadingIndicator"; type ReviewCardProps = { event: ReviewSegment; @@ -19,6 +21,7 @@ export default function ReviewCard({ onClick, }: ReviewCardProps) { const { data: config } = useSWR("config"); + const [imgRef, imgLoaded, onImgLoad] = useImageLoaded(); const formattedDate = useFormattedTimestamp( event.start_time, config?.ui.time_format == "24hour" ? "%H:%M" : "%I:%M %p", @@ -28,17 +31,23 @@ export default function ReviewCard({ [event, currentTime], ); + if (event.data.objects.includes("car")) { + //console.log(`failed to load ${JSON.stringify(event)}`); + } + return (
+ { - //onImgLoad(); + onImgLoad(); }} />
diff --git a/web/src/components/indicators/ImageLoadingIndicator.tsx b/web/src/components/indicators/ImageLoadingIndicator.tsx new file mode 100644 index 000000000..32531ea2b --- /dev/null +++ b/web/src/components/indicators/ImageLoadingIndicator.tsx @@ -0,0 +1,20 @@ +import { isSafari } from "react-device-detect"; +import { Skeleton } from "../ui/skeleton"; + +export default function ImageLoadingIndicator({ + className, + imgLoaded, +}: { + className?: string; + imgLoaded: boolean; +}) { + if (imgLoaded) { + return; + } + + return isSafari ? ( +
+ ) : ( + + ); +} diff --git a/web/src/components/player/PreviewThumbnailPlayer.tsx b/web/src/components/player/PreviewThumbnailPlayer.tsx index 3c11d79c0..95b6bd6b2 100644 --- a/web/src/components/player/PreviewThumbnailPlayer.tsx +++ b/web/src/components/player/PreviewThumbnailPlayer.tsx @@ -17,9 +17,9 @@ import { isFirefox, isMobile, isSafari } from "react-device-detect"; import Chip from "@/components/indicators/Chip"; import { useFormattedTimestamp } from "@/hooks/use-date-utils"; import useImageLoaded from "@/hooks/use-image-loaded"; -import { Skeleton } from "../ui/skeleton"; import { useSwipeable } from "react-swipeable"; import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; +import ImageLoadingIndicator from "../indicators/ImageLoadingIndicator"; type PreviewPlayerProps = { review: ReviewSegment; @@ -187,7 +187,10 @@ export default function PreviewThumbnailPlayer({ />
)} - +
); } - -function PreviewPlaceholder({ imgLoaded }: { imgLoaded: boolean }) { - if (imgLoaded) { - return; - } - - return isSafari ? ( -
- ) : ( - - ); -} diff --git a/web/src/views/events/RecordingView.tsx b/web/src/views/events/RecordingView.tsx index 4f023231f..b7479f3f7 100644 --- a/web/src/views/events/RecordingView.tsx +++ b/web/src/views/events/RecordingView.tsx @@ -277,7 +277,7 @@ export function RecordingView({
- {mainCameraReviewItems.map((review) => ( - setCurrentTime(review.start_time)} - /> - ))} + {mainCameraReviewItems.map((review) => { + if (review.severity == "significant_motion") { + return; + } + + return ( + setCurrentTime(review.start_time)} + /> + ); + })}
); }