From 95ceff69ea8696b196d3f4ec74f97550b94bfdd9 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Fri, 1 Mar 2024 08:32:10 -0700 Subject: [PATCH] Get actions looking good on mobile and desktop --- .../components/filter/ReviewActionGroup.tsx | 67 ++++++----- .../player/PreviewThumbnailPlayer.tsx | 109 +----------------- web/src/views/events/EventView.tsx | 24 ---- 3 files changed, 42 insertions(+), 158 deletions(-) diff --git a/web/src/components/filter/ReviewActionGroup.tsx b/web/src/components/filter/ReviewActionGroup.tsx index 779ac757a..1453792f8 100644 --- a/web/src/components/filter/ReviewActionGroup.tsx +++ b/web/src/components/filter/ReviewActionGroup.tsx @@ -2,6 +2,7 @@ import { LuCheckSquare, LuFileUp, LuTrash } from "react-icons/lu"; import { useCallback } from "react"; import axios from "axios"; import { Button } from "../ui/button"; +import { isDesktop } from "react-device-detect"; type ReviewActionGroupProps = { selectedReviews: string[]; @@ -34,43 +35,47 @@ export default function ReviewActionGroup({ }, [selectedReviews, setSelectedReviews, pullLatestData]); return ( -
-
{`${selectedReviews.length} selected | `}
- - {selectedReviews.length == 1 && ( +
+
+
{`${selectedReviews.length} selected | `}
+ +
+
+ {selectedReviews.length == 1 && ( + + )} - )} - - + +
); } diff --git a/web/src/components/player/PreviewThumbnailPlayer.tsx b/web/src/components/player/PreviewThumbnailPlayer.tsx index 980773242..5a8dacedd 100644 --- a/web/src/components/player/PreviewThumbnailPlayer.tsx +++ b/web/src/components/player/PreviewThumbnailPlayer.tsx @@ -13,18 +13,8 @@ import { getIconForLabel, getIconForSubLabel } from "@/utils/iconUtil"; import TimeAgo from "../dynamic/TimeAgo"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; -import { isDesktop, isFirefox, isMobile, isSafari } from "react-device-detect"; +import { isFirefox, isMobile, isSafari } from "react-device-detect"; import Chip from "../Chip"; -import { - ContextMenu, - ContextMenuContent, - ContextMenuItem, - ContextMenuSeparator, - ContextMenuTrigger, -} from "../ui/context-menu"; -import { LuCheckCheck, LuCheckSquare, LuFileUp, LuTrash } from "react-icons/lu"; -import { RiCheckboxMultipleLine } from "react-icons/ri"; -import axios from "axios"; import { useFormattedTimestamp } from "@/hooks/use-date-utils"; import useImageLoaded from "@/hooks/use-image-loaded"; import { Skeleton } from "../ui/skeleton"; @@ -35,7 +25,6 @@ type PreviewPlayerProps = { allPreviews?: Preview[]; onTimeUpdate?: React.Dispatch>; setReviewed: (reviewId: string) => void; - markAboveReviewed: () => void; onClick: (reviewId: string, ctrl: boolean) => void; }; @@ -51,7 +40,6 @@ export default function PreviewThumbnailPlayer({ review, allPreviews, setReviewed, - markAboveReviewed, onClick, onTimeUpdate, }: PreviewPlayerProps) { @@ -166,19 +154,15 @@ export default function PreviewThumbnailPlayer({ config?.ui.time_format == "24hour" ? "%b %-d, %H:%M" : "%b %-d, %I:%M %p", ); - const previewContent = ( + return (
onPlayback(true)} onMouseLeave={isMobile ? undefined : () => onPlayback(false)} - onContextMenu={ - isDesktop - ? undefined - : (e) => { - e.preventDefault(); - onClick(review.id, true); - } - } + onContextMenu={(e) => { + e.preventDefault(); + onClick(review.id, true); + }} onClick={handleOnClick} {...swipeHandlers} > @@ -242,22 +226,6 @@ export default function PreviewThumbnailPlayer({ )}
); - - if (isDesktop) { - return ( - - {previewContent} - onClick(review.id, true)} - setReviewed={handleSetReviewed} - markAboveReviewed={markAboveReviewed} - /> - - ); - } - - return previewContent; } type PreviewContentProps = { @@ -624,71 +592,6 @@ function InProgressPreview({ ); } -type PreviewContextItemsProps = { - review: ReviewSegment; - onSelect: () => void; - setReviewed: () => void; - markAboveReviewed: () => void; -}; -function PreviewContextItems({ - review, - onSelect, - setReviewed, - markAboveReviewed, -}: PreviewContextItemsProps) { - const exportReview = useCallback(() => { - axios.post( - `export/${review.camera}/start/${review.start_time}/end/${review.end_time}`, - { playback: "realtime" }, - ); - }, [review]); - - const deleteReview = useCallback(() => { - axios.delete(`reviews/${review.id}`); - }, [review]); - - return ( - - {isMobile && ( - -
- Select - -
-
- )} - -
- Mark Above as Reviewed - -
-
- - {!review.has_been_reviewed && ( - (setReviewed ? setReviewed() : null)}> -
- Mark As Reviewed - -
-
- )} - -
- Export - -
-
- - -
- Delete - -
-
-
- ); -} - function PreviewPlaceholder({ imgLoaded }: { imgLoaded: boolean }) { if (imgLoaded) { return; diff --git a/web/src/views/events/EventView.tsx b/web/src/views/events/EventView.tsx index d5d230741..9889a6d6c 100644 --- a/web/src/views/events/EventView.tsx +++ b/web/src/views/events/EventView.tsx @@ -223,29 +223,6 @@ export default function EventView({ [selectedReviews, setSelectedReviews], ); - const markScrolledItemsAsReviewed = useCallback(async () => { - if (!currentItems) { - return; - } - - const scrolled: string[] = []; - - currentItems.find((value) => { - if (value.start_time > minimapBounds.end) { - scrolled.push(value.id); - return false; - } else { - return true; - } - }); - - const idList = scrolled.join(","); - - await axios.post(`reviews/${idList}/viewed`); - setSelectedReviews([]); - pullLatestData(); - }, [currentItems, minimapBounds]); - const exportReview = useCallback( (id: string) => { const review = currentItems?.find((seg) => seg.id == id); @@ -366,7 +343,6 @@ export default function EventView({ allPreviews={relevantPreviews} setReviewed={markItemAsReviewed} onTimeUpdate={setPreviewTime} - markAboveReviewed={markScrolledItemsAsReviewed} onClick={onSelectReview} />