fix camera change and update recordings list

save main page host filter
This commit is contained in:
NlightN22 2024-05-03 13:09:49 +07:00
parent fee4394c10
commit 2f72689f4e
10 changed files with 52 additions and 27 deletions

View File

@ -16,9 +16,9 @@ import { useTranslation } from 'react-i18next';
const MainPage = () => { const MainPage = () => {
const { t } = useTranslation() const { t } = useTranslation()
const executed = useRef(false) const executed = useRef(false)
const { sideBarsStore } = useContext(Context) const { sideBarsStore, mainStore } = useContext(Context)
const { selectedHostId } = mainStore
const [searchQuery, setSearchQuery] = useState<string>() const [searchQuery, setSearchQuery] = useState<string>()
const [selectedHostId, setSelectedHostId] = useState<string>()
const [filteredCameras, setFilteredCameras] = useState<GetCameraWHostWConfig[]>() const [filteredCameras, setFilteredCameras] = useState<GetCameraWHostWConfig[]>()
const { data: cameras, isPending, isError, refetch } = useQuery({ const { data: cameras, isPending, isError, refetch } = useQuery({
@ -79,7 +79,7 @@ const MainPage = () => {
if (isError) return <RetryErrorPage onRetry={refetch} /> if (isError) return <RetryErrorPage onRetry={refetch} />
const handleSelectHost = (hostId: string) => { const handleSelectHost = (hostId: string) => {
setSelectedHostId(hostId) mainStore.selectedHostId = hostId
} }
return ( return (

View File

@ -54,6 +54,7 @@ const RecordingsPage = () => {
recStore.selectedRange = [parsedStartDay, parsedEndDay] recStore.selectedRange = [parsedStartDay, parsedEndDay]
} }
executed.current = true executed.current = true
if (!isProduction) console.log('RecordingsPage rendered first time')
return () => { return () => {
sideBarsStore.setRightChildren(null) sideBarsStore.setRightChildren(null)
sideBarsStore.rightVisible = false sideBarsStore.rightVisible = false

View File

@ -1,4 +1,4 @@
import { Accordion, Center, Loader } from '@mantine/core'; import { Accordion, Center, Loader, Text } from '@mantine/core';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { observer } from 'mobx-react-lite'; import { observer } from 'mobx-react-lite';
import { useContext, useMemo } from 'react'; import { useContext, useMemo } from 'react';
@ -10,16 +10,22 @@ import { isProduction } from '../../env.const';
import { getResolvedTimeZone, parseQueryDateToDate } from '../../utils/dateUtil'; import { getResolvedTimeZone, parseQueryDateToDate } from '../../utils/dateUtil';
import RetryError from '../RetryError'; import RetryError from '../RetryError';
import DayAccordion from './DayAccordion'; import DayAccordion from './DayAccordion';
import { GetCameraWHostWConfig } from '../../../services/frigate.proxy/frigate.schema';
const CameraAccordion = () => { interface CameraAccordionProps {
camera: GetCameraWHostWConfig
}
const CameraAccordion = ({
camera
} : CameraAccordionProps ) => {
const { t } = useTranslation() const { t } = useTranslation()
const { recordingsStore: recStore } = useContext(Context) const { recordingsStore: recStore } = useContext(Context)
const camera = recStore.openedCamera || recStore.filteredCamera
const host = recStore.filteredHost const host = recStore.filteredHost
const hostName = mapHostToHostname(host) const hostName = mapHostToHostname(host)
const { data, isPending, isError, refetch } = useQuery({ const { data: recordings, isPending, isError, refetch } = useQuery({
queryKey: [frigateQueryKeys.getRecordingsSummary, camera?.id], queryKey: [frigateQueryKeys.getRecordingsSummary, camera?.id],
queryFn: () => { queryFn: () => {
if (camera && hostName) { if (camera && hostName) {
@ -39,10 +45,10 @@ const CameraAccordion = () => {
) )
const days = useMemo(() => { const days = useMemo(() => {
if (data && camera) { if (recordings && camera) {
const [startDate, endDate] = recStore.selectedRange const [startDate, endDate] = recStore.selectedRange
if (startDate && endDate) { if (startDate && endDate) {
return data return recordings
.filter(rec => { .filter(rec => {
const parsedRecDate = parseQueryDateToDate(rec.day) const parsedRecDate = parseQueryDateToDate(rec.day)
if (parsedRecDate) { if (parsedRecDate) {
@ -53,22 +59,23 @@ const CameraAccordion = () => {
.map(rec => recodItem(rec)) .map(rec => recodItem(rec))
} }
if ((startDate && endDate) || (!startDate && !endDate)) { if ((startDate && endDate) || (!startDate && !endDate)) {
return data.map(rec => recodItem(rec)) return recordings.map(rec => recodItem(rec))
} }
} }
return [] return []
}, [data, recStore.selectedRange]) }, [recordings, recStore.selectedRange])
if (isPending) return <Center><Loader /></Center> if (isPending) return <Center><Loader /></Center>
if (isError) return <RetryError onRetry={refetch} /> if (isError) return <RetryError onRetry={refetch} />
if (!data || !camera) return null if (!recordings || !camera) return null
if (!isProduction) console.log('camera', camera) if (!isProduction) console.log('camera', camera)
if (!isProduction) console.log('data', data) if (!isProduction) console.log('data', recordings)
if (!isProduction) console.log('hostName', hostName) if (!isProduction) console.log('hostName', hostName)
if (!isProduction) console.log('CameraAccordion rendered') if (!isProduction) console.log('CameraAccordion rendered')
return ( return (
<Accordion variant='separated' radius="md" w='100%'> <Accordion variant='separated' radius="md" w='100%'>
{days} {days}

View File

@ -19,7 +19,7 @@ const DayAccordion = ({
const { recordingsStore: recStore } = useContext(Context) const { recordingsStore: recStore } = useContext(Context)
const [openedValue, setOpenedValue] = useState<string>() const [openedValue, setOpenedValue] = useState<string>()
const camera = recStore.openedCamera || recStore.filteredCamera const camera = recStore.filteredCamera
const hostName = mapHostToHostname(recStore.filteredHost) const hostName = mapHostToHostname(recStore.filteredHost)
const handleOpenPlayer = useCallback((value?: string) => { const handleOpenPlayer = useCallback((value?: string) => {

View File

@ -37,7 +37,7 @@ const EventsAccordion = ({
const host = recStore.filteredHost const host = recStore.filteredHost
const hostName = mapHostToHostname(host) const hostName = mapHostToHostname(host)
const camera = recStore.openedCamera || recStore.filteredCamera const camera = recStore.filteredCamera
const isRequiredParams = host && camera const isRequiredParams = host && camera
const { data, isPending, isError, refetch } = useQuery({ const { data, isPending, isError, refetch } = useQuery({

View File

@ -0,0 +1,16 @@
import { makeAutoObservable } from "mobx";
export class MainStore {
private _selectedHostId: string | undefined
public get selectedHostId(): string | undefined {
return this._selectedHostId;
}
public set selectedHostId(value: string | undefined) {
this._selectedHostId = value;
}
constructor() {
makeAutoObservable(this)
}
}

View File

@ -62,11 +62,12 @@ export class RecordingsStore {
this._selectedRange = value this._selectedRange = value
} }
private _openedCamera: GetCameraWHostWConfig | undefined // TODO Delete
public get openedCamera(): GetCameraWHostWConfig | undefined { // private _openedCamera: GetCameraWHostWConfig | undefined
return this._openedCamera // public get openedCamera(): GetCameraWHostWConfig | undefined {
} // return this._openedCamera
public set openedCamera(value: GetCameraWHostWConfig | undefined) { // }
this._openedCamera = value // public set openedCamera(value: GetCameraWHostWConfig | undefined) {
} // this._openedCamera = value
// }
} }

View File

@ -1,14 +1,17 @@
import { MainStore } from "./main.store";
import { ModalStore } from "./modal.store"; import { ModalStore } from "./modal.store";
import { RecordingsStore } from "./recordings.store"; import { RecordingsStore } from "./recordings.store";
import { SideBarsStore } from "./sidebars.store"; import { SideBarsStore } from "./sidebars.store";
import { UserStore } from "./user.store"; import { UserStore } from "./user.store";
class RootStore { class RootStore {
mainStore: MainStore
userStore: UserStore userStore: UserStore
modalStore: ModalStore modalStore: ModalStore
sideBarsStore: SideBarsStore sideBarsStore: SideBarsStore
recordingsStore: RecordingsStore recordingsStore: RecordingsStore
constructor() { constructor() {
this.mainStore = new MainStore()
this.userStore = new UserStore() this.userStore = new UserStore()
this.modalStore = new ModalStore(this) this.modalStore = new ModalStore(this)
this.sideBarsStore = new SideBarsStore() this.sideBarsStore = new SideBarsStore()

View File

@ -32,13 +32,11 @@ const SelectedCameraList = () => {
if (!camera || !camera?.frigateHost) return null if (!camera || !camera?.frigateHost) return null
recStore.openedCamera = camera
return ( return (
<Flex w='100%' h='100%' direction='column' align='center'> <Flex w='100%' h='100%' direction='column' align='center'>
<Text>{camera.frigateHost.name} / {camera.name}</Text> <Text>{camera.frigateHost.name} / {camera.name}</Text>
<Suspense> <Suspense>
<CameraAccordion /> <CameraAccordion camera={camera} />
</Suspense> </Suspense>
</Flex> </Flex>
) )

View File

@ -32,7 +32,6 @@ const SelectedHostList = ({
const handleOnChange = (cameraId: string | null) => { const handleOnChange = (cameraId: string | null) => {
setOpenCameraId(openCameraId === cameraId ? null : cameraId) setOpenCameraId(openCameraId === cameraId ? null : cameraId)
recStore.openedCamera = camerasQuery?.find( camera => camera.id === cameraId)
} }
const handleRetry = () => { const handleRetry = () => {
@ -51,7 +50,7 @@ const SelectedHostList = ({
<Accordion.Panel key={camera.id + 'Panel'}> <Accordion.Panel key={camera.id + 'Panel'}>
{openCameraId === camera.id && ( {openCameraId === camera.id && (
<Suspense> <Suspense>
<CameraAccordion /> <CameraAccordion camera={camera} />
</Suspense> </Suspense>
)} )}
</Accordion.Panel> </Accordion.Panel>