UNPKG

ngrx-loading-state

Version:

NgRx Loading State consistently manages loading actions such as API fetches.

28 lines 4 kB
import { filter, map, pipe, withLatestFrom } from 'rxjs'; /** * A ngrx pipeline operator that filters out any actions that does not require the * issuing of API calls. * * Design: Note that whether the action should issue a fetch is done in the reducer, where the * loadingState.issueFetch parameter is updated. We can NOT combine the current state and the * action in the effect to decide if we need to issue an API call, because that could lead to race * conditions. The only guaranteed point of synchronous execution is the reducer. * * @param loadingState$ Observable that emit the current loading state from the store. * @returns Stream that only emits a LoadAction if that that load action should result in an API call. * @example * fetchCount$ = createEffect(() => { * return this.actions$.pipe( * ofType(fetchCount.load), * filterLoading(this.store.select(fetchCountSelectors.state)), * switchMap((action) => { * ... * }) * ); * }); * */ export function filterLoading(loadingState$) { return pipe(withLatestFrom(loadingState$), filter(([_, loadingState]) => loadingState == null || loadingState.issueFetch), map(([action, _]) => action)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy1zdGF0ZS1lZmZlY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdyeC1sb2FkaW5nLXN0YXRlL3NyYy9saWIvbG9hZGluZy1zdGF0ZS9sb2FkaW5nLXN0YXRlLWVmZmVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsSUFBSSxFQUFpQixjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHcEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixhQUF1QztJQUV2QyxPQUFPLElBQUksQ0FDVCxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQzdCLE1BQU0sQ0FDSixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBb0IsRUFBRSxFQUFFLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLENBQUMsVUFBVSxDQUMxRixFQUNELEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBb0IsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQ2hELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIHBpcGUsIFVuYXJ5RnVuY3Rpb24sIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2FkaW5nU3RhdGUgfSBmcm9tICcuL2xvYWRpbmctc3RhdGUtdHlwZXMnO1xuXG4vKipcbiAqIEEgbmdyeCBwaXBlbGluZSBvcGVyYXRvciB0aGF0IGZpbHRlcnMgb3V0IGFueSBhY3Rpb25zIHRoYXQgZG9lcyBub3QgcmVxdWlyZSB0aGVcbiAqIGlzc3Vpbmcgb2YgQVBJIGNhbGxzLlxuICpcbiAqIERlc2lnbjogTm90ZSB0aGF0IHdoZXRoZXIgdGhlIGFjdGlvbiBzaG91bGQgaXNzdWUgYSBmZXRjaCBpcyBkb25lIGluIHRoZSByZWR1Y2VyLCB3aGVyZSB0aGVcbiAqIGxvYWRpbmdTdGF0ZS5pc3N1ZUZldGNoIHBhcmFtZXRlciBpcyB1cGRhdGVkLiBXZSBjYW4gTk9UIGNvbWJpbmUgdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHRoZVxuICogYWN0aW9uIGluIHRoZSBlZmZlY3QgdG8gZGVjaWRlIGlmIHdlIG5lZWQgdG8gaXNzdWUgYW4gQVBJIGNhbGwsIGJlY2F1c2UgdGhhdCBjb3VsZCBsZWFkIHRvIHJhY2VcbiAqIGNvbmRpdGlvbnMuIFRoZSBvbmx5IGd1YXJhbnRlZWQgcG9pbnQgb2Ygc3luY2hyb25vdXMgZXhlY3V0aW9uIGlzIHRoZSByZWR1Y2VyLlxuICpcbiAqIEBwYXJhbSBsb2FkaW5nU3RhdGUkIE9ic2VydmFibGUgdGhhdCBlbWl0IHRoZSBjdXJyZW50IGxvYWRpbmcgc3RhdGUgZnJvbSB0aGUgc3RvcmUuXG4gKiBAcmV0dXJucyBTdHJlYW0gdGhhdCBvbmx5IGVtaXRzIGEgTG9hZEFjdGlvbiBpZiB0aGF0IHRoYXQgbG9hZCBhY3Rpb24gc2hvdWxkIHJlc3VsdCBpbiBhbiBBUEkgY2FsbC5cbiAqIEBleGFtcGxlXG4gKiAgZmV0Y2hDb3VudCQgPSBjcmVhdGVFZmZlY3QoKCkgPT4ge1xuICogICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShcbiAqICAgICAgb2ZUeXBlKGZldGNoQ291bnQubG9hZCksXG4gKiAgICAgIGZpbHRlckxvYWRpbmcodGhpcy5zdG9yZS5zZWxlY3QoZmV0Y2hDb3VudFNlbGVjdG9ycy5zdGF0ZSkpLFxuICogICAgICBzd2l0Y2hNYXAoKGFjdGlvbikgPT4ge1xuICogICAgICAgIC4uLlxuICogICAgICB9KVxuICogICAgKTtcbiAqICB9KTtcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJMb2FkaW5nPFQ+KFxuICBsb2FkaW5nU3RhdGUkOiBPYnNlcnZhYmxlPExvYWRpbmdTdGF0ZT5cbik6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxUPiwgT2JzZXJ2YWJsZTxUPj4ge1xuICByZXR1cm4gcGlwZShcbiAgICB3aXRoTGF0ZXN0RnJvbShsb2FkaW5nU3RhdGUkKSxcbiAgICBmaWx0ZXIoXG4gICAgICAoW18sIGxvYWRpbmdTdGF0ZV06IFtULCBMb2FkaW5nU3RhdGVdKSA9PiBsb2FkaW5nU3RhdGUgPT0gbnVsbCB8fCBsb2FkaW5nU3RhdGUuaXNzdWVGZXRjaFxuICAgICksXG4gICAgbWFwKChbYWN0aW9uLCBfXTogW1QsIExvYWRpbmdTdGF0ZV0pID0+IGFjdGlvbilcbiAgKTtcbn1cbiJdfQ==