don't refetch timeline

This commit is contained in:
Josh Hawkins 2025-10-07 07:25:58 -05:00
parent 5dc4b779f4
commit 950d8e74f5
4 changed files with 23 additions and 13 deletions

View File

@ -18,6 +18,7 @@ type ObjectTrackOverlayProps = {
videoHeight: number; videoHeight: number;
className?: string; className?: string;
onSeekToTime?: (timestamp: number) => void; onSeekToTime?: (timestamp: number) => void;
objectTimeline?: ObjectLifecycleSequence[];
}; };
export default function ObjectTrackOverlay({ export default function ObjectTrackOverlay({
@ -28,17 +29,10 @@ export default function ObjectTrackOverlay({
videoHeight, videoHeight,
className, className,
onSeekToTime, onSeekToTime,
objectTimeline,
}: ObjectTrackOverlayProps) { }: ObjectTrackOverlayProps) {
const { data: config } = useSWR<FrigateConfig>("config"); const { data: config } = useSWR<FrigateConfig>("config");
// Fetch timeline data for the selected object
const { data: objectTimeline } = useSWR<ObjectLifecycleSequence[]>([
"timeline",
{
source_id: selectedObjectId,
},
]);
// Fetch the full event data to get saved path points // Fetch the full event data to get saved path points
const { data: eventData } = useSWR(["event_ids", { ids: selectedObjectId }]); const { data: eventData } = useSWR(["event_ids", { ids: selectedObjectId }]);
@ -158,9 +152,8 @@ export default function ObjectTrackOverlay({
return pathPoints.map((point) => { return pathPoints.map((point) => {
// Find the corresponding timeline entry for this point // Find the corresponding timeline entry for this point
const timelineEntry = objectTimeline?.find( const timelineEntry = objectTimeline?.find(
(entry) => Math.abs(entry.timestamp - point.timestamp) < 0.1, (entry) => entry.timestamp == point.timestamp,
); );
return { return {
x: point.x * videoWidth, x: point.x * videoWidth,
y: point.y * videoHeight, y: point.y * videoHeight,

View File

@ -77,8 +77,13 @@ export default function HlsVideoPlayer({
}: HlsVideoPlayerProps) { }: HlsVideoPlayerProps) {
const { t } = useTranslation("components/player"); const { t } = useTranslation("components/player");
const { data: config } = useSWR<FrigateConfig>("config"); const { data: config } = useSWR<FrigateConfig>("config");
const { selectedObjectId, currentTime, camera, isActivityMode } = const {
useActivityStream(); selectedObjectId,
selectedObjectTimeline,
currentTime,
camera,
isActivityMode,
} = useActivityStream();
// playback // playback
@ -327,6 +332,7 @@ export default function HlsVideoPlayer({
onSeekToTime(timestamp); onSeekToTime(timestamp);
} }
}} }}
objectTimeline={selectedObjectTimeline}
/> />
</div> </div>
)} )}

View File

@ -1,7 +1,9 @@
import React, { createContext, useContext, useState } from "react"; import React, { createContext, useContext, useState, useMemo } from "react";
import { ObjectLifecycleSequence } from "@/types/timeline";
interface ActivityStreamContextType { interface ActivityStreamContextType {
selectedObjectId: string | undefined; selectedObjectId: string | undefined;
selectedObjectTimeline: ObjectLifecycleSequence[] | undefined;
currentTime: number; currentTime: number;
camera: string; camera: string;
setSelectedObjectId: (id: string | undefined) => void; setSelectedObjectId: (id: string | undefined) => void;
@ -17,6 +19,7 @@ interface ActivityStreamProviderProps {
isActivityMode: boolean; isActivityMode: boolean;
currentTime: number; currentTime: number;
camera: string; camera: string;
timelineData: ObjectLifecycleSequence[];
} }
export function ActivityStreamProvider({ export function ActivityStreamProvider({
@ -24,13 +27,20 @@ export function ActivityStreamProvider({
isActivityMode, isActivityMode,
currentTime, currentTime,
camera, camera,
timelineData,
}: ActivityStreamProviderProps) { }: ActivityStreamProviderProps) {
const [selectedObjectId, setSelectedObjectId] = useState< const [selectedObjectId, setSelectedObjectId] = useState<
string | undefined string | undefined
>(); >();
const selectedObjectTimeline = useMemo(() => {
if (!selectedObjectId || !timelineData) return undefined;
return timelineData.filter((item) => item.source_id === selectedObjectId);
}, [timelineData, selectedObjectId]);
const value: ActivityStreamContextType = { const value: ActivityStreamContextType = {
selectedObjectId, selectedObjectId,
selectedObjectTimeline,
currentTime, currentTime,
camera, camera,
setSelectedObjectId, setSelectedObjectId,

View File

@ -571,6 +571,7 @@ export function RecordingView({
isActivityMode={timelineType === "activity"} isActivityMode={timelineType === "activity"}
currentTime={currentTime} currentTime={currentTime}
camera={mainCamera} camera={mainCamera}
timelineData={timelineData}
> >
<div ref={contentRef} className="flex size-full flex-col pt-2"> <div ref={contentRef} className="flex size-full flex-col pt-2">
<Toaster closeButton={true} /> <Toaster closeButton={true} />