|
1 | 1 | import * as firebase from 'firebase/app'; |
| 2 | +import * as utils from '../utils'; |
2 | 3 | import 'firebase/database'; |
3 | 4 | import { AFUnwrappedDataSnapshot } from '../interfaces'; |
4 | 5 | import { FirebaseListObservable } from './firebase_list_observable'; |
5 | 6 | import { Observer } from 'rxjs/Observer'; |
6 | 7 | import { observeOn } from 'rxjs/operator/observeOn'; |
7 | 8 | import { observeQuery } from './query_observable'; |
8 | | -import { Query, FirebaseListFactoryOpts, PathReference } from '../interfaces'; |
9 | | -import * as utils from '../utils'; |
| 9 | +import { Query, FirebaseListFactoryOpts, PathReference, QueryReference, DatabaseQuery, DatabaseReference } from '../interfaces'; |
10 | 10 | import { switchMap } from 'rxjs/operator/switchMap'; |
11 | 11 | import { map } from 'rxjs/operator/map'; |
12 | 12 |
|
13 | 13 | export function FirebaseListFactory ( |
14 | | - pathOrReference: PathReference, |
| 14 | + pathRef: PathReference, |
15 | 15 | { preserveSnapshot, query = {} } :FirebaseListFactoryOpts = {}): FirebaseListObservable<any> { |
16 | 16 |
|
17 | | - let ref: firebase.database.Reference | firebase.database.Query; |
| 17 | + let ref: QueryReference; |
18 | 18 |
|
19 | | - utils.checkForUrlOrFirebaseRef(pathOrReference, { |
20 | | - isUrl: () => ref = firebase.database().ref(<string>pathOrReference), |
21 | | - isRef: () => ref = <firebase.database.Reference>pathOrReference, |
22 | | - isQuery: () => ref = <firebase.database.Query>pathOrReference, |
| 19 | + utils.checkForUrlOrFirebaseRef(pathRef, { |
| 20 | + isUrl: () => { |
| 21 | + const path = pathRef as string; |
| 22 | + if(utils.isAbsoluteUrl(path)) { |
| 23 | + ref = firebase.database().refFromURL(path) |
| 24 | + } else { |
| 25 | + ref = firebase.database().ref(path); |
| 26 | + } |
| 27 | + }, |
| 28 | + isRef: () => ref = <DatabaseReference>pathRef, |
| 29 | + isQuery: () => ref = <DatabaseQuery>pathRef, |
23 | 30 | }); |
24 | 31 |
|
25 | 32 | // if it's just a reference or string, create a regular list observable |
26 | | - if ((utils.isFirebaseRef(pathOrReference) || |
27 | | - utils.isString(pathOrReference)) && |
| 33 | + if ((utils.isFirebaseRef(pathRef) || |
| 34 | + utils.isString(pathRef)) && |
28 | 35 | utils.isEmptyObject(query)) { |
29 | 36 | return firebaseListObservable(ref, { preserveSnapshot }); |
30 | 37 | } |
31 | 38 |
|
32 | 39 | const queryObs = observeQuery(query); |
33 | 40 | return new FirebaseListObservable(ref, subscriber => { |
34 | 41 | let sub = switchMap.call(map.call(queryObs, query => { |
35 | | - let queried: firebase.database.Query = ref; |
| 42 | + let queried: DatabaseQuery = ref; |
36 | 43 | // Only apply the populated keys |
37 | 44 | // apply ordering and available querying options |
38 | 45 | // eg: ref.orderByChild('height').startAt(3) |
@@ -112,13 +119,13 @@ export function FirebaseListFactory ( |
112 | 119 | } |
113 | 120 |
|
114 | 121 | /** |
115 | | - * Creates a FirebaseListObservable from a reference or query. Options can be provided as a second parameter. |
116 | | - * This function understands the nuances of the Firebase SDK event ordering and other quirks. This function |
117 | | - * takes into account that not all .on() callbacks are guaranteed to be asynchonous. It creates a initial array |
118 | | - * from a promise of ref.once('value'), and then starts listening to child events. When the initial array |
119 | | - * is loaded, the observable starts emitting values. |
| 122 | + * Creates a FirebaseListObservable from a reference or query. Options can be provided as a second |
| 123 | + * parameter. This function understands the nuances of the Firebase SDK event ordering and other |
| 124 | + * quirks. This function takes into account that not all .on() callbacks are guaranteed to be |
| 125 | + * asynchonous. It creates a initial array from a promise of ref.once('value'), and then starts |
| 126 | + * listening to child events. When the initial array is loaded, the observable starts emitting values. |
120 | 127 | */ |
121 | | -function firebaseListObservable(ref: firebase.database.Reference | firebase.database.Query, {preserveSnapshot}: FirebaseListFactoryOpts = {}): FirebaseListObservable<any> { |
| 128 | +function firebaseListObservable(ref: firebase.database.Reference | DatabaseQuery, {preserveSnapshot}: FirebaseListFactoryOpts = {}): FirebaseListObservable<any> { |
122 | 129 |
|
123 | 130 | const toValue = preserveSnapshot ? (snapshot => snapshot) : utils.unwrapMapFn; |
124 | 131 | const toKey = preserveSnapshot ? (value => value.key) : (value => value.$key); |
|
0 commit comments