@umituz/react-native-firebase 3.0.2 → 3.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/package.json +7 -1
  2. package/src/domains/account-deletion/index.ts +15 -10
  3. package/src/domains/account-deletion/infrastructure/services/account-deletion.service.ts +226 -26
  4. package/src/domains/account-deletion/infrastructure/services/reauthentication.service.ts +160 -0
  5. package/src/domains/auth/domain/value-objects/FirebaseAuthConfig.ts +1 -1
  6. package/src/domains/auth/index.ts +156 -6
  7. package/src/domains/auth/infrastructure/config/FirebaseAuthClient.ts +60 -48
  8. package/src/domains/auth/infrastructure/config/initializers/FirebaseAuthInitializer.ts +41 -5
  9. package/src/domains/auth/presentation/hooks/useGoogleOAuth.ts +115 -20
  10. package/src/domains/firestore/domain/constants/QuotaLimits.ts +101 -0
  11. package/src/domains/firestore/domain/entities/QuotaMetrics.ts +26 -0
  12. package/src/domains/firestore/domain/entities/RequestLog.ts +28 -0
  13. package/src/domains/firestore/domain/services/QuotaCalculator.ts +71 -0
  14. package/src/domains/firestore/index.ts +86 -28
  15. package/src/domains/firestore/infrastructure/config/FirestoreClient.ts +92 -19
  16. package/src/domains/firestore/infrastructure/config/initializers/FirebaseFirestoreInitializer.ts +249 -4
  17. package/src/domains/firestore/infrastructure/middleware/QueryDeduplicationMiddleware.ts +312 -0
  18. package/src/domains/firestore/infrastructure/middleware/QuotaTrackingMiddleware.ts +95 -0
  19. package/src/domains/firestore/infrastructure/repositories/BasePaginatedRepository.ts +7 -1
  20. package/src/domains/firestore/infrastructure/repositories/BaseQueryRepository.ts +34 -8
  21. package/src/domains/firestore/infrastructure/repositories/BaseRepository.ts +48 -9
  22. package/src/domains/firestore/infrastructure/services/RequestLoggerService.ts +165 -0
  23. package/src/domains/firestore/presentation/hooks/index.ts +10 -0
  24. package/src/domains/firestore/presentation/hooks/useFirestoreMutation.ts +1 -1
  25. package/src/domains/firestore/presentation/hooks/useFirestoreQuery.ts +1 -1
  26. package/src/domains/firestore/presentation/hooks/useSmartFirestoreSnapshot.ts +361 -0
  27. package/src/domains/firestore/presentation/query-keys/createFirestoreKeys.ts +32 -0
  28. package/src/domains/firestore/presentation/query-keys/index.ts +1 -0
  29. package/src/domains/firestore/utils/deduplication/pending-query-manager.util.ts +119 -0
  30. package/src/domains/firestore/utils/deduplication/query-key-generator.util.ts +34 -0
  31. package/src/domains/firestore/utils/deduplication/timer-manager.util.ts +83 -0
  32. package/src/index.ts +2 -30
  33. package/src/shared/domain/utils/calculation.util.ts +305 -17
  34. package/src/shared/domain/utils/error-handlers/error-messages.ts +0 -11
  35. package/src/shared/domain/utils/index.ts +5 -0
  36. package/src/shared/infrastructure/config/base/ClientStateManager.ts +82 -0
  37. package/src/shared/infrastructure/config/base/ServiceClientSingleton.ts +136 -20
  38. package/src/shared/infrastructure/config/clients/FirebaseClientSingleton.ts +1 -1
  39. package/src/shared/infrastructure/config/initializers/FirebaseAppInitializer.ts +9 -0
  40. package/src/shared/infrastructure/config/services/FirebaseInitializationService.ts +1 -1
  41. package/src/shared/infrastructure/config/state/FirebaseClientState.ts +14 -36
  42. package/src/application/auth/index.ts +0 -10
  43. package/src/application/auth/use-cases/index.ts +0 -6
  44. package/src/domains/account-deletion/domain/index.ts +0 -8
  45. package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor.ts +0 -79
  46. package/src/domains/account-deletion/infrastructure/services/AccountDeletionTypes.ts +0 -32
  47. package/src/domains/auth/domain.ts +0 -16
  48. package/src/domains/auth/infrastructure/config/index.ts +0 -2
  49. package/src/domains/auth/infrastructure/config/initializers/index.ts +0 -1
  50. package/src/domains/auth/infrastructure/services/index.ts +0 -16
  51. package/src/domains/auth/infrastructure/services/utils/index.ts +0 -1
  52. package/src/domains/auth/infrastructure/stores/index.ts +0 -1
  53. package/src/domains/auth/infrastructure/utils/index.ts +0 -1
  54. package/src/domains/auth/infrastructure.ts +0 -11
  55. package/src/domains/auth/presentation/hooks/useAppleAuth.ts +0 -82
  56. package/src/domains/auth/presentation.ts +0 -31
  57. package/src/domains/firestore/domain/entities/Collection.ts +0 -122
  58. package/src/domains/firestore/domain/entities/CollectionFactory.ts +0 -55
  59. package/src/domains/firestore/domain/entities/CollectionHelpers.ts +0 -143
  60. package/src/domains/firestore/domain/entities/CollectionUtils.ts +0 -72
  61. package/src/domains/firestore/domain/entities/CollectionValidation.ts +0 -138
  62. package/src/domains/firestore/domain/index.ts +0 -61
  63. package/src/domains/firestore/domain/value-objects/QueryOptions.ts +0 -143
  64. package/src/domains/firestore/domain/value-objects/QueryOptionsFactory.ts +0 -95
  65. package/src/domains/firestore/domain/value-objects/QueryOptionsHelpers.ts +0 -110
  66. package/src/domains/firestore/domain/value-objects/WhereClause.ts +0 -114
  67. package/src/domains/firestore/domain/value-objects/WhereClauseFactory.ts +0 -101
  68. package/src/domains/firestore/domain/value-objects/WhereClauseHelpers.ts +0 -123
  69. package/src/domains/firestore/domain/value-objects/WhereClauseValidation.ts +0 -83
  70. package/src/shared/infrastructure/base/ErrorHandler.ts +0 -81
  71. package/src/shared/infrastructure/base/ServiceBase.ts +0 -62
  72. package/src/shared/infrastructure/base/TypedGuard.ts +0 -131
  73. package/src/shared/infrastructure/base/index.ts +0 -34
  74. package/src/shared/types/firebase.types.ts +0 -274
@@ -1,36 +1,24 @@
1
1
  /**
2
2
  * React Native Firestore Module
3
3
  * Domain-Driven Design (DDD) Architecture
4
- *
5
- * IMPORTANT: This package does NOT import from 'firebase/firestore' or 'firebase/auth'.
6
- * Import those directly in your app using the firebase SDK if you need types.
7
- *
8
- * This package provides utilities and repositories ONLY.
9
4
  */
10
5
 
11
- // =============================================================================
12
- // DOMAIN LAYER - Business Logic
13
- // =============================================================================
14
-
15
- export * from './domain';
16
-
17
- // =============================================================================
18
- // INFRASTRUCTURE LAYER - Implementation
19
- // =============================================================================
20
-
21
- // IMPORTANT: Use Firebase SDK directly for Firestore operations
22
- // Import in your app: import { getFirestore } from 'firebase/firestore';
23
- //
24
- // Firestore initialization:
25
- // import { initializeFirestore } from 'firebase/firestore';
26
- // import { getReactNativePersistence } from 'firebase/firestore/react-native';
27
- // import AsyncStorage from '@react-native-async-storage/async-storage';
28
- //
29
- // const db = initializeFirestore(firebaseApp, {
30
- // localCache: getReactNativePersistence(AsyncStorage)
31
- // });
32
-
33
- // Firestore type (any to avoid conflicts)
6
+ // Domain Errors
7
+ export {
8
+ FirebaseFirestoreError,
9
+ FirebaseFirestoreInitializationError,
10
+ FirebaseFirestoreQuotaError,
11
+ } from './domain/errors/FirebaseFirestoreError';
12
+
13
+ // Firestore Client
14
+ export {
15
+ initializeFirestore,
16
+ getFirestore,
17
+ isFirestoreInitialized,
18
+ getFirestoreInitializationError,
19
+ resetFirestoreClient,
20
+ firestoreClient,
21
+ } from './infrastructure/config/FirestoreClient';
34
22
  export type { Firestore } from './infrastructure/config/FirestoreClient';
35
23
 
36
24
  // Repositories
@@ -71,6 +59,61 @@ export type {
71
59
  } from './types/pagination.types';
72
60
  export { EMPTY_PAGINATED_RESULT } from './types/pagination.types';
73
61
 
62
+ // Domain Constants
63
+ export {
64
+ FREE_TIER_LIMITS,
65
+ QUOTA_THRESHOLDS,
66
+ calculateQuotaUsage,
67
+ isQuotaThresholdReached,
68
+ getRemainingQuota,
69
+ } from './domain/constants/QuotaLimits';
70
+
71
+ // Domain Entities
72
+ export type {
73
+ QuotaMetrics,
74
+ QuotaLimits,
75
+ QuotaStatus,
76
+ } from './domain/entities/QuotaMetrics';
77
+ export type {
78
+ RequestLog,
79
+ RequestStats,
80
+ RequestType,
81
+ } from './domain/entities/RequestLog';
82
+
83
+ // Domain Services
84
+ export { QuotaCalculator } from './domain/services/QuotaCalculator';
85
+
86
+ // Quota Error Detection
87
+ export {
88
+ isQuotaError,
89
+ isRetryableError,
90
+ } from '../../shared/domain/utils/error-handlers/error-checkers';
91
+ export {
92
+ getQuotaErrorMessage,
93
+ } from '../../shared/domain/utils/error-handlers/error-messages';
94
+
95
+ // Middleware
96
+ export {
97
+ QueryDeduplicationMiddleware,
98
+ queryDeduplicationMiddleware,
99
+ syncDeduplicationWithQuota,
100
+ useDeduplicationWithQuota,
101
+ } from './infrastructure/middleware/QueryDeduplicationMiddleware';
102
+ export type {
103
+ QueryDeduplicationConfig,
104
+ DeduplicationStatistics,
105
+ } from './infrastructure/middleware/QueryDeduplicationMiddleware';
106
+ export {
107
+ QuotaTrackingMiddleware,
108
+ quotaTrackingMiddleware,
109
+ } from './infrastructure/middleware/QuotaTrackingMiddleware';
110
+
111
+ // Services
112
+ export {
113
+ RequestLoggerService,
114
+ requestLoggerService,
115
+ } from './infrastructure/services/RequestLoggerService';
116
+
74
117
  // Firestore Helper Utilities
75
118
  export {
76
119
  withFirestore,
@@ -107,7 +150,22 @@ export {
107
150
  export { useFirestoreQuery } from './presentation/hooks/useFirestoreQuery';
108
151
  export { useFirestoreMutation } from './presentation/hooks/useFirestoreMutation';
109
152
  export { useFirestoreSnapshot } from './presentation/hooks/useFirestoreSnapshot';
153
+ export { useSmartFirestoreSnapshot, useSmartListenerControl } from './presentation/hooks/useSmartFirestoreSnapshot';
154
+ export { createFirestoreKeys } from './presentation/query-keys/createFirestoreKeys';
110
155
 
111
156
  export type { UseFirestoreQueryOptions } from './presentation/hooks/useFirestoreQuery';
112
157
  export type { UseFirestoreMutationOptions } from './presentation/hooks/useFirestoreMutation';
113
158
  export type { UseFirestoreSnapshotOptions } from './presentation/hooks/useFirestoreSnapshot';
159
+ export type { UseSmartFirestoreSnapshotOptions, BackgroundStrategy } from './presentation/hooks/useSmartFirestoreSnapshot';
160
+
161
+ export { Timestamp } from 'firebase/firestore';
162
+ export type {
163
+ CollectionReference,
164
+ QueryDocumentSnapshot,
165
+ DocumentData,
166
+ Transaction,
167
+ DocumentReference,
168
+ WriteBatch,
169
+ DocumentSnapshot,
170
+ QuerySnapshot,
171
+ } from 'firebase/firestore';
@@ -1,24 +1,97 @@
1
1
  /**
2
- * Firestore Configuration Client
2
+ * Firestore Client - Infrastructure Layer
3
3
  *
4
- * IMPORTANT: This package does NOT provide Firestore initialization.
5
- * Use Firebase SDK directly in your app:
6
- * ```typescript
7
- * import { getFirestore, initializeFirestore } from 'firebase/firestore';
8
- * import { getReactNativePersistence } from 'firebase/firestore/react-native';
9
- * import AsyncStorage from '@react-native-async-storage/async-storage';
4
+ * Domain-Driven Design: Infrastructure implementation of Firestore client
5
+ * Singleton pattern for managing Firestore instance
10
6
  *
11
- * const db = initializeFirestore(firebaseApp, {
12
- * localCache: getReactNativePersistence(AsyncStorage)
13
- * });
14
- * ```
15
- *
16
- * This package only provides:
17
- * - Base repository classes (extend these for your data layer)
18
- * - Utilities for pagination, queries, dates
19
- * - Type definitions (import from 'firebase/firestore' in your app)
7
+ * IMPORTANT: This package requires Firebase App to be initialized first.
8
+ * Use @umituz/react-native-firebase to initialize Firebase App.
9
+ */
10
+
11
+ import type { Firestore } from 'firebase/firestore';
12
+ import { getFirebaseApp } from '../../../../shared/infrastructure/config/services/FirebaseInitializationService';
13
+ import { FirebaseFirestoreInitializer } from './initializers/FirebaseFirestoreInitializer';
14
+ import { ServiceClientSingleton } from '../../../../shared/infrastructure/config/base/ServiceClientSingleton';
15
+
16
+ /**
17
+ * Firestore Client Singleton
18
+ * Manages Firestore initialization
20
19
  */
20
+ class FirestoreClientSingleton extends ServiceClientSingleton<Firestore> {
21
+ private constructor() {
22
+ super({
23
+ serviceName: 'Firestore',
24
+ initializer: () => {
25
+ const app = getFirebaseApp();
26
+ if (!app) {
27
+ this.setError('Firebase App is not initialized');
28
+ return null;
29
+ }
30
+ return FirebaseFirestoreInitializer.initialize(app);
31
+ },
32
+ autoInitializer: () => {
33
+ const app = getFirebaseApp();
34
+ if (!app) return null;
35
+ return FirebaseFirestoreInitializer.initialize(app);
36
+ },
37
+ });
38
+ }
39
+
40
+ private static instance: FirestoreClientSingleton | null = null;
41
+
42
+ static getInstance(): FirestoreClientSingleton {
43
+ if (!this.instance) {
44
+ this.instance = new FirestoreClientSingleton();
45
+ }
46
+ return this.instance;
47
+ }
48
+
49
+ /**
50
+ * Initialize Firestore
51
+ */
52
+ override initialize(): Firestore | null {
53
+ return super.initialize();
54
+ }
55
+
56
+ /**
57
+ * Get Firestore instance with auto-initialization
58
+ */
59
+ getFirestore(): Firestore | null {
60
+ return this.getInstance(true);
61
+ }
62
+ }
63
+
64
+ function getFirestoreClientSafe(): FirestoreClientSingleton | null {
65
+ try {
66
+ return FirestoreClientSingleton.getInstance();
67
+ } catch (error) {
68
+ if (__DEV__) {
69
+ console.error('[Firestore] Could not create Firestore client singleton:', error);
70
+ }
71
+ return null;
72
+ }
73
+ }
74
+
75
+ export const firestoreClient = getFirestoreClientSafe();
76
+
77
+ export function initializeFirestore(): Firestore | null {
78
+ return firestoreClient?.initialize() ?? null;
79
+ }
80
+
81
+ export function getFirestore(): Firestore | null {
82
+ return firestoreClient?.getFirestore() ?? null;
83
+ }
84
+
85
+ export function isFirestoreInitialized(): boolean {
86
+ return firestoreClient?.isInitialized() ?? false;
87
+ }
88
+
89
+ export function getFirestoreInitializationError(): string | null {
90
+ return firestoreClient?.getInitializationError() ?? null;
91
+ }
92
+
93
+ export function resetFirestoreClient(): void {
94
+ firestoreClient?.reset();
95
+ }
21
96
 
22
- // Firestore type - use 'any' to avoid type conflicts with Firebase SDK
23
- // The actual type checking happens in your app when you import from firebase/firestore
24
- export type Firestore = any;
97
+ export type { Firestore } from 'firebase/firestore';
@@ -1,13 +1,258 @@
1
- import { getFirestore, initializeFirestore, memoryLocalCache } from 'firebase/firestore';
1
+ /**
2
+ * Firebase Firestore Initializer (Enhanced)
3
+ *
4
+ * Single Responsibility: Initialize Firestore instance with optimal caching
5
+ *
6
+ * OPTIMIZATIONS:
7
+ * - Web: Persistent IndexedDB cache (survives restarts)
8
+ * - React Native: Optimized memory cache
9
+ * - Configurable cache size limits (10 MB default)
10
+ * - Platform-aware cache strategy
11
+ *
12
+ * COST SAVINGS: ~90% reduction in network reads through persistent caching
13
+ */
14
+
15
+ import {
16
+ getFirestore,
17
+ initializeFirestore,
18
+ memoryLocalCache,
19
+ persistentLocalCache,
20
+ type FirestoreSettings,
21
+ } from 'firebase/firestore';
2
22
  import type { Firestore } from 'firebase/firestore';
3
23
  import type { FirebaseApp } from 'firebase/app';
4
24
 
25
+ /**
26
+ * Cache configuration options
27
+ */
28
+ export interface FirestoreCacheConfig {
29
+ /** Cache size in bytes (default: 10 MB) */
30
+ cacheSizeBytes?: number;
31
+ /** Enable persistent cache for web (default: true) */
32
+ enablePersistentCache?: boolean;
33
+ /** Force memory-only cache (useful for testing) */
34
+ forceMemoryCache?: boolean;
35
+ }
36
+
37
+ /**
38
+ * Default cache configuration
39
+ * Optimized for cost savings while maintaining performance
40
+ */
41
+ const DEFAULT_CACHE_CONFIG: Required<FirestoreCacheConfig> = {
42
+ cacheSizeBytes: 10 * 1024 * 1024, // 10 MB
43
+ enablePersistentCache: true,
44
+ forceMemoryCache: false,
45
+ };
46
+
47
+ /**
48
+ * Platform detection utilities
49
+ */
50
+ const Platform = {
51
+ isWeb(): boolean {
52
+ return typeof window !== 'undefined' && typeof window.indexedDB !== 'undefined';
53
+ },
54
+
55
+ isReactNative(): boolean {
56
+ return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';
57
+ },
58
+
59
+ isNode(): boolean {
60
+ return typeof process !== 'undefined' && process.versions?.node !== undefined;
61
+ },
62
+ };
63
+
64
+ /**
65
+ * Creates persistent cache configuration for web platforms
66
+ * Uses IndexedDB to cache data across browser sessions
67
+ */
68
+ function createPersistentCacheConfig(config: Required<FirestoreCacheConfig>): FirestoreSettings {
69
+ try {
70
+ // Create persistent cache with IndexedDB
71
+ const cacheConfig = persistentLocalCache(/* no settings needed for default */);
72
+
73
+ return {
74
+ localCache: cacheConfig,
75
+ cacheSizeBytes: config.cacheSizeBytes,
76
+ };
77
+ } catch (error) {
78
+ // If persistent cache fails, fall back to memory cache
79
+ if (__DEV__) {
80
+ console.warn('[Firestore] Persistent cache failed, using memory cache:', error);
81
+ }
82
+ return createMemoryCacheConfig(config);
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Creates optimized memory cache configuration for React Native
88
+ * Uses memory cache for platforms without IndexedDB support
89
+ */
90
+ function createMemoryCacheConfig(config: Required<FirestoreCacheConfig>): FirestoreSettings {
91
+ // Memory cache - no additional settings needed for React Native
92
+ const cacheConfig = memoryLocalCache();
93
+
94
+ return {
95
+ localCache: cacheConfig,
96
+ cacheSizeBytes: config.cacheSizeBytes,
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Initializes Firestore with optimal caching strategy based on platform
102
+ *
103
+ * @param app - Firebase app instance
104
+ * @param config - Cache configuration options
105
+ * @returns Firestore instance
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * // Default configuration (recommended)
110
+ * const db = FirebaseFirestoreInitializer.initialize(app);
111
+ *
112
+ * // Custom cache size (20 MB)
113
+ * const db = FirebaseFirestoreInitializer.initialize(app, {
114
+ * cacheSizeBytes: 20 * 1024 * 1024,
115
+ * });
116
+ *
117
+ * // Force memory cache (testing)
118
+ * const db = FirebaseFirestoreInitializer.initialize(app, {
119
+ * forceMemoryCache: true,
120
+ * });
121
+ * ```
122
+ */
5
123
  export class FirebaseFirestoreInitializer {
6
- static initialize(app: FirebaseApp): Firestore {
124
+ /**
125
+ * Initialize Firestore with platform-optimized caching
126
+ *
127
+ * Platform Strategy:
128
+ * - Web: Persistent IndexedDB cache (survives restarts, 90% cost savings)
129
+ * - React Native: Memory cache
130
+ * - Node.js: Memory cache for server-side rendering
131
+ */
132
+ static initialize(
133
+ app: FirebaseApp,
134
+ config: FirestoreCacheConfig = {}
135
+ ): Firestore {
136
+ const finalConfig = { ...DEFAULT_CACHE_CONFIG, ...config };
137
+
7
138
  try {
8
- return initializeFirestore(app, { localCache: memoryLocalCache() });
9
- } catch {
139
+ // Web platform with persistent cache (COST OPTIMIZED)
140
+ if (!finalConfig.forceMemoryCache && Platform.isWeb()) {
141
+ try {
142
+ return initializeFirestore(app, createPersistentCacheConfig(finalConfig));
143
+ } catch (error) {
144
+ // IndexedDB may be disabled in private browsing mode
145
+ // Fall back to memory cache
146
+ if (__DEV__) {
147
+ console.warn('[Firestore] Persistent cache failed, using memory cache:', error);
148
+ }
149
+ return initializeFirestore(app, createMemoryCacheConfig(finalConfig));
150
+ }
151
+ }
152
+
153
+ // React Native with memory cache
154
+ // Note: React Native doesn't support IndexedDB, use memory cache
155
+ if (Platform.isReactNative()) {
156
+ return initializeFirestore(app, createMemoryCacheConfig(finalConfig));
157
+ }
158
+
159
+ // Node.js / Server-side with memory cache
160
+ if (Platform.isNode()) {
161
+ return initializeFirestore(app, createMemoryCacheConfig(finalConfig));
162
+ }
163
+
164
+ // Fallback: Try persistent cache, fall back to memory
165
+ return initializeFirestore(app, createPersistentCacheConfig(finalConfig));
166
+ } catch (error) {
167
+ // If initialization fails, get existing instance
168
+ // This handles cases where Firestore is already initialized
169
+ if (__DEV__) {
170
+ console.warn('[Firestore] Initialization failed, getting existing instance:', error);
171
+ }
10
172
  return getFirestore(app);
11
173
  }
12
174
  }
175
+
176
+ /**
177
+ * Initialize Firestore with memory-only cache
178
+ * Useful for testing or sensitive data that shouldn't be persisted
179
+ */
180
+ static initializeWithMemoryCache(
181
+ app: FirebaseApp,
182
+ config: Omit<FirestoreCacheConfig, 'enablePersistentCache' | 'forceMemoryCache'> = {}
183
+ ): Firestore {
184
+ return this.initialize(app, {
185
+ ...config,
186
+ forceMemoryCache: true,
187
+ enablePersistentCache: false,
188
+ });
189
+ }
190
+
191
+ /**
192
+ * Check if persistent cache is available on current platform
193
+ */
194
+ static isPersistentCacheAvailable(): boolean {
195
+ return Platform.isWeb() && typeof window.indexedDB !== 'undefined';
196
+ }
197
+
198
+ /**
199
+ * Get current cache size in bytes
200
+ * Note: This is an estimate, actual size may vary
201
+ */
202
+ static getEstimatedCacheSize(config: FirestoreCacheConfig = {}): number {
203
+ return config.cacheSizeBytes ?? DEFAULT_CACHE_CONFIG.cacheSizeBytes;
204
+ }
205
+
206
+ /**
207
+ * Clear all Firestore caches (useful for logout or data reset)
208
+ * WARNING: This will clear all cached data and force re-fetch
209
+ */
210
+ static async clearPersistentCache(app: FirebaseApp): Promise<void> {
211
+ try {
212
+ const db = getFirestore(app);
213
+ await (db as any).clearPersistentCache();
214
+ if (__DEV__) {
215
+ console.log('[Firestore] Persistent cache cleared');
216
+ }
217
+ } catch (error) {
218
+ if (__DEV__) {
219
+ console.warn('[Firestore] Failed to clear persistent cache:', error);
220
+ }
221
+ throw error;
222
+ }
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Cache statistics interface
228
+ */
229
+ export interface CacheStatistics {
230
+ /** Platform type */
231
+ platform: 'web' | 'react-native' | 'node' | 'unknown';
232
+ /** Persistent cache available */
233
+ persistentCacheAvailable: boolean;
234
+ /** Current cache size limit */
235
+ cacheSizeBytes: number;
236
+ /** Estimated cache usage percentage */
237
+ estimatedCacheUsage: number;
238
+ }
239
+
240
+ /**
241
+ * Get cache statistics for monitoring and debugging
242
+ */
243
+ export function getCacheStatistics(): CacheStatistics {
244
+ const platform = Platform.isWeb()
245
+ ? 'web'
246
+ : Platform.isReactNative()
247
+ ? 'react-native'
248
+ : Platform.isNode()
249
+ ? 'node'
250
+ : 'unknown';
251
+
252
+ return {
253
+ platform,
254
+ persistentCacheAvailable: FirebaseFirestoreInitializer.isPersistentCacheAvailable(),
255
+ cacheSizeBytes: FirebaseFirestoreInitializer.getEstimatedCacheSize(),
256
+ estimatedCacheUsage: 0, // Firestore doesn't expose actual cache size
257
+ };
13
258
  }