diff --git a/src/components/TableToolbar/Filters/Filters.tsx b/src/components/TableToolbar/Filters/Filters.tsx index 48ce54ef0..2dbb450cd 100644 --- a/src/components/TableToolbar/Filters/Filters.tsx +++ b/src/components/TableToolbar/Filters/Filters.tsx @@ -42,6 +42,7 @@ import { analytics, logEvent } from "@src/analytics"; import type { TableFilter } from "@src/types/table"; import { generateId } from "@src/utils/table"; import { useFilterUrl } from "./useFilterUrl"; +import { isEqual } from "lodash-es"; const shouldDisableApplyButton = (queries: any) => { for (let query of queries) { @@ -255,10 +256,7 @@ export default function Filters() { // If the filter in URL is not the same as currently applied local filter // then update the user filter. useEffect(() => { - if ( - filtersUrl && - JSON.stringify(filtersUrl) !== JSON.stringify(appliedFilters) - ) { + if (filtersUrl && !isEqual(filtersUrl, appliedFilters)) { setUserFilters(filtersUrl); setOverrideTableFilters(true); } diff --git a/src/components/TableToolbar/Filters/useFilterUrl.tsx b/src/components/TableToolbar/Filters/useFilterUrl.tsx index 6f008b611..e5b4b7fba 100644 --- a/src/components/TableToolbar/Filters/useFilterUrl.tsx +++ b/src/components/TableToolbar/Filters/useFilterUrl.tsx @@ -1,6 +1,9 @@ +import { tableFiltersAtom, tableScope } from "@src/atoms/tableScope"; import { TableFilter } from "@src/types/table"; +import { useAtom } from "jotai"; +import { isEqual } from "lodash-es"; import { useSnackbar } from "notistack"; -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import { useSearchParams } from "react-router-dom"; function isTableFilter(filter: any): filter is TableFilter { @@ -16,7 +19,7 @@ function isTableFilter(filter: any): filter is TableFilter { export function useFilterUrl() { const [searchParams, setSearchParams] = useSearchParams(); const { enqueueSnackbar } = useSnackbar(); - const [filters, setFilters] = useState(null); + const [filters, setFilters] = useAtom(tableFiltersAtom, tableScope); // Fetch filter from URL and update user filter useEffect(() => { @@ -32,8 +35,7 @@ export function useFilterUrl() { for (const _filter of _filters) { if (!isTableFilter(_filter)) throw new Error("Invalid Filter"); } - - setFilters(_filters); + if (!isEqual(_filters, filters)) setFilters(_filters); } catch (err) { enqueueSnackbar("Oops, filter in URL is incorrect!!!", { variant: "error", diff --git a/src/sources/ProjectSourceFirebase/init.ts b/src/sources/ProjectSourceFirebase/init.ts index af3682357..ae8d82a4b 100644 --- a/src/sources/ProjectSourceFirebase/init.ts +++ b/src/sources/ProjectSourceFirebase/init.ts @@ -4,7 +4,8 @@ import { getAuth, connectAuthEmulator } from "firebase/auth"; import { initializeFirestore, connectFirestoreEmulator, - enableMultiTabIndexedDbPersistence, + persistentLocalCache, + persistentMultipleTabManager, } from "firebase/firestore"; import { getStorage, connectStorageEmulator } from "firebase/storage"; import { getFunctions } from "firebase/functions"; @@ -59,10 +60,12 @@ export const firebaseAuthAtom = atom((get) => { export const firebaseDbAtom = atom((get) => { const db = initializeFirestore(get(firebaseAppAtom), { ignoreUndefinedProperties: true, + localCache: persistentLocalCache({ + tabManager: persistentMultipleTabManager(), + }), }); if (!(window as any).firebaseDbStarted) { if (envConnectEmulators) connectFirestoreEmulator(db, "localhost", 9299); - else enableMultiTabIndexedDbPersistence(db); (window as any).firebaseDbStarted = true; } return db;