reactfire
Version:
Firebase library for React
50 lines (49 loc) • 1.82 kB
JavaScript
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;
}