@@ -9,12 +9,80 @@ import { local } from "@/config";
99import { Environment , REACT_APP_ENV } from "@/shared/constants" ;
1010import config from "../../config" ;
1111
12+ const CACHE_SIZE_LIMIT = 104857600 ; // 100 MB
13+
1214interface FirebaseError extends Error {
1315 code : string ;
1416}
1517
1618const app = firebase . initializeApp ( config . firebase ) ;
19+ let db = firebase . firestore ( ) ;
20+
21+ enableUnlimitedCachePersistence ( ) ;
22+ // Function to handle Firestore persistence errors
23+ function handlePersistenceError ( err : any ) {
24+ if ( err . code === "failed-precondition" ) {
25+ console . log ( "Multiple tabs open or other conflict." ) ;
26+ } else if ( err . code === "unimplemented" ) {
27+ console . log ( "Persistence is not supported in this browser." ) ;
28+ } else if ( err . name === "QuotaExceededError" ) {
29+ console . log ( "Storage quota exceeded. Consider clearing cache." ) ;
30+ clearFirestoreCache ( ) ;
31+ } else {
32+ console . error ( "Error enabling persistence:" , err ) ;
33+ }
34+ }
35+
36+ function reinitializeFirestoreWithPersistence ( ) {
37+ db = firebase . firestore ( ) ; // Reinitialize Firestore instance
38+ const settings = { cacheSizeBytes : CACHE_SIZE_LIMIT } ;
39+ db . settings ( settings ) ;
40+
41+ db . enablePersistence ( { synchronizeTabs : true } )
42+ . then ( ( ) => {
43+ console . log ( "Persistence re-enabled." ) ;
44+ return ;
45+ } )
46+ . catch ( handlePersistenceError ) ;
47+ }
48+
49+ // Function to clear Firestore cache and re-enable persistence
50+ export function clearFirestoreCache ( ) {
51+ db . terminate ( )
52+ . then ( ( ) => {
53+ console . log ( "Firestore instance terminated." ) ;
54+ return db . clearPersistence ( ) ; // Safe to clear persistence now
55+ } )
56+ . then ( ( ) => {
57+ console . log ( "Persistence cleared. Waiting before reinitializing..." ) ;
58+ return new Promise ( ( resolve ) => setTimeout ( resolve , 2000 ) ) ; // Wait 2 second
59+ } )
60+ . then ( ( ) => {
61+ console . log ( "Cache cleared successfully." ) ;
62+ reinitializeFirestoreWithPersistence ( ) ; // Reinitialize Firestore
63+ window . location . reload ( ) ;
64+ return ;
65+ } )
66+ . catch ( ( err ) => {
67+ if ( err . code === "failed-precondition" ) {
68+ console . log ( "Cannot clear persistence: Firestore is still running." ) ;
69+ } else {
70+ console . error ( "Error clearing persistence cache:" , err ) ;
71+ }
72+ } ) ;
73+ }
74+
75+ // Enable Firestore persistence with unlimited cache size and error handling
76+ function enableUnlimitedCachePersistence ( ) {
77+ const settings = {
78+ cacheSizeBytes : CACHE_SIZE_LIMIT ,
79+ } ;
80+ db . settings ( settings ) ;
81+
82+ db . enablePersistence ( { synchronizeTabs : true } ) . catch ( handlePersistenceError ) ;
83+ }
1784
85+ // Enable persistence in the local environment (with Firestore and Auth emulators)
1886if ( REACT_APP_ENV === Environment . Local ) {
1987 firebase . auth ( ) . useEmulator ( local . firebase . authDomain ) ;
2088 firebase
@@ -23,16 +91,6 @@ if (REACT_APP_ENV === Environment.Local) {
2391 "localhost" ,
2492 Number ( local . firebase . databaseURL . split ( / : / g) [ 2 ] ) ,
2593 ) ;
26- } else {
27- firebase
28- . firestore ( )
29- . enablePersistence ( {
30- synchronizeTabs : true ,
31- experimentalForceOwningTab : false ,
32- } )
33- . catch ( ( error ) => {
34- console . error ( "Error enabling persistence" , error ) ;
35- } ) ;
3694}
3795
3896let perf ;
0 commit comments