From 82ad64143f2da23537e522c1cbf9707c06128227 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Sat, 30 Dec 2023 13:45:42 -0700 Subject: [PATCH] More work on youtube view --- web/src/components/card/TimelineItemCard.tsx | 40 +++++++++++-- web/src/views/history/HistoryTimelineView.tsx | 58 +++++++++++-------- 2 files changed, 70 insertions(+), 28 deletions(-) diff --git a/web/src/components/card/TimelineItemCard.tsx b/web/src/components/card/TimelineItemCard.tsx index 4bd6a2e83..550cb6e92 100644 --- a/web/src/components/card/TimelineItemCard.tsx +++ b/web/src/components/card/TimelineItemCard.tsx @@ -4,21 +4,51 @@ import Logo from "../Logo"; import { formatUnixTimestampToDateTime } from "@/utils/dateUtil"; import useSWR from "swr"; import { FrigateConfig } from "@/types/frigateConfig"; +import VideoPlayer from "../player/VideoPlayer"; +import { Card } from "../ui/card"; type TimelineItemCardProps = { timeline: Timeline; relevantPreview: Preview | undefined; + onSelect: () => void; }; export default function TimelineItemCard({ timeline, relevantPreview, + onSelect, }: TimelineItemCardProps) { const { data: config } = useSWR("config"); return ( -
-
-
+ +
+ {relevantPreview && ( + { + player.pause(); // autoplay + pause is required for iOS + player.currentTime(timeline.timestamp - relevantPreview.start); + }} + /> + )} +
+
{getTimelineItemDescription(timeline)}
@@ -31,7 +61,7 @@ export default function TimelineItemCard({ })}
-
+ ); } diff --git a/web/src/views/history/HistoryTimelineView.tsx b/web/src/views/history/HistoryTimelineView.tsx index 349a29988..143eccad8 100644 --- a/web/src/views/history/HistoryTimelineView.tsx +++ b/web/src/views/history/HistoryTimelineView.tsx @@ -106,14 +106,10 @@ export default function HistoryTimelineView({ }, [playbackTimes]); const onSelectItem = useCallback( - (data: { items: number[] }) => { - if (data.items.length > 0) { - const selected = data.items[0]; - setFocusedItem( - playback.timelineItems.find( - (timeline) => timeline.timestamp == selected - ) - ); + (timeline: Timeline | undefined) => { + if (timeline) { + setFocusedItem(timeline); + const selected = timeline.timestamp; playerRef.current?.pause(); let seekSeconds = 0; @@ -135,6 +131,8 @@ export default function HistoryTimelineView({ return true; }); playerRef.current?.currentTime(seekSeconds); + } else { + setFocusedItem(undefined); } }, [annotationOffset, recordings, playerRef] @@ -197,7 +195,6 @@ export default function HistoryTimelineView({ hasRelevantPreview={hasRelevantPreview} scrubbing={scrubbing} focusedItem={focusedItem} - setFocusedItem={setFocusedItem} setSeeking={setSeeking} onSelectItem={onSelectItem} onScrubTime={onScrubTime} @@ -218,7 +215,6 @@ export default function HistoryTimelineView({ hasRelevantPreview={hasRelevantPreview} scrubbing={scrubbing} focusedItem={focusedItem} - setFocusedItem={setFocusedItem} setSeeking={setSeeking} onSelectItem={onSelectItem} onScrubTime={onScrubTime} @@ -238,9 +234,8 @@ type DesktopViewProps = { hasRelevantPreview: boolean; scrubbing: boolean; focusedItem: Timeline | undefined; - setFocusedItem: (item: Timeline | undefined) => void; setSeeking: (seeking: boolean) => void; - onSelectItem: ({ items }: { items: number[] }) => void; + onSelectItem: (timeline: Timeline | undefined) => void; onScrubTime: ({ time }: { time: Date }) => void; onStopScrubbing: ({ time }: { time: Date }) => void; }; @@ -255,7 +250,6 @@ function DesktopView({ hasRelevantPreview, scrubbing, focusedItem, - setFocusedItem, setSeeking, onSelectItem, onScrubTime, @@ -275,7 +269,8 @@ function DesktopView({ preload: "auto", autoplay: true, fluid: false, - height: "320", + height: "608", + width: "1080", sources: [ { src: playbackUri, @@ -288,7 +283,7 @@ function DesktopView({ playerRef.current = player; player.currentTime(timelineTime - playbackTimes.start); player.on("playing", () => { - setFocusedItem(undefined); + onSelectItem(undefined); }); }} onDispose={() => { @@ -331,13 +326,14 @@ function DesktopView({ )} -
+
{playback.timelineItems.map((timeline) => { return ( onSelectItem(timeline)} /> ); })} @@ -346,7 +342,7 @@ function DesktopView({
{playback != undefined && ( { + if (data.items.length > 0) { + const selected = data.items[0]; + onSelectItem( + playback.timelineItems.find( + (timeline) => timeline.timestamp == selected + ) + ); + } + }} /> )}
@@ -378,9 +383,8 @@ type MobileViewProps = { hasRelevantPreview: boolean; scrubbing: boolean; focusedItem: Timeline | undefined; - setFocusedItem: (item: Timeline | undefined) => void; setSeeking: (seeking: boolean) => void; - onSelectItem: ({ items }: { items: number[] }) => void; + onSelectItem: (timeline: Timeline | undefined) => void; onScrubTime: ({ time }: { time: Date }) => void; onStopScrubbing: ({ time }: { time: Date }) => void; }; @@ -395,7 +399,6 @@ function MobileView({ hasRelevantPreview, scrubbing, focusedItem, - setFocusedItem, setSeeking, onSelectItem, onScrubTime, @@ -425,7 +428,7 @@ function MobileView({ playerRef.current = player; player.currentTime(timelineTime - playbackTimes.start); player.on("playing", () => { - setFocusedItem(undefined); + onSelectItem(undefined); }); }} onDispose={() => { @@ -491,7 +494,16 @@ function MobileView({ }} timechangeHandler={onScrubTime} timechangedHandler={onStopScrubbing} - selectHandler={onSelectItem} + selectHandler={(data) => { + if (data.items.length > 0) { + const selected = data.items[0]; + onSelectItem( + playback.timelineItems.find( + (timeline) => timeline.timestamp == selected + ) + ); + } + }} /> )}