0
# Modular API
1
2
Modern Firebase v9+ style functional API providing tree-shakable imports and improved developer experience.
3
4
## Capabilities
5
6
### Firestore Initialization
7
8
Initialize and configure Firestore instances using the modular approach.
9
10
```typescript { .api }
11
/**
12
* Get the default Firestore instance
13
* @returns Firestore instance
14
*/
15
function getFirestore(): FirebaseFirestoreTypes.Firestore;
16
17
/**
18
* Get Firestore instance for a specific Firebase app
19
* @param app - Firebase app instance
20
* @returns Firestore instance for the app
21
*/
22
function getFirestore(app: FirebaseAppTypes.Module): FirebaseFirestoreTypes.Firestore;
23
24
/**
25
* Get Firestore instance with specific database ID
26
* @param app - Optional Firebase app instance
27
* @param databaseId - Database identifier
28
* @returns Firestore instance for the specified database
29
*/
30
function getFirestore(app?: FirebaseAppTypes.Module, databaseId?: string): FirebaseFirestoreTypes.Firestore;
31
32
/**
33
* Initialize Firestore with settings
34
* @param app - Firebase app instance
35
* @param settings - Firestore configuration settings
36
* @param databaseId - Optional database identifier
37
* @returns Promise resolving to initialized Firestore instance
38
*/
39
function initializeFirestore(
40
app: FirebaseAppTypes.Module,
41
settings: FirebaseFirestoreTypes.FirestoreSettings,
42
databaseId?: string
43
): Promise<FirebaseFirestoreTypes.Firestore>;
44
45
/**
46
* Connect to Firestore emulator
47
* @param firestore - Firestore instance
48
* @param host - Emulator host
49
* @param port - Emulator port
50
* @param options - Optional connection options
51
*/
52
function connectFirestoreEmulator(
53
firestore: FirebaseFirestoreTypes.Firestore,
54
host: string,
55
port: number,
56
options?: { mockUserToken?: object | string }
57
): void;
58
```
59
60
**Usage Examples:**
61
62
```typescript
63
import { initializeApp } from '@react-native-firebase/app';
64
import {
65
getFirestore,
66
initializeFirestore,
67
connectFirestoreEmulator
68
} from '@react-native-firebase/firestore';
69
70
// Get default Firestore instance
71
const db = getFirestore();
72
73
// Get Firestore for specific app
74
const customApp = initializeApp(customConfig, 'customApp');
75
const customDb = getFirestore(customApp);
76
77
// Initialize with settings
78
const dbWithSettings = await initializeFirestore(customApp, {
79
persistence: true,
80
cacheSizeBytes: 50 * 1024 * 1024
81
});
82
83
// Connect to emulator (development)
84
if (__DEV__) {
85
connectFirestoreEmulator(db, 'localhost', 8080);
86
}
87
88
// Multi-database setup
89
const mainDb = getFirestore(); // default database
90
const analyticsDb = getFirestore(undefined, 'analytics'); // custom database
91
```
92
93
### Document Operations
94
95
Core document operations using functional approach with explicit Firestore instance.
96
97
```typescript { .api }
98
/**
99
* Get a document reference
100
* @param firestore - Firestore instance
101
* @param path - Document path
102
* @param pathSegments - Additional path segments
103
* @returns Document reference
104
*/
105
function doc(firestore: FirebaseFirestoreTypes.Firestore, path: string, ...pathSegments: string[]): FirebaseFirestoreTypes.DocumentReference;
106
107
/**
108
* Get a document reference from a collection
109
* @param reference - Collection reference
110
* @param path - Optional document path
111
* @param pathSegments - Additional path segments
112
* @returns Document reference
113
*/
114
function doc<T>(reference: FirebaseFirestoreTypes.CollectionReference<T>, path?: string, ...pathSegments: string[]): FirebaseFirestoreTypes.DocumentReference<T>;
115
116
/**
117
* Get a document reference from another document
118
* @param reference - Document reference
119
* @param path - Subcollection and document path
120
* @param pathSegments - Additional path segments
121
* @returns Document reference
122
*/
123
function doc<T>(reference: FirebaseFirestoreTypes.DocumentReference<T>, path: string, ...pathSegments: string[]): FirebaseFirestoreTypes.DocumentReference;
124
125
/**
126
* Get document data
127
* @param reference - Document reference
128
* @returns Promise resolving to document snapshot
129
*/
130
function getDoc<T>(reference: FirebaseFirestoreTypes.DocumentReference<T>): Promise<FirebaseFirestoreTypes.DocumentSnapshot<T>>;
131
132
/**
133
* Get document data from cache
134
* @param reference - Document reference
135
* @returns Promise resolving to cached document snapshot
136
*/
137
function getDocFromCache<T>(reference: FirebaseFirestoreTypes.DocumentReference<T>): Promise<FirebaseFirestoreTypes.DocumentSnapshot<T>>;
138
139
/**
140
* Get document data from server
141
* @param reference - Document reference
142
* @returns Promise resolving to server document snapshot
143
*/
144
function getDocFromServer<T>(reference: FirebaseFirestoreTypes.DocumentReference<T>): Promise<FirebaseFirestoreTypes.DocumentSnapshot<T>>;
145
146
/**
147
* Set document data
148
* @param reference - Document reference
149
* @param data - Document data to set
150
* @returns Promise resolving when set completes
151
*/
152
function setDoc<T>(reference: FirebaseFirestoreTypes.DocumentReference<T>, data: FirebaseFirestoreTypes.WithFieldValue<T>): Promise<void>;
153
154
/**
155
* Set document data with options
156
* @param reference - Document reference
157
* @param data - Partial document data
158
* @param options - Set options for merging
159
* @returns Promise resolving when set completes
160
*/
161
function setDoc<T>(
162
reference: FirebaseFirestoreTypes.DocumentReference<T>,
163
data: FirebaseFirestoreTypes.PartialWithFieldValue<T>,
164
options: FirebaseFirestoreTypes.SetOptions
165
): Promise<void>;
166
167
/**
168
* Update document fields
169
* @param reference - Document reference
170
* @param data - Update data
171
* @returns Promise resolving when update completes
172
*/
173
function updateDoc<T>(reference: FirebaseFirestoreTypes.DocumentReference<T>, data: FirebaseFirestoreTypes.UpdateData<T>): Promise<void>;
174
175
/**
176
* Update document using field paths
177
* @param reference - Document reference
178
* @param field - Field path to update
179
* @param value - New field value
180
* @param more - Additional field-value pairs
181
* @returns Promise resolving when update completes
182
*/
183
function updateDoc(
184
reference: FirebaseFirestoreTypes.DocumentReference,
185
field: string | FirebaseFirestoreTypes.FieldPath,
186
value: unknown,
187
...more: unknown[]
188
): Promise<void>;
189
190
/**
191
* Delete a document
192
* @param reference - Document reference
193
* @returns Promise resolving when deletion completes
194
*/
195
function deleteDoc(reference: FirebaseFirestoreTypes.DocumentReference): Promise<void>;
196
197
/**
198
* Add a document to a collection
199
* @param reference - Collection reference
200
* @param data - Document data to add
201
* @returns Promise resolving to the new document reference
202
*/
203
function addDoc<T>(reference: FirebaseFirestoreTypes.CollectionReference<T>, data: FirebaseFirestoreTypes.WithFieldValue<T>): Promise<FirebaseFirestoreTypes.DocumentReference<T>>;
204
```
205
206
**Usage Examples:**
207
208
```typescript
209
import {
210
getFirestore,
211
doc,
212
getDoc,
213
setDoc,
214
updateDoc,
215
deleteDoc,
216
addDoc,
217
collection
218
} from '@react-native-firebase/firestore';
219
220
const db = getFirestore();
221
222
// Document operations
223
const userRef = doc(db, 'users', 'userId');
224
const userSnapshot = await getDoc(userRef);
225
226
if (userSnapshot.exists()) {
227
console.log('User data:', userSnapshot.data());
228
}
229
230
// Set document
231
await setDoc(userRef, {
232
name: 'John Doe',
233
email: 'john@example.com',
234
createdAt: serverTimestamp()
235
});
236
237
// Update document
238
await updateDoc(userRef, {
239
lastLoginAt: serverTimestamp(),
240
loginCount: increment(1)
241
});
242
243
// Delete document
244
await deleteDoc(userRef);
245
246
// Add document to collection
247
const usersRef = collection(db, 'users');
248
const newUserRef = await addDoc(usersRef, {
249
name: 'Jane Doe',
250
email: 'jane@example.com'
251
});
252
253
// Get document from different sources
254
const cacheSnapshot = await getDocFromCache(userRef);
255
const serverSnapshot = await getDocFromServer(userRef);
256
257
// Nested document paths
258
const postRef = doc(db, 'users', 'userId', 'posts', 'postId');
259
const commentRef = doc(postRef, 'comments', 'commentId');
260
```
261
262
### Collection Operations
263
264
Work with collections using the modular API pattern.
265
266
```typescript { .api }
267
/**
268
* Get a collection reference
269
* @param firestore - Firestore instance
270
* @param path - Collection path
271
* @param pathSegments - Additional path segments
272
* @returns Collection reference
273
*/
274
function collection(firestore: FirebaseFirestoreTypes.Firestore, path: string, ...pathSegments: string[]): FirebaseFirestoreTypes.CollectionReference;
275
276
/**
277
* Get a subcollection reference from a collection
278
* @param reference - Parent collection reference
279
* @param path - Subcollection path
280
* @param pathSegments - Additional path segments
281
* @returns Collection reference
282
*/
283
function collection<T>(reference: FirebaseFirestoreTypes.CollectionReference<T>, path: string, ...pathSegments: string[]): FirebaseFirestoreTypes.CollectionReference;
284
285
/**
286
* Get a subcollection reference from a document
287
* @param reference - Parent document reference
288
* @param path - Subcollection path
289
* @param pathSegments - Additional path segments
290
* @returns Collection reference
291
*/
292
function collection<T>(reference: FirebaseFirestoreTypes.DocumentReference<T>, path: string, ...pathSegments: string[]): FirebaseFirestoreTypes.CollectionReference;
293
294
/**
295
* Query across collection groups
296
* @param firestore - Firestore instance
297
* @param collectionId - Collection identifier
298
* @returns Query for collection group
299
*/
300
function collectionGroup(firestore: FirebaseFirestoreTypes.Firestore, collectionId: string): FirebaseFirestoreTypes.Query;
301
```
302
303
**Usage Examples:**
304
305
```typescript
306
import {
307
getFirestore,
308
collection,
309
collectionGroup,
310
doc,
311
getDocs
312
} from '@react-native-firebase/firestore';
313
314
const db = getFirestore();
315
316
// Collection references
317
const usersRef = collection(db, 'users');
318
const postsRef = collection(db, 'posts');
319
320
// Subcollection from document
321
const userRef = doc(db, 'users', 'userId');
322
const userPostsRef = collection(userRef, 'posts');
323
324
// Nested collections
325
const commentsRef = collection(db, 'users', 'userId', 'posts', 'postId', 'comments');
326
327
// Collection group query
328
const allCommentsQuery = collectionGroup(db, 'comments');
329
const allCommentsSnapshot = await getDocs(allCommentsQuery);
330
```
331
332
### Query Operations
333
334
Build and execute queries using composable query constraints.
335
336
```typescript { .api }
337
/**
338
* Create a query with constraints
339
* @param query - Base query
340
* @param queryConstraints - Query constraints to apply
341
* @returns New query with constraints applied
342
*/
343
function query<T>(query: FirebaseFirestoreTypes.Query<T>, ...queryConstraints: FirebaseFirestoreTypes.QueryConstraint[]): FirebaseFirestoreTypes.Query<T>;
344
345
/**
346
* Create where constraint
347
* @param fieldPath - Field to filter on
348
* @param opStr - Comparison operator
349
* @param value - Value to compare against
350
* @returns Query field filter constraint
351
*/
352
function where(fieldPath: string | FirebaseFirestoreTypes.FieldPath, opStr: FirebaseFirestoreTypes.WhereFilterOp, value: unknown): FirebaseFirestoreTypes.QueryFieldFilterConstraint;
353
354
/**
355
* Create AND composite filter
356
* @param queries - Filter constraints to combine with AND
357
* @returns Composite AND filter constraint
358
*/
359
function and(...queries: FirebaseFirestoreTypes.QueryFilterConstraint[]): FirebaseFirestoreTypes.QueryCompositeFilterConstraint;
360
361
/**
362
* Create OR composite filter
363
* @param queries - Filter constraints to combine with OR
364
* @returns Composite OR filter constraint
365
*/
366
function or(...queries: FirebaseFirestoreTypes.QueryFilterConstraint[]): FirebaseFirestoreTypes.QueryCompositeFilterConstraint;
367
368
/**
369
* Create order by constraint
370
* @param fieldPath - Field to order by
371
* @param directionStr - Sort direction
372
* @returns Query order by constraint
373
*/
374
function orderBy(fieldPath: string | FirebaseFirestoreTypes.FieldPath, directionStr?: FirebaseFirestoreTypes.OrderByDirection): FirebaseFirestoreTypes.QueryOrderByConstraint;
375
376
/**
377
* Create limit constraint
378
* @param limit - Maximum number of documents
379
* @returns Query limit constraint
380
*/
381
function limit(limit: number): FirebaseFirestoreTypes.QueryLimitConstraint;
382
383
/**
384
* Create limit to last constraint
385
* @param limit - Number of documents from the end
386
* @returns Query constraint
387
*/
388
function limitToLast(limit: number): FirebaseFirestoreTypes.QueryConstraint;
389
390
/**
391
* Create start at constraint
392
* @param fieldValues - Field values to start at
393
* @returns Query start at constraint
394
*/
395
function startAt(...fieldValues: unknown[]): FirebaseFirestoreTypes.QueryStartAtConstraint;
396
397
/**
398
* Create start after constraint
399
* @param fieldValues - Field values to start after
400
* @returns Query start at constraint
401
*/
402
function startAfter(...fieldValues: unknown[]): FirebaseFirestoreTypes.QueryStartAtConstraint;
403
404
/**
405
* Create end at constraint
406
* @param fieldValues - Field values to end at
407
* @returns Query end at constraint
408
*/
409
function endAt(...fieldValues: unknown[]): FirebaseFirestoreTypes.QueryEndAtConstraint;
410
411
/**
412
* Create end before constraint
413
* @param fieldValues - Field values to end before
414
* @returns Query end at constraint
415
*/
416
function endBefore(...fieldValues: unknown[]): FirebaseFirestoreTypes.QueryEndAtConstraint;
417
418
/**
419
* Execute query and get results
420
* @param query - Query to execute
421
* @returns Promise resolving to query snapshot
422
*/
423
function getDocs<T>(query: FirebaseFirestoreTypes.Query<T>): Promise<FirebaseFirestoreTypes.QuerySnapshot<T>>;
424
425
/**
426
* Execute query and get results from cache
427
* @param query - Query to execute
428
* @returns Promise resolving to cached query snapshot
429
*/
430
function getDocsFromCache<T>(query: FirebaseFirestoreTypes.Query<T>): Promise<FirebaseFirestoreTypes.QuerySnapshot<T>>;
431
432
/**
433
* Execute query and get results from server
434
* @param query - Query to execute
435
* @returns Promise resolving to server query snapshot
436
*/
437
function getDocsFromServer<T>(query: FirebaseFirestoreTypes.Query<T>): Promise<FirebaseFirestoreTypes.QuerySnapshot<T>>;
438
```
439
440
**Usage Examples:**
441
442
```typescript
443
import {
444
getFirestore,
445
collection,
446
query,
447
where,
448
orderBy,
449
limit,
450
getDocs,
451
and,
452
or
453
} from '@react-native-firebase/firestore';
454
455
const db = getFirestore();
456
const usersRef = collection(db, 'users');
457
458
// Basic query
459
const activeUsersQuery = query(
460
usersRef,
461
where('active', '==', true),
462
orderBy('createdAt', 'desc'),
463
limit(10)
464
);
465
466
const activeUsersSnapshot = await getDocs(activeUsersQuery);
467
468
// Complex composite queries
469
const complexQuery = query(
470
usersRef,
471
and(
472
or(
473
where('role', '==', 'admin'),
474
where('role', '==', 'moderator')
475
),
476
where('active', '==', true)
477
),
478
orderBy('lastLoginAt', 'desc')
479
);
480
481
// Pagination
482
const firstPage = query(
483
usersRef,
484
orderBy('createdAt'),
485
limit(20)
486
);
487
488
const firstPageSnapshot = await getDocs(firstPage);
489
const lastDoc = firstPageSnapshot.docs[firstPageSnapshot.docs.length - 1];
490
491
const nextPage = query(
492
usersRef,
493
orderBy('createdAt'),
494
startAfter(lastDoc),
495
limit(20)
496
);
497
498
// Different data sources
499
const cacheResults = await getDocsFromCache(activeUsersQuery);
500
const serverResults = await getDocsFromServer(activeUsersQuery);
501
```
502
503
### Real-time Listeners
504
505
Set up real-time listeners using the modular API.
506
507
```typescript { .api }
508
/**
509
* Listen to document changes
510
* @param reference - Document reference
511
* @param observer - Observer with next, error, complete handlers
512
* @returns Unsubscribe function
513
*/
514
function onSnapshot<T>(
515
reference: FirebaseFirestoreTypes.DocumentReference<T>,
516
observer: {
517
next?: (snapshot: FirebaseFirestoreTypes.DocumentSnapshot<T>) => void;
518
error?: (error: Error) => void;
519
complete?: () => void;
520
}
521
): FirebaseFirestoreTypes.Unsubscribe;
522
523
/**
524
* Listen to query changes
525
* @param query - Query to listen to
526
* @param observer - Observer with next, error, complete handlers
527
* @returns Unsubscribe function
528
*/
529
function onSnapshot<T>(
530
query: FirebaseFirestoreTypes.Query<T>,
531
observer: {
532
next?: (snapshot: FirebaseFirestoreTypes.QuerySnapshot<T>) => void;
533
error?: (error: Error) => void;
534
complete?: () => void;
535
}
536
): FirebaseFirestoreTypes.Unsubscribe;
537
538
/**
539
* Listen to snapshots in sync
540
* @param firestore - Firestore instance
541
* @param observer - Observer for sync events
542
* @returns Unsubscribe function
543
*/
544
function onSnapshotsInSync(
545
firestore: FirebaseFirestoreTypes.Firestore,
546
observer: {
547
next?: () => void;
548
error?: (error: Error) => void;
549
complete?: () => void;
550
}
551
): FirebaseFirestoreTypes.Unsubscribe;
552
```
553
554
**Usage Examples:**
555
556
```typescript
557
import {
558
getFirestore,
559
doc,
560
collection,
561
query,
562
where,
563
onSnapshot,
564
onSnapshotsInSync
565
} from '@react-native-firebase/firestore';
566
567
const db = getFirestore();
568
569
// Document listener
570
const userRef = doc(db, 'users', 'userId');
571
const unsubscribeUser = onSnapshot(userRef, {
572
next: (snapshot) => {
573
if (snapshot.exists()) {
574
console.log('User data:', snapshot.data());
575
}
576
},
577
error: (error) => {
578
console.error('User listener error:', error);
579
}
580
});
581
582
// Query listener
583
const activeUsersQuery = query(
584
collection(db, 'users'),
585
where('active', '==', true)
586
);
587
588
const unsubscribeUsers = onSnapshot(activeUsersQuery, {
589
next: (snapshot) => {
590
snapshot.docChanges().forEach((change) => {
591
console.log(change.type, change.doc.data());
592
});
593
}
594
});
595
596
// Snapshots in sync listener
597
const unsubscribeSync = onSnapshotsInSync(db, {
598
next: () => {
599
console.log('All snapshots are in sync');
600
}
601
});
602
603
// Cleanup
604
unsubscribeUser();
605
unsubscribeUsers();
606
unsubscribeSync();
607
```
608
609
### Aggregation Operations
610
611
Server-side aggregation functions for counting, summing, and averaging without downloading all documents.
612
613
```typescript { .api }
614
/**
615
* Get count of documents matching a query from server
616
* @param query - Query to count documents for
617
* @returns Promise resolving to aggregate query snapshot with count
618
*/
619
function getCountFromServer<T>(query: FirebaseFirestoreTypes.Query<T>): Promise<FirebaseFirestoreTypes.AggregateQuerySnapshot<{count: FirebaseFirestoreTypes.AggregateField<number>}, T>>;
620
621
/**
622
* Get aggregated data from server based on aggregate specification
623
* @param query - Query to aggregate documents for
624
* @param aggregateSpec - Specification of aggregations to perform
625
* @returns Promise resolving to aggregate query snapshot
626
*/
627
function getAggregateFromServer<T>(query: FirebaseFirestoreTypes.Query<T>, aggregateSpec: FirebaseFirestoreTypes.AggregateSpec): Promise<FirebaseFirestoreTypes.AggregateQuerySnapshot<T>>;
628
629
/**
630
* Create sum aggregation field
631
* @param field - Field path to sum
632
* @returns AggregateField for sum operation
633
*/
634
function sum(field: string | FirebaseFirestoreTypes.FieldPath): FirebaseFirestoreTypes.AggregateField<number>;
635
636
/**
637
* Create average aggregation field
638
* @param field - Field path to average
639
* @returns AggregateField for average operation
640
*/
641
function average(field: string | FirebaseFirestoreTypes.FieldPath): FirebaseFirestoreTypes.AggregateField<number | null>;
642
643
/**
644
* Create count aggregation field
645
* @returns AggregateField for count operation
646
*/
647
function count(): FirebaseFirestoreTypes.AggregateField<number>;
648
649
interface AggregateSpec {
650
[key: string]: FirebaseFirestoreTypes.AggregateField<any>;
651
}
652
653
interface AggregateQuerySnapshot<T> {
654
/**
655
* Get the aggregated data
656
* @returns Object containing aggregation results
657
*/
658
data(): T;
659
}
660
661
interface AggregateField<T> {
662
/**
663
* Get the aggregated value
664
* @returns The aggregated result
665
*/
666
value(): T;
667
}
668
```
669
670
**Usage Examples:**
671
672
```typescript
673
import {
674
getFirestore,
675
collection,
676
query,
677
where,
678
getCountFromServer,
679
getAggregateFromServer,
680
sum,
681
average,
682
count
683
} from '@react-native-firebase/firestore';
684
685
const db = getFirestore();
686
687
// Count documents
688
const usersQuery = query(collection(db, 'users'), where('active', '==', true));
689
const countSnapshot = await getCountFromServer(usersQuery);
690
console.log('Active users count:', countSnapshot.data().count);
691
692
// Multiple aggregations
693
const ordersQuery = query(collection(db, 'orders'), where('status', '==', 'completed'));
694
const aggregateSnapshot = await getAggregateFromServer(ordersQuery, {
695
totalRevenue: sum('amount'),
696
averageOrderValue: average('amount'),
697
orderCount: count()
698
});
699
700
const results = aggregateSnapshot.data();
701
console.log('Total revenue:', results.totalRevenue.value());
702
console.log('Average order:', results.averageOrderValue.value());
703
console.log('Order count:', results.orderCount.value());
704
705
// Product analytics aggregation
706
const productQuery = query(collection(db, 'products'), where('category', '==', 'electronics'));
707
const productStats = await getAggregateFromServer(productQuery, {
708
totalInventory: sum('stock'),
709
averagePrice: average('price'),
710
productCount: count()
711
});
712
713
const stats = productStats.data();
714
console.log(`Electronics: ${stats.productCount.value()} products`);
715
console.log(`Total inventory: ${stats.totalInventory.value()} units`);
716
console.log(`Average price: $${stats.averagePrice.value()?.toFixed(2) || 0}`);
717
```
718
719
### Bundle Operations
720
721
Load and work with data bundles using the modular API.
722
723
```typescript { .api }
724
/**
725
* Load a data bundle
726
* @param firestore - Firestore instance
727
* @param bundleData - Bundle data as string, ArrayBuffer, or ReadableStream
728
* @returns LoadBundleTask for monitoring progress
729
*/
730
function loadBundle(
731
firestore: FirebaseFirestoreTypes.Firestore,
732
bundleData: ReadableStream<Uint8Array> | ArrayBuffer | string
733
): FirebaseFirestoreTypes.LoadBundleTask;
734
735
/**
736
* Get a named query from a loaded bundle
737
* @param firestore - Firestore instance
738
* @param name - Name of the query in the bundle
739
* @returns Promise resolving to Query or null if not found
740
*/
741
function namedQuery(firestore: FirebaseFirestoreTypes.Firestore, name: string): Promise<FirebaseFirestoreTypes.Query | null>;
742
743
interface LoadBundleTask {
744
/**
745
* Promise that resolves when the bundle loading completes
746
*/
747
then(onFulfilled?: (progress: FirebaseFirestoreTypes.LoadBundleTaskProgress) => any): Promise<any>;
748
749
/**
750
* Catch errors during bundle loading
751
*/
752
catch(onRejected?: (error: Error) => any): Promise<any>;
753
}
754
```
755
756
**Usage Examples:**
757
758
```typescript
759
import {
760
getFirestore,
761
loadBundle,
762
namedQuery,
763
getDocs
764
} from '@react-native-firebase/firestore';
765
766
const db = getFirestore();
767
768
// Load bundle with progress monitoring
769
async function loadDataBundle() {
770
try {
771
const bundleData = await fetch('/api/data-bundle').then(r => r.text());
772
773
const loadTask = loadBundle(db, bundleData);
774
const progress = await loadTask;
775
776
console.log('Bundle loaded:', progress.taskState);
777
778
// Use named queries
779
const featuredQuery = await namedQuery(db, 'featured-products');
780
if (featuredQuery) {
781
const snapshot = await getDocs(featuredQuery);
782
console.log(`Featured products: ${snapshot.size}`);
783
}
784
} catch (error) {
785
console.error('Bundle loading failed:', error);
786
}
787
}
788
```
789
790
### Transactions & Batches
791
792
Atomic operations using the modular API.
793
794
```typescript { .api }
795
/**
796
* Execute a transaction
797
* @param firestore - Firestore instance
798
* @param updateFunction - Function that performs transaction operations
799
* @returns Promise resolving to transaction result
800
*/
801
function runTransaction<T>(
802
firestore: FirebaseFirestoreTypes.Firestore,
803
updateFunction: (transaction: FirebaseFirestoreTypes.Transaction) => Promise<T>
804
): Promise<T>;
805
806
/**
807
* Create a write batch
808
* @param firestore - Firestore instance
809
* @returns WriteBatch instance
810
*/
811
function writeBatch(firestore: FirebaseFirestoreTypes.Firestore): FirebaseFirestoreTypes.WriteBatch;
812
```
813
814
**Usage Examples:**
815
816
```typescript
817
import {
818
getFirestore,
819
doc,
820
runTransaction,
821
writeBatch,
822
serverTimestamp,
823
increment
824
} from '@react-native-firebase/firestore';
825
826
const db = getFirestore();
827
828
// Transaction
829
const result = await runTransaction(db, async (transaction) => {
830
const userRef = doc(db, 'users', 'userId');
831
const userDoc = await transaction.get(userRef);
832
833
if (!userDoc.exists()) {
834
throw new Error('User does not exist');
835
}
836
837
transaction.update(userRef, {
838
loginCount: increment(1),
839
lastLoginAt: serverTimestamp()
840
});
841
842
return { newLoginCount: userDoc.data().loginCount + 1 };
843
});
844
845
// Write batch
846
const batch = writeBatch(db);
847
848
const user1Ref = doc(db, 'users', 'user1');
849
const user2Ref = doc(db, 'users', 'user2');
850
851
batch.set(user1Ref, { name: 'John', active: true });
852
batch.update(user2Ref, { lastUpdated: serverTimestamp() });
853
854
await batch.commit();
855
```
856
857
### Field Value Operations
858
859
Modular functions for special field operations like server timestamps, increments, and array modifications.
860
861
```typescript { .api }
862
/**
863
* Server timestamp placeholder for modular API
864
* @returns FieldValue representing server timestamp
865
*/
866
function serverTimestamp(): FirebaseFirestoreTypes.FieldValue;
867
868
/**
869
* Field deletion marker for modular API
870
* @returns FieldValue that deletes the field
871
*/
872
function deleteField(): FirebaseFirestoreTypes.FieldValue;
873
874
/**
875
* Numeric increment operation for modular API
876
* @param n - Number to increment by (can be negative for decrement)
877
* @returns FieldValue that increments the field
878
*/
879
function increment(n: number): FirebaseFirestoreTypes.FieldValue;
880
881
/**
882
* Array union operation for modular API (adds elements not already present)
883
* @param elements - Elements to add to the array
884
* @returns FieldValue that performs array union
885
*/
886
function arrayUnion(...elements: unknown[]): FirebaseFirestoreTypes.FieldValue;
887
888
/**
889
* Array remove operation for modular API (removes all instances of elements)
890
* @param elements - Elements to remove from the array
891
* @returns FieldValue that performs array removal
892
*/
893
function arrayRemove(...elements: unknown[]): FirebaseFirestoreTypes.FieldValue;
894
```
895
896
**Usage Examples:**
897
898
```typescript
899
import {
900
getFirestore,
901
doc,
902
setDoc,
903
updateDoc,
904
serverTimestamp,
905
deleteField,
906
increment,
907
arrayUnion,
908
arrayRemove
909
} from '@react-native-firebase/firestore';
910
911
const db = getFirestore();
912
const userRef = doc(db, 'users', 'userId');
913
914
// Server timestamps
915
await setDoc(userRef, {
916
name: 'John Doe',
917
createdAt: serverTimestamp(),
918
updatedAt: serverTimestamp()
919
});
920
921
// Increment/decrement operations
922
await updateDoc(userRef, {
923
loginCount: increment(1),
924
credits: increment(-10) // Deduct 10 credits
925
});
926
927
// Array operations
928
await updateDoc(userRef, {
929
// Add tags (only if not already present)
930
tags: arrayUnion('premium', 'verified'),
931
932
// Remove tags (all instances)
933
blockedUsers: arrayRemove('spam-user-1', 'spam-user-2')
934
});
935
936
// Delete fields
937
await updateDoc(userRef, {
938
temporaryField: deleteField(),
939
updatedAt: serverTimestamp()
940
});
941
942
// Complex update with multiple field values
943
await updateDoc(doc(db, 'products', 'productId'), {
944
viewCount: increment(1),
945
categories: arrayUnion('featured'),
946
lastViewedAt: serverTimestamp(),
947
oldField: deleteField()
948
});
949
```
950
951
### Network & Persistence Operations
952
953
Modular functions for network and persistence management.
954
955
```typescript { .api }
956
/**
957
* Enable network connectivity for Firestore
958
* @param firestore - Firestore instance
959
* @returns Promise resolving when network is enabled
960
*/
961
function enableNetwork(firestore: FirebaseFirestoreTypes.Firestore): Promise<void>;
962
963
/**
964
* Disable network connectivity for Firestore
965
* @param firestore - Firestore instance
966
* @returns Promise resolving when network is disabled
967
*/
968
function disableNetwork(firestore: FirebaseFirestoreTypes.Firestore): Promise<void>;
969
970
/**
971
* Clear all cached data and pending writes
972
* @param firestore - Firestore instance
973
* @returns Promise resolving when persistence is cleared
974
*/
975
function clearPersistence(firestore: FirebaseFirestoreTypes.Firestore): Promise<void>;
976
977
/**
978
* Clear IndexedDB persistence (web platform)
979
* @param firestore - Firestore instance
980
* @returns Promise resolving when IndexedDB persistence is cleared
981
*/
982
function clearIndexedDbPersistence(firestore: FirebaseFirestoreTypes.Firestore): Promise<void>;
983
984
/**
985
* Wait for all pending writes to complete
986
* @param firestore - Firestore instance
987
* @returns Promise resolving when all writes are committed
988
*/
989
function waitForPendingWrites(firestore: FirebaseFirestoreTypes.Firestore): Promise<void>;
990
991
/**
992
* Terminate the Firestore instance and clean up resources
993
* @param firestore - Firestore instance
994
* @returns Promise resolving when termination is complete
995
*/
996
function terminate(firestore: FirebaseFirestoreTypes.Firestore): Promise<void>;
997
```
998
999
**Usage Examples:**
1000
1001
```typescript
1002
import {
1003
getFirestore,
1004
enableNetwork,
1005
disableNetwork,
1006
clearPersistence,
1007
waitForPendingWrites,
1008
terminate
1009
} from '@react-native-firebase/firestore';
1010
1011
const db = getFirestore();
1012
1013
// Network management
1014
await disableNetwork(db); // Go offline
1015
console.log('Network disabled');
1016
1017
await enableNetwork(db); // Go online
1018
console.log('Network enabled');
1019
1020
// Persistence management
1021
await waitForPendingWrites(db);
1022
console.log('All writes committed');
1023
1024
await clearPersistence(db);
1025
console.log('Cache cleared');
1026
1027
// Clean shutdown
1028
await terminate(db);
1029
console.log('Firestore terminated');
1030
```
1031
1032
### Utility Functions
1033
1034
Helper functions for common operations and comparisons.
1035
1036
```typescript { .api }
1037
/**
1038
* Check if two snapshots are equal
1039
* @param left - First snapshot
1040
* @param right - Second snapshot
1041
* @returns True if snapshots are equal
1042
*/
1043
function snapshotEqual<T>(
1044
left: FirebaseFirestoreTypes.DocumentSnapshot<T> | FirebaseFirestoreTypes.QuerySnapshot<T>,
1045
right: FirebaseFirestoreTypes.DocumentSnapshot<T> | FirebaseFirestoreTypes.QuerySnapshot<T>
1046
): boolean;
1047
1048
/**
1049
* Check if two queries are equal
1050
* @param left - First query
1051
* @param right - Second query
1052
* @returns True if queries are equal
1053
*/
1054
function queryEqual<T>(left: FirebaseFirestoreTypes.Query<T>, right: FirebaseFirestoreTypes.Query<T>): boolean;
1055
1056
/**
1057
* Check if two references are equal
1058
* @param left - First reference
1059
* @param right - Second reference
1060
* @returns True if references are equal
1061
*/
1062
function refEqual<T>(
1063
left: FirebaseFirestoreTypes.DocumentReference<T> | FirebaseFirestoreTypes.CollectionReference<T>,
1064
right: FirebaseFirestoreTypes.DocumentReference<T> | FirebaseFirestoreTypes.CollectionReference<T>
1065
): boolean;
1066
1067
/**
1068
* Set log level for Firestore
1069
* @param logLevel - Logging level
1070
*/
1071
function setLogLevel(logLevel: FirebaseFirestoreTypes.LogLevel): void;
1072
```
1073
1074
**Usage Examples:**
1075
1076
```typescript
1077
import {
1078
getFirestore,
1079
doc,
1080
query,
1081
collection,
1082
where,
1083
snapshotEqual,
1084
queryEqual,
1085
refEqual,
1086
setLogLevel
1087
} from '@react-native-firebase/firestore';
1088
1089
const db = getFirestore();
1090
1091
// Reference equality
1092
const userRef1 = doc(db, 'users', 'userId');
1093
const userRef2 = doc(db, 'users', 'userId');
1094
console.log('Refs equal:', refEqual(userRef1, userRef2)); // true
1095
1096
// Query equality
1097
const query1 = query(collection(db, 'users'), where('active', '==', true));
1098
const query2 = query(collection(db, 'users'), where('active', '==', true));
1099
console.log('Queries equal:', queryEqual(query1, query2)); // true
1100
1101
// Set logging level
1102
setLogLevel('debug'); // 'debug' | 'error' | 'silent'
1103
```
1104
1105
## Types
1106
1107
```typescript { .api }
1108
type Unsubscribe = () => void;
1109
type LogLevel = 'debug' | 'error' | 'silent';
1110
type OrderByDirection = 'desc' | 'asc';
1111
type WhereFilterOp = '<' | '<=' | '==' | '>' | '>=' | '!=' | 'array-contains' | 'array-contains-any' | 'in' | 'not-in';
1112
1113
interface FirestoreSettings {
1114
persistence?: boolean;
1115
cacheSizeBytes?: number;
1116
host?: string;
1117
ssl?: boolean;
1118
ignoreUndefinedProperties?: boolean;
1119
serverTimestampBehavior?: 'estimate' | 'previous' | 'none';
1120
}
1121
1122
interface WithFieldValue<T> {
1123
// Complex type allowing FieldValue in place of field values
1124
}
1125
1126
interface PartialWithFieldValue<T> {
1127
// Complex type for partial updates with FieldValue support
1128
}
1129
1130
interface UpdateData<T> {
1131
// Complex type for update operations with nested field support
1132
}
1133
```