fix camera change and update recordings list
save main page host filter
This commit is contained in:
parent
fee4394c10
commit
2f72689f4e
@ -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 (
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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) => {
|
||||||
|
|||||||
@ -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({
|
||||||
|
|||||||
16
src/shared/stores/main.store.ts
Normal file
16
src/shared/stores/main.store.ts
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
@ -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()
|
||||||
|
|||||||
@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user