From 82998eb2eaf7f27c20efd52c66ddbbd9cf515e5b Mon Sep 17 00:00:00 2001 From: NlightN22 Date: Sat, 1 Feb 2025 15:45:39 +0700 Subject: [PATCH] add backend filters --- src/pages/MainPage.tsx | 32 ++++++++----------- src/services/frigate.proxy/frigate.api.ts | 11 ++++++- src/shared/components/CamerasTransferList.tsx | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/pages/MainPage.tsx b/src/pages/MainPage.tsx index c0b5af3..33b30aa 100644 --- a/src/pages/MainPage.tsx +++ b/src/pages/MainPage.tsx @@ -42,10 +42,21 @@ const MainPage = () => { if (!isProduction) console.log('Realmuser:', realmUser) const { data: cameras, isPending, isError, refetch } = useQuery({ - queryKey: [frigateQueryKeys.getCamerasWHost], - queryFn: frigateApi.getCamerasWHost + queryKey: [frigateQueryKeys.getCamerasWHost, selectedHostId, searchQuery, selectedTags], + queryFn: () => + frigateApi.getCamerasWHost({ + name: searchQuery, // filter by camera name + frigateHostId: selectedHostId, // filter by host id + tagIds: selectedTags, // filter by tag id(s) + // offset and limit can be added later for pagination + }), }) + useEffect(() => { + setFilteredCameras(cameras || []); + setVisibleCameras([]); // reset visible cameras for pagination + }, [cameras]); + useEffect(() => { const pageSize = 20; if (inView && filteredCameras.length > visibleCameras.length) { @@ -75,23 +86,6 @@ const MainPage = () => { return () => setRightChildren(null); }, []); - useEffect(() => { - if (!cameras) { - setFilteredCameras([]) - return - } - - const filterCameras = (camera: GetCameraWHostWConfig) => { - const matchesHostId = selectedHostId ? camera.frigateHost?.id === selectedHostId : true - const matchesSearchQuery = searchQuery ? camera.name.toLowerCase().includes(searchQuery.toLowerCase()) : true - const matchesTags = selectedTags ? selectedTags.length === 0 || camera.tags.some(tag => selectedTags.includes(tag.id)) : true - return matchesHostId && matchesSearchQuery && matchesTags - } - - setFilteredCameras(cameras.filter(filterCameras)) - setVisibleCameras([]) - }, [searchQuery, cameras, selectedHostId, selectedTags]) - const debouncedHandleSearchQuery = useDebounce((value: string) => { mainStore.setSearchQuery(value, navigate); diff --git a/src/services/frigate.proxy/frigate.api.ts b/src/services/frigate.proxy/frigate.api.ts index 068a39a..c845999 100644 --- a/src/services/frigate.proxy/frigate.api.ts +++ b/src/services/frigate.proxy/frigate.api.ts @@ -46,7 +46,16 @@ export const frigateApi = { getHost: (id: string) => instanceApi.get(`apiv1/frigate-hosts/${id}`).then(res => res.data), getCameraById: (cameraId: string) => instanceApi.get(`apiv1/cameras/${cameraId}`).then(res => res.data), getCamerasByHostId: (hostId: string) => instanceApi.get(`apiv1/cameras/host/${hostId}`).then(res => res.data), - getCamerasWHost: () => instanceApi.get(`apiv1/cameras`).then(res => res.data), + getCamerasWHost: (params: { + name?: string | null | undefined; + frigateHostId?: string | null | undefined; + tagIds?: string | string[]; + offset?: number; + limit?: number; + } = {}) => + instanceApi + .get('apiv1/cameras', { params }) + .then(res => res.data), getCameraWHost: (id: string) => instanceApi.get(`apiv1/cameras/${id}`).then(res => res.data), putHosts: (hosts: PutFrigateHost[]) => instanceApi.put('apiv1/frigate-hosts', hosts).then(res => res.data), deleteHosts: (hosts: DeleteFrigateHost[]) => instanceApi.delete('apiv1/frigate-hosts', { data: hosts }).then(res => res.data), diff --git a/src/shared/components/CamerasTransferList.tsx b/src/shared/components/CamerasTransferList.tsx index 8ff5d92..ea8efa1 100644 --- a/src/shared/components/CamerasTransferList.tsx +++ b/src/shared/components/CamerasTransferList.tsx @@ -18,7 +18,7 @@ const CamerasTransferList = ({ const queryClient = useQueryClient() const { data: cameras, isPending, isError, refetch } = useQuery({ queryKey: [frigateQueryKeys.getCamerasWHost, roleId], - queryFn: frigateApi.getCamerasWHost + queryFn: () => frigateApi.getCamerasWHost() }) const [lists, setLists] = useState<[TransferListItem[], TransferListItem[]]>([[], []])