UNPKG

reactfire

Version:
50 lines (49 loc) 1.82 kB
import * as React from 'react'; import { first, startWith } from 'rxjs/operators'; import { ObservablePromiseCache } from './requestCache'; var requestCache = new ObservablePromiseCache(); export function preloadRequest(getPromise, requestId) { var request = requestCache.createDedupedRequest(getPromise, requestId); return { requestId: requestId, request: request }; } export function preloadObservable(observable$, observableId) { return preloadRequest(function () { return observable$.pipe(first()).toPromise(); }, observableId); } export function usePreloadedRequest(preloadResult) { var request = requestCache.getRequest(preloadResult.requestId); if (!request.isComplete) { throw request.promise; } if (request.error) { throw request.error; } return request.value; } export function useObservable(observable$, observableId, startWithValue) { if (!observableId) { throw new Error('cannot call useObservable without an observableId'); } var result = preloadObservable(observable$, observableId); var initialValue = startWithValue; if (initialValue === undefined) { initialValue = usePreloadedRequest(result); } var _a = React.useState(initialValue), latestValue = _a[0], setValue = _a[1]; React.useEffect(function () { var subscription = observable$.pipe(startWith(initialValue)).subscribe(function (newVal) { result.request.setValue(newVal); setValue(newVal); }, function (error) { console.error('There was an error', error); throw error; }); return function () { subscription.unsubscribe(); requestCache.removeRequest(observableId); }; }, [observableId]); return latestValue; }