UNPKG

ngrx-loading-state

Version:

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

59 lines 8.7 kB
import { FailureHandlerState } from './loading-state/loading-state-types'; import { lodash } from './lodash'; // eslint-disable-next-line @typescript-eslint/no-explicit-any function instanceOfLoadingState(state) { return state?.isLoadingState; } /** * Recursively process all fields of the states. When it encounters a LoadingStateBase object, it * will check if there are failures and needs global failure handling. If global handling is needed, * it shows a snackbar message, and changes the failureHandler to FailureHandlerState.INIT as a way to * mark the failure as having been processed. * */ function processState(options) { const { state, failureAction, failureHandler } = options; if (instanceOfLoadingState(state)) { if (state.error && state.failureHandlerState == FailureHandlerState.GLOBAL) { // Passing back new reference from this reducer is not unnecessary since for each reducer pass // all unhandled global failures are handled and failureHandlerState set to FailureHandlerState.INIT to // mark it as having been processed. // No effects can fire in between the change from GLOBAL to INIT. And since // the loadingState must have changed in response to a failure, it's always a new reference // compared to the old state. state.failureHandlerState = FailureHandlerState.INIT; failureHandler(failureAction, state); } } else { if (lodash.isArray(state)) { // Recursively handle all sub fields. This includes LoadingStateTypes.ID_LOADING_STATE // As per previous comment, we are not creating new state references so editing in-place. state.forEach((field) => processState({ ...options, state: field })); } else if (lodash.isPlainObject(state)) { Object.values(state).forEach((field) => processState({ ...options, state: field })); } } } export function globalFailureReducerFactory(failureHandler) { return (reducer) => { return (state, action) => { state = reducer(state, action); const failureAction = action; // We must ensure that only FailureAction has this field. But we can // easily change this field name to something more unique. if (failureAction.error) { processState({ state, failureHandler: failureHandler, failureAction }); } return state; }; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWZhaWx1cmUtcmVkdWNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25ncngtbG9hZGluZy1zdGF0ZS9zcmMvbGliL2dsb2JhbC1mYWlsdXJlLXJlZHVjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUVMLG1CQUFtQixFQUVwQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJbEMsOERBQThEO0FBQzlELFNBQVMsc0JBQXNCLENBQUMsS0FBVTtJQUN4QyxPQUFRLEtBQXNCLEVBQUUsY0FBYyxDQUFDO0FBQ2pELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxPQUlyQjtJQUNDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUV6RCxJQUFJLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2pDLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksbUJBQW1CLENBQUMsTUFBTSxFQUFFO1lBQzFFLDhGQUE4RjtZQUM5Rix1R0FBdUc7WUFDdkcsb0NBQW9DO1lBQ3BDLDJFQUEyRTtZQUMzRSwyRkFBMkY7WUFDM0YsNkJBQTZCO1lBQzdCLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7WUFFckQsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN0QztLQUNGO1NBQU07UUFDTCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsc0ZBQXNGO1lBQ3RGLHlGQUF5RjtZQUN6RixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDdEIsWUFBWSxDQUFDO2dCQUNYLEdBQUcsT0FBTztnQkFDVixLQUFLLEVBQUUsS0FBSzthQUNiLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMvQyxZQUFZLENBQUM7Z0JBQ1gsR0FBRyxPQUFPO2dCQUNWLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUNILENBQUM7U0FDSDtLQUNGO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxjQUE4QjtJQUN4RSxPQUFPLENBQUMsT0FBZ0MsRUFBMkIsRUFBRTtRQUNuRSxPQUFPLENBQUMsS0FBVSxFQUFFLE1BQVcsRUFBTyxFQUFFO1lBQ3RDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRS9CLE1BQU0sYUFBYSxHQUFHLE1BQWtDLENBQUM7WUFFekQsb0VBQW9FO1lBQ3BFLDBEQUEwRDtZQUMxRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZCLFlBQVksQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7YUFDeEU7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25SZWR1Y2VyLCBNZXRhUmVkdWNlciB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7XG4gIEZhaWx1cmVBY3Rpb24sXG4gIEZhaWx1cmVIYW5kbGVyU3RhdGUsXG4gIExvYWRpbmdTdGF0ZVxufSBmcm9tICcuL2xvYWRpbmctc3RhdGUvbG9hZGluZy1zdGF0ZS10eXBlcyc7XG5pbXBvcnQgeyBsb2Rhc2ggfSBmcm9tICcuL2xvZGFzaCc7XG5cbmV4cG9ydCB0eXBlIEZhaWx1cmVIYW5kbGVyID0gKGZhaWx1cmVBY3Rpb246IEZhaWx1cmVBY3Rpb24sIHN0YXRlOiBMb2FkaW5nU3RhdGUpID0+IHZvaWQ7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBpbnN0YW5jZU9mTG9hZGluZ1N0YXRlKHN0YXRlOiBhbnkpOiBzdGF0ZSBpcyBMb2FkaW5nU3RhdGUge1xuICByZXR1cm4gKHN0YXRlIGFzIExvYWRpbmdTdGF0ZSk/LmlzTG9hZGluZ1N0YXRlO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgYWxsIGZpZWxkcyBvZiB0aGUgc3RhdGVzLiBXaGVuIGl0IGVuY291bnRlcnMgYSBMb2FkaW5nU3RhdGVCYXNlIG9iamVjdCwgaXRcbiAqIHdpbGwgY2hlY2sgaWYgdGhlcmUgYXJlIGZhaWx1cmVzIGFuZCBuZWVkcyBnbG9iYWwgZmFpbHVyZSBoYW5kbGluZy4gSWYgZ2xvYmFsIGhhbmRsaW5nIGlzIG5lZWRlZCxcbiAqIGl0IHNob3dzIGEgc25hY2tiYXIgbWVzc2FnZSwgYW5kIGNoYW5nZXMgdGhlIGZhaWx1cmVIYW5kbGVyIHRvIEZhaWx1cmVIYW5kbGVyU3RhdGUuSU5JVCBhcyBhIHdheSB0b1xuICogbWFyayB0aGUgZmFpbHVyZSBhcyBoYXZpbmcgYmVlbiBwcm9jZXNzZWQuXG4gKlxuICovXG5mdW5jdGlvbiBwcm9jZXNzU3RhdGUob3B0aW9uczoge1xuICBzdGF0ZTogdW5rbm93bjtcbiAgZmFpbHVyZUFjdGlvbjogRmFpbHVyZUFjdGlvbjtcbiAgZmFpbHVyZUhhbmRsZXI6IEZhaWx1cmVIYW5kbGVyO1xufSk6IHZvaWQge1xuICBjb25zdCB7IHN0YXRlLCBmYWlsdXJlQWN0aW9uLCBmYWlsdXJlSGFuZGxlciB9ID0gb3B0aW9ucztcblxuICBpZiAoaW5zdGFuY2VPZkxvYWRpbmdTdGF0ZShzdGF0ZSkpIHtcbiAgICBpZiAoc3RhdGUuZXJyb3IgJiYgc3RhdGUuZmFpbHVyZUhhbmRsZXJTdGF0ZSA9PSBGYWlsdXJlSGFuZGxlclN0YXRlLkdMT0JBTCkge1xuICAgICAgLy8gUGFzc2luZyBiYWNrIG5ldyByZWZlcmVuY2UgZnJvbSB0aGlzIHJlZHVjZXIgaXMgbm90IHVubmVjZXNzYXJ5IHNpbmNlIGZvciBlYWNoIHJlZHVjZXIgcGFzc1xuICAgICAgLy8gYWxsIHVuaGFuZGxlZCBnbG9iYWwgZmFpbHVyZXMgYXJlIGhhbmRsZWQgYW5kIGZhaWx1cmVIYW5kbGVyU3RhdGUgc2V0IHRvIEZhaWx1cmVIYW5kbGVyU3RhdGUuSU5JVCB0b1xuICAgICAgLy8gbWFyayBpdCBhcyBoYXZpbmcgYmVlbiBwcm9jZXNzZWQuXG4gICAgICAvLyBObyBlZmZlY3RzIGNhbiBmaXJlIGluIGJldHdlZW4gdGhlIGNoYW5nZSBmcm9tIEdMT0JBTCB0byBJTklULiBBbmQgc2luY2VcbiAgICAgIC8vIHRoZSBsb2FkaW5nU3RhdGUgbXVzdCBoYXZlIGNoYW5nZWQgaW4gcmVzcG9uc2UgdG8gYSBmYWlsdXJlLCBpdCdzIGFsd2F5cyBhIG5ldyByZWZlcmVuY2VcbiAgICAgIC8vIGNvbXBhcmVkIHRvIHRoZSBvbGQgc3RhdGUuXG4gICAgICBzdGF0ZS5mYWlsdXJlSGFuZGxlclN0YXRlID0gRmFpbHVyZUhhbmRsZXJTdGF0ZS5JTklUO1xuXG4gICAgICBmYWlsdXJlSGFuZGxlcihmYWlsdXJlQWN0aW9uLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChsb2Rhc2guaXNBcnJheShzdGF0ZSkpIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBhbGwgc3ViIGZpZWxkcy4gVGhpcyBpbmNsdWRlcyBMb2FkaW5nU3RhdGVUeXBlcy5JRF9MT0FESU5HX1NUQVRFXG4gICAgICAvLyBBcyBwZXIgcHJldmlvdXMgY29tbWVudCwgd2UgYXJlIG5vdCBjcmVhdGluZyBuZXcgc3RhdGUgcmVmZXJlbmNlcyBzbyBlZGl0aW5nIGluLXBsYWNlLlxuICAgICAgc3RhdGUuZm9yRWFjaCgoZmllbGQpID0+XG4gICAgICAgIHByb2Nlc3NTdGF0ZSh7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBzdGF0ZTogZmllbGRcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsb2Rhc2guaXNQbGFpbk9iamVjdChzdGF0ZSkpIHtcbiAgICAgIE9iamVjdC52YWx1ZXMoc3RhdGUgYXMgb2JqZWN0KS5mb3JFYWNoKChmaWVsZCkgPT5cbiAgICAgICAgcHJvY2Vzc1N0YXRlKHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHN0YXRlOiBmaWVsZFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JhbEZhaWx1cmVSZWR1Y2VyRmFjdG9yeShmYWlsdXJlSGFuZGxlcjogRmFpbHVyZUhhbmRsZXIpOiBNZXRhUmVkdWNlciB7XG4gIHJldHVybiAocmVkdWNlcjogQWN0aW9uUmVkdWNlcjxhbnksIGFueT4pOiBBY3Rpb25SZWR1Y2VyPGFueSwgYW55PiA9PiB7XG4gICAgcmV0dXJuIChzdGF0ZTogYW55LCBhY3Rpb246IGFueSk6IGFueSA9PiB7XG4gICAgICBzdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG5cbiAgICAgIGNvbnN0IGZhaWx1cmVBY3Rpb24gPSBhY3Rpb24gYXMgdW5rbm93biBhcyBGYWlsdXJlQWN0aW9uO1xuXG4gICAgICAvLyBXZSBtdXN0IGVuc3VyZSB0aGF0IG9ubHkgRmFpbHVyZUFjdGlvbiBoYXMgdGhpcyBmaWVsZC4gQnV0IHdlIGNhblxuICAgICAgLy8gZWFzaWx5IGNoYW5nZSB0aGlzIGZpZWxkIG5hbWUgdG8gc29tZXRoaW5nIG1vcmUgdW5pcXVlLlxuICAgICAgaWYgKGZhaWx1cmVBY3Rpb24uZXJyb3IpIHtcbiAgICAgICAgcHJvY2Vzc1N0YXRlKHsgc3RhdGUsIGZhaWx1cmVIYW5kbGVyOiBmYWlsdXJlSGFuZGxlciwgZmFpbHVyZUFjdGlvbiB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH07XG4gIH07XG59XG4iXX0=