export function FirebaseObjectFactory(ref, { preserveSnapshot } = {}) { const objectObservable = new FirebaseObjectObservable((obs) => { let fn = ref.on('value', (snapshot) => { obs.next(preserveSnapshot ? snapshot : utils.unwrapMapFn(snapshot)); }, err => { if (err) { obs.error(err); obs.complete(); } }); return () => ref.off('value', fn); }, ref); return observeOn.call(objectObservable, new FirebaseZoneScheduler(new NgZone({}), {})); }
function firebaseListObservable(ref, _a) { var preserveSnapshot = (_a === void 0 ? {} : _a).preserveSnapshot; var toValue = preserveSnapshot ? (function (snapshot) { return snapshot; }) : utils.unwrapMapFn; var toKey = preserveSnapshot ? (function (value) { return value.key; }) : (function (value) { return value.$key; }); var listObs = new FirebaseListObservable(ref, function (obs) { var handles = []; var hasLoaded = false; var lastLoadedKey = (null); var array = []; ref.once('value', function (snap) { if (snap.exists()) { snap.forEach(function (child) { lastLoadedKey = child.key; }); if (array.find(function (child) { return toKey(child) === lastLoadedKey; })) { hasLoaded = true; obs.next(array); } } else { hasLoaded = true; obs.next(array); } }, function (err) { if (err) { obs.error(err); obs.complete(); } }); var addFn = ref.on('child_added', function (child, prevKey) { array = onChildAdded(array, toValue(child), toKey, prevKey); if (hasLoaded) { obs.next(array); } else if (child.key === lastLoadedKey) { hasLoaded = true; obs.next(array); } }, function (err) { if (err) { obs.error(err); obs.complete(); } }); handles.push({ event: 'child_added', handle: addFn }); var remFn = ref.on('child_removed', function (child) { array = onChildRemoved(array, toValue(child), toKey); if (hasLoaded) { obs.next(array); } }, function (err) { if (err) { obs.error(err); obs.complete(); } }); handles.push({ event: 'child_removed', handle: remFn }); var chgFn = ref.on('child_changed', function (child, prevKey) { array = onChildChanged(array, toValue(child), toKey, prevKey); if (hasLoaded) { obs.next(array); } }, function (err) { if (err) { obs.error(err); obs.complete(); } }); handles.push({ event: 'child_changed', handle: chgFn }); return function () { handles.forEach(function (item) { ref.off(item.event, item.handle); }); }; }); return observeOn.call(listObs, new FirebaseZoneScheduler(new NgZone({}), {})); }
function firebaseListObservable(ref, { preserveSnapshot } = {}) { const toValue = preserveSnapshot ? (snapshot => snapshot) : utils.unwrapMapFn; const toKey = preserveSnapshot ? (value => value.key) : (value => value.$key); const listObs = new FirebaseListObservable(ref, (obs) => { const handles = []; let hasLoaded = false; let lastLoadedKey = (null); let array = []; ref.once('value', (snap) => { if (snap.exists()) { snap.forEach((child) => { lastLoadedKey = child.key; }); if (array.find((child) => toKey(child) === lastLoadedKey)) { hasLoaded = true; obs.next(array); } } else { hasLoaded = true; obs.next(array); } }, err => { if (err) { obs.error(err); obs.complete(); } }); const addFn = ref.on('child_added', (child, prevKey) => { array = onChildAdded(array, toValue(child), toKey, prevKey); if (hasLoaded) { obs.next(array); } else if (child.key === lastLoadedKey) { hasLoaded = true; obs.next(array); } }, err => { if (err) { obs.error(err); obs.complete(); } }); handles.push({ event: 'child_added', handle: addFn }); let remFn = ref.on('child_removed', (child) => { array = onChildRemoved(array, toValue(child), toKey); if (hasLoaded) { obs.next(array); } }, err => { if (err) { obs.error(err); obs.complete(); } }); handles.push({ event: 'child_removed', handle: remFn }); let chgFn = ref.on('child_changed', (child, prevKey) => { array = onChildChanged(array, toValue(child), toKey, prevKey); if (hasLoaded) { obs.next(array); } }, err => { if (err) { obs.error(err); obs.complete(); } }); handles.push({ event: 'child_changed', handle: chgFn }); return () => { handles.forEach(item => { ref.off(item.event, item.handle); }); }; }); return observeOn.call(listObs, new FirebaseZoneScheduler(new NgZone({}), {})); }