From 9472c5224c9e52785ff3dd6d4998133f90a5f1df Mon Sep 17 00:00:00 2001 From: NlightN22 Date: Fri, 3 May 2024 14:39:29 +0700 Subject: [PATCH] fix open recordings from host --- src/services/frigate.proxy/frigate.api.ts | 5 +-- .../components/accordion/CameraAccordion.tsx | 26 +++++++++------ .../components/accordion/DayAccordion.tsx | 14 +++++--- .../components/accordion/DayAccordionItem.tsx | 13 ++++++-- .../accordion/DayEventsAccordion.tsx | 11 ++++++- src/shared/components/accordion/DayPanel.tsx | 12 ++++++- .../components/accordion/EventPanel.tsx | 32 +++++++++++-------- .../components/accordion/EventsAccordion.tsx | 14 ++++---- .../accordion/EventsAccordionItem.tsx | 12 ++++++- src/widgets/SelectedDayList.tsx | 9 ++++-- 10 files changed, 103 insertions(+), 45 deletions(-) diff --git a/src/services/frigate.proxy/frigate.api.ts b/src/services/frigate.proxy/frigate.api.ts index c8c0cc8..6b8ec98 100644 --- a/src/services/frigate.proxy/frigate.api.ts +++ b/src/services/frigate.proxy/frigate.api.ts @@ -101,7 +101,7 @@ export const proxyApi = { ) => instanceApi.get(`proxy/${hostName}/api/${cameraName}/recordings/summary`, { params: { timezone }, - timeout: 5 * 60 * 1000 + timeout: 5 * 60 * 1000, }).then(res => res.data), // E.g. http://127.0.0.1:5000/api/events?before=1708534799&after=1708448400&camera=CameraName&has_clip=1&include_thumbnails=0&limit=5000 @@ -130,7 +130,8 @@ export const proxyApi = { limit: limit, min_score: minScore, max_score: maxScore, - } + }, + timeout: 5 * 60 * 1000, }).then(res => res.data), getEventsSummary: (hostName: string, cameraName: string) => diff --git a/src/shared/components/accordion/CameraAccordion.tsx b/src/shared/components/accordion/CameraAccordion.tsx index 5764be2..a22fa0f 100644 --- a/src/shared/components/accordion/CameraAccordion.tsx +++ b/src/shared/components/accordion/CameraAccordion.tsx @@ -18,7 +18,7 @@ interface CameraAccordionProps { const CameraAccordion = ({ camera -} : CameraAccordionProps ) => { +}: CameraAccordionProps) => { const { t } = useTranslation() const { recordingsStore: recStore } = useContext(Context) @@ -35,14 +35,22 @@ const CameraAccordion = ({ } }) - const recodItem = (record: RecordSummary) => ( - - {t('day')}: {record.day} - - - - - ) + const recodItem = (record: RecordSummary) => { + if (host) { + return ( + + {t('day')}: {record.day} + + + + + ) + } + } const days = useMemo(() => { if (recordings && camera) { diff --git a/src/shared/components/accordion/DayAccordion.tsx b/src/shared/components/accordion/DayAccordion.tsx index 348d008..bf26cea 100644 --- a/src/shared/components/accordion/DayAccordion.tsx +++ b/src/shared/components/accordion/DayAccordion.tsx @@ -6,21 +6,25 @@ import { mapHostToHostname } from '../../../services/frigate.proxy/frigate.api'; import { RecordSummary } from '../../../types/record'; import { isProduction } from '../../env.const'; import DayAccordionItem from './DayAccordionItem'; +import { GetCameraWHostWConfig, GetFrigateHost } from '../../../services/frigate.proxy/frigate.schema'; interface RecordingAccordionProps { - recordSummary?: RecordSummary, + recordSummary?: RecordSummary + host: GetFrigateHost + camera: GetCameraWHostWConfig } const DayAccordionItemMemo = React.memo(DayAccordionItem) const DayAccordion = ({ recordSummary, + host, + camera }: RecordingAccordionProps) => { const { recordingsStore: recStore } = useContext(Context) const [openedValue, setOpenedValue] = useState() - const camera = recStore.filteredCamera - const hostName = mapHostToHostname(recStore.filteredHost) + const hostName = mapHostToHostname(host) const handleOpenPlayer = useCallback((value?: string) => { if (recStore.playedItem !== value) { @@ -32,11 +36,13 @@ const DayAccordion = ({ }, [openedValue, recStore]); const dayItems = useMemo(() => { - if (recordSummary && recordSummary.hours.length > 0) { + if (recordSummary && recordSummary.hours.length > 0 && hostName && host) { return recordSummary.hours.map(hour => { const played = recordSummary.day + hour.hour === recStore.playedItem; return ( void, + camera: GetCameraWHostWConfig + host: GetFrigateHost } const DayAccordionItem = ({ @@ -28,7 +31,9 @@ const DayAccordionItem = ({ hostName, cameraName, played, - openPlayer + openPlayer, + camera, + host }: DayAccordionItemProps) => { const { t } = useTranslation() const navigate = useNavigate() @@ -92,6 +97,8 @@ const DayAccordionItem = ({ import('./EventsAccordion')) interface DayEventsAccordionProps { day: string, hour: string, qty?: number, + camera: GetCameraWHostWConfig + host: GetFrigateHost } const DayEventsAccordion = ({ day, hour, qty, + camera, + host, }: DayEventsAccordionProps) => { const { t } = useTranslation() const [openedItem, setOpenedItem] = useState() @@ -27,7 +32,11 @@ const DayEventsAccordion = ({ {openedItem === hour ? - + : <> } diff --git a/src/shared/components/accordion/DayPanel.tsx b/src/shared/components/accordion/DayPanel.tsx index 88b4d3f..a3f1d8d 100644 --- a/src/shared/components/accordion/DayPanel.tsx +++ b/src/shared/components/accordion/DayPanel.tsx @@ -3,6 +3,7 @@ import VideoDownloader from '../../../widgets/VideoDownloader'; import VideoPlayer from '../players/VideoPlayer'; import DayEventsAccordion from './DayEventsAccordion'; import { useTranslation } from 'react-i18next'; +import { GetCameraWHostWConfig, GetFrigateHost } from '../../../services/frigate.proxy/frigate.schema'; interface DayPanelProps { day: string, @@ -14,6 +15,8 @@ interface DayPanelProps { playedURL?: string, startUnixTime: number, endUnixTime: number, + camera: GetCameraWHostWConfig + host: GetFrigateHost } const DayPanel = ({ @@ -26,6 +29,8 @@ const DayPanel = ({ playedURL, startUnixTime, endUnixTime, + camera, + host }: DayPanelProps) => { const { t } = useTranslation() return ( @@ -42,7 +47,12 @@ const DayPanel = ({ : ''} {events > 0 ? - + :
{t('notHaveEvents')}
} diff --git a/src/shared/components/accordion/EventPanel.tsx b/src/shared/components/accordion/EventPanel.tsx index 1aa6601..71e58b2 100644 --- a/src/shared/components/accordion/EventPanel.tsx +++ b/src/shared/components/accordion/EventPanel.tsx @@ -1,4 +1,4 @@ -import { Button, Flex, Text } from '@mantine/core'; +import { Button, Flex, Group, Text } from '@mantine/core'; import { IconExternalLink } from '@tabler/icons-react'; import { proxyApi } from '../../../services/frigate.proxy/frigate.api'; import { EventFrigate } from '../../../types/event'; @@ -26,12 +26,23 @@ const EventPanel = ({ <> {playedURL && playedURL === videoURL ? : <>} - {!hostName ? <> : - + + {t('camera')}: + {event.camera} + + + {t('player.startTime')}: + {unixTimeToDate(event.start_time)} + + + {t('player.duration')}: + {getDurationFromTimestamps(event.start_time, event.end_time)} + + {!event.data?.score ? <> : + + {t('player.rating')}: + {(event.data.score * 100).toFixed(2)}% + } {!hostName ? '' : @@ -46,13 +57,6 @@ const EventPanel = ({ } - {t('camera')}: {event.camera} - {t('player.object')}: {event.label} - {t('player.startTime')}: {unixTimeToDate(event.start_time)} - {t('player.duration')}: {getDurationFromTimestamps(event.start_time, event.end_time)} - {!event.data?.score? <> : - {t('player.rating')}: {(event.data.score * 100).toFixed(2)}% - } diff --git a/src/shared/components/accordion/EventsAccordion.tsx b/src/shared/components/accordion/EventsAccordion.tsx index 1430461..c8b1f56 100644 --- a/src/shared/components/accordion/EventsAccordion.tsx +++ b/src/shared/components/accordion/EventsAccordion.tsx @@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite'; import { useContext, useState } from 'react'; import { Context } from '../../..'; import { frigateQueryKeys, mapHostToHostname, proxyApi } from '../../../services/frigate.proxy/frigate.api'; -import { getEventsQuerySchema } from '../../../services/frigate.proxy/frigate.schema'; +import { GetCameraWHostWConfig, GetFrigateHost, getEventsQuerySchema } from '../../../services/frigate.proxy/frigate.schema'; import { getUnixTime } from '../../utils/dateUtil'; import RetryError from '../RetryError'; import EventsAccordionItem from './EventsAccordionItem'; @@ -16,10 +16,10 @@ import EventsAccordionItem from './EventsAccordionItem'; * @param hostName proxy format, e.g hostName: localhost:4000 */ interface EventsAccordionProps { - day?: string, - hour?: string, - cameraName?: string - hostName?: string + day: string, + hour: string, + camera: GetCameraWHostWConfig + host: GetFrigateHost } /** @@ -31,13 +31,13 @@ interface EventsAccordionProps { const EventsAccordion = ({ day, hour, + camera, + host, }: EventsAccordionProps) => { const { recordingsStore: recStore } = useContext(Context) const [openedItem, setOpenedItem] = useState() - const host = recStore.filteredHost const hostName = mapHostToHostname(host) - const camera = recStore.filteredCamera const isRequiredParams = host && camera const { data, isPending, isError, refetch } = useQuery({ diff --git a/src/shared/components/accordion/EventsAccordionItem.tsx b/src/shared/components/accordion/EventsAccordionItem.tsx index b38a8e7..52ecfe5 100644 --- a/src/shared/components/accordion/EventsAccordionItem.tsx +++ b/src/shared/components/accordion/EventsAccordionItem.tsx @@ -11,6 +11,7 @@ import { useNavigate } from 'react-router-dom'; import { routesPath } from '../../../router/routes.path'; import { proxyApi } from '../../../services/frigate.proxy/frigate.api'; import { useTranslation } from 'react-i18next'; +import BlobImage from '../images/BlobImage'; interface EventsAccordionItemProps { @@ -44,7 +45,8 @@ const EventsAccordionItem = ({ const duration = getDurationFromTimestamps(event.start_time, event.end_time) return ( - {t('player.object')}: {event.label} + {t('player.object')}: + {event.label} {time} {duration ? {duration} @@ -77,6 +79,14 @@ const EventsAccordionItem = ({ + {!hostName ? <> : + + } {eventLabel(event)} diff --git a/src/widgets/SelectedDayList.tsx b/src/widgets/SelectedDayList.tsx index 2ef6b92..2da83ca 100644 --- a/src/widgets/SelectedDayList.tsx +++ b/src/widgets/SelectedDayList.tsx @@ -26,7 +26,7 @@ const SelectedDayList = ({ queryFn: async () => { if (camera && host) { const hostName = mapHostToHostname(host) - if (hostName){ + if (hostName) { return proxyApi.getRecordingsSummary(hostName, camera.name, getResolvedTimeZone()) } } @@ -44,14 +44,17 @@ const SelectedDayList = ({ if (!data) return Not have response from server const stringDay = dateToQueryString(day) - const recordingsDay = data.find(record => record.day === stringDay) + const recordingsDay = data.find(record => record.day === stringDay) if (!recordingsDay) return
Not have record at {stringDay}
if (!isProduction) console.log('SelectedDayList rendered') return ( {host.name} / {camera.name} / {stringDay} - + ); };