From 1538743d77681ae8cee8fb8937e6a31fd6bc06ec Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Tue, 16 Apr 2024 15:44:04 -0600 Subject: [PATCH] Pull id search key and open recordings to review item --- web/src/hooks/use-overlay-state.tsx | 29 ++++++++++++++++++++++++++++- web/src/pages/Events.tsx | 20 +++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/web/src/hooks/use-overlay-state.tsx b/web/src/hooks/use-overlay-state.tsx index c2f2a0f85..656b61bda 100644 --- a/web/src/hooks/use-overlay-state.tsx +++ b/web/src/hooks/use-overlay-state.tsx @@ -1,4 +1,4 @@ -import { useCallback, useMemo } from "react"; +import { useCallback, useEffect, useMemo } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import { usePersistence } from "./use-persistence"; @@ -91,3 +91,30 @@ export function useHashState(): [ return [hash, setHash]; } + +export function useSearchEffect( + key: string, + callback: (value: string) => void, +) { + const location = useLocation(); + + const param = useMemo(() => { + if (!location || !location.search || location.search.length == 0) { + return undefined; + } + + const params = location.search.substring(1).split("&"); + + return params + .find((p) => p.includes("=") && p.split("=")[0] == key) + ?.split("="); + }, [location, key]); + + useEffect(() => { + if (!param) { + return; + } + + callback(param[1]); + }, [param, callback]); +} diff --git a/web/src/pages/Events.tsx b/web/src/pages/Events.tsx index 6277c6994..0cc3cd6b5 100644 --- a/web/src/pages/Events.tsx +++ b/web/src/pages/Events.tsx @@ -1,7 +1,7 @@ import ActivityIndicator from "@/components/indicators/activity-indicator"; import useApiFilter from "@/hooks/use-api-filter"; import { useTimezone } from "@/hooks/use-date-utils"; -import { useOverlayState } from "@/hooks/use-overlay-state"; +import { useOverlayState, useSearchEffect } from "@/hooks/use-overlay-state"; import { FrigateConfig } from "@/types/frigateConfig"; import { Preview } from "@/types/preview"; import { RecordingStartingPoint } from "@/types/record"; @@ -33,6 +33,24 @@ export default function Events() { const [recording, setRecording] = useOverlayState("recording"); + useSearchEffect("id", (reviewId: string) => { + axios + .get(`review/${reviewId}`) + .then((resp) => { + if (resp.status == 200 && resp.data) { + setRecording( + { + camera: resp.data.camera, + startTime: resp.data.start_time, + severity: resp.data.severity, + }, + true, + ); + } + }) + .catch(() => {}); + }); + const [startTime, setStartTime] = useState(); useEffect(() => {