@@ -16,6 +16,9 @@ export function validateEventsArray(events?: DocumentChangeType[]) {
16
16
return events ;
17
17
}
18
18
19
+ export type ChangeOptions = firestore . SnapshotListenOptions & { events ?: DocumentChangeType [ ] } ;
20
+
21
+ // SEMVER @ v6 only allow options
19
22
/**
20
23
* AngularFirestoreCollection service
21
24
*
@@ -61,42 +64,39 @@ export class AngularFirestoreCollection<T=DocumentData> {
61
64
* your own data structure.
62
65
* @param events
63
66
*/
64
- stateChanges ( events ?: DocumentChangeType [ ] ) : Observable < DocumentChangeAction < T > [ ] > {
65
- if ( ! events || events . length === 0 ) {
66
- return this . afs . scheduler . keepUnstableUntilFirst (
67
- this . afs . scheduler . runOutsideAngular (
68
- docChanges < T > ( this . query )
69
- )
70
- ) ;
71
- }
72
- return this . afs . scheduler . keepUnstableUntilFirst (
73
- this . afs . scheduler . runOutsideAngular (
74
- docChanges < T > ( this . query )
75
- )
67
+ stateChanges ( eventsOrOptions ?: DocumentChangeType [ ] | ChangeOptions ) : Observable < DocumentChangeAction < T > [ ] > {
68
+ const events = eventsOrOptions && ( Array . isArray ( eventsOrOptions ) ? eventsOrOptions : eventsOrOptions . events ) || [ ] ;
69
+ const options = eventsOrOptions && ! Array . isArray ( eventsOrOptions ) ? eventsOrOptions : { } ;
70
+ const ret = this . afs . scheduler . keepUnstableUntilFirst (
71
+ this . afs . scheduler . runOutsideAngular (
72
+ docChanges < T > ( this . query , options )
76
73
)
77
- . pipe (
78
- map ( actions => actions . filter ( change => events . indexOf ( change . type ) > - 1 ) ) ,
79
- filter ( changes => changes . length > 0 )
80
- ) ;
74
+ ) ;
75
+ return events . length === 0 ? ret : ret . pipe (
76
+ map ( actions => actions . filter ( change => events . indexOf ( change . type ) > - 1 ) ) ,
77
+ filter ( changes => changes . length > 0 )
78
+ ) ;
81
79
}
82
80
83
81
/**
84
82
* Create a stream of changes as they occur it time. This method is similar to stateChanges()
85
83
* but it collects each event in an array over time.
86
84
* @param events
87
85
*/
88
- auditTrail ( events ?: DocumentChangeType [ ] ) : Observable < DocumentChangeAction < T > [ ] > {
89
- return this . stateChanges ( events ) . pipe ( scan ( ( current , action ) => [ ...current , ...action ] , [ ] ) ) ;
86
+ auditTrail ( eventsOrOptions ?: DocumentChangeType [ ] | ChangeOptions ) : Observable < DocumentChangeAction < T > [ ] > {
87
+ return this . stateChanges ( eventsOrOptions ) . pipe ( scan ( ( current , action ) => [ ...current , ...action ] , [ ] ) ) ;
90
88
}
91
89
92
90
/**
93
91
* Create a stream of synchronized changes. This method keeps the local array in sorted
94
92
* query order.
95
93
* @param events
96
94
*/
97
- snapshotChanges ( events ?: DocumentChangeType [ ] ) : Observable < DocumentChangeAction < T > [ ] > {
95
+ snapshotChanges ( eventsOrOptions ?: DocumentChangeType [ ] | ChangeOptions ) : Observable < DocumentChangeAction < T > [ ] > {
96
+ const events = eventsOrOptions && ( Array . isArray ( eventsOrOptions ) ? eventsOrOptions : eventsOrOptions . events ) || [ ] ;
97
+ const options = eventsOrOptions && ! Array . isArray ( eventsOrOptions ) ? eventsOrOptions : { } ;
98
98
const validatedEvents = validateEventsArray ( events ) ;
99
- const sortedChanges$ = sortedChanges < T > ( this . query , validatedEvents ) ;
99
+ const sortedChanges$ = sortedChanges < T > ( this . query , validatedEvents , options ) ;
100
100
const scheduledSortedChanges$ = this . afs . scheduler . runOutsideAngular ( sortedChanges$ ) ;
101
101
return this . afs . scheduler . keepUnstableUntilFirst ( scheduledSortedChanges$ ) ;
102
102
}
@@ -110,22 +110,19 @@ export class AngularFirestoreCollection<T=DocumentData> {
110
110
*/
111
111
valueChanges ( ) : Observable < T [ ] >
112
112
valueChanges ( { } ) : Observable < T [ ] >
113
- valueChanges < K extends string > ( options : { idField : K } ) : Observable < ( T & { [ T in K ] : string } ) [ ] >
114
- valueChanges < K extends string > ( options : { idField ?: K } = { } ) : Observable < T [ ] > {
115
- const fromCollectionRef$ = fromCollectionRef < T > ( this . query ) ;
113
+ valueChanges < K extends string , L extends string > ( options : { idField : K , metadataField : L } ) : Observable < ( T & { [ T in L ] : firestore . SnapshotMetadata } & { [ T in K ] : string } ) [ ] >
114
+ valueChanges < L extends string > ( options : { metadataField : L } ) : Observable < ( T & { [ T in L ] : firestore . SnapshotMetadata } ) [ ] >
115
+ valueChanges < K extends string > ( options : { idField : K } ) : Observable < ( T & { [ T in K ] : string } ) [ ] >
116
+ valueChanges ( options : { idField ?: string , metadataField ?: string } = { } ) : Observable < T [ ] > {
117
+ const fromCollectionRef$ = fromCollectionRef < T > ( this . query , options . metadataField ? { includeMetadataChanges : true } : { } ) ;
116
118
const scheduled$ = this . afs . scheduler . runOutsideAngular ( fromCollectionRef$ ) ;
117
119
return this . afs . scheduler . keepUnstableUntilFirst ( scheduled$ )
118
120
. pipe (
119
- map ( actions => actions . payload . docs . map ( a => {
120
- if ( options . idField ) {
121
- return {
122
- ...a . data ( ) as Object ,
123
- ...{ [ options . idField ] : a . id }
124
- } as T & { [ T in K ] : string } ;
125
- } else {
126
- return a . data ( )
127
- }
128
- } ) )
121
+ map ( actions => actions . payload . docs . map ( a => ( {
122
+ ...( a . data ( ) as Object ) ,
123
+ ...( options . metadataField ? { [ options . metadataField ] : a . metadata } : { } ) ,
124
+ ...( options . idField ? { [ options . idField ] : a . id } : { } )
125
+ } as T ) ) )
129
126
) ;
130
127
}
131
128
0 commit comments