UNPKG

@loona/angular

Version:

App State Management done with GraphQL (angular integration)

146 lines 11 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { buildContext, getNameOfMutation, isMutationAsAction, METADATA_KEY, buildGetCacheKey, } from '@loona/core'; import { Injectable, Inject } from '@angular/core'; import { ApolloCache } from 'apollo-cache'; import { Apollo } from 'apollo-angular'; import { Loona } from './client'; import { LOONA_CACHE } from './tokens'; import { ScannedActions } from './actions'; export class Effects { /** * @param {?} loona * @param {?} apollo * @param {?} cache */ constructor(loona, apollo, cache) { this.effects = {}; this.getContext = () => (Object.assign({}, buildContext({ cache, getCacheKey: buildGetCacheKey(cache), }, apollo.getClient()), { dispatch: loona.dispatch.bind(loona) })); } /** * @param {?} instance * @param {?=} meta * @return {?} */ addEffects(instance, meta) { if (!meta) { return; } for (const type in meta) { if (!this.effects[type]) { this.effects[type] = []; } meta[type].forEach(({ propName }) => { this.effects[type].push(instance[propName].bind(instance)); }); } } /** * @param {?} action * @return {?} */ runEffects(action) { /** @type {?} */ let type = action.type; if (isMutationAsAction(action)) { type = getNameOfMutation(action.options.mutation); } /** @type {?} */ const effectsToRun = this.effects[type]; if (effectsToRun) { effectsToRun.forEach(effect => { effect(action, this.getContext()); }); } } } Effects.decorators = [ { type: Injectable } ]; /** @nocollapse */ Effects.ctorParameters = () => [ { type: Loona }, { type: Apollo }, { type: ApolloCache, decorators: [{ type: Inject, args: [LOONA_CACHE,] }] } ]; if (false) { /** @type {?} */ Effects.prototype.effects; /** @type {?} */ Effects.prototype.getContext; } export class EffectsRunner { /** * @param {?} effects * @param {?} scannedActions */ constructor(effects, scannedActions) { this.effects = effects; this.scannedActions = scannedActions; this.actionsSubscription = null; } /** * @return {?} */ start() { if (!this.actionsSubscription) { this.actionsSubscription = this.scannedActions.subscribe(action => { this.effects.runEffects(action); }); } } /** * @return {?} */ ngOnDestroy() { if (this.actionsSubscription) { this.actionsSubscription.unsubscribe(); this.actionsSubscription = null; } } } EffectsRunner.decorators = [ { type: Injectable } ]; /** @nocollapse */ EffectsRunner.ctorParameters = () => [ { type: Effects }, { type: ScannedActions } ]; if (false) { /** @type {?} */ EffectsRunner.prototype.actionsSubscription; /** @type {?} */ EffectsRunner.prototype.effects; /** @type {?} */ EffectsRunner.prototype.scannedActions; } /** * @return {?} */ export function mapStates() { /** @type {?} */ const names = []; /** @type {?} */ const add = (state) => { names.push(state.constructor && state.constructor.name); }; return { names, add }; } /** * @param {?} state * @param {?} injector * @return {?} */ export function extractState(state, injector) { return { instance: injector.get(state), meta: state[METADATA_KEY], }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0cy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bsb29uYS9hbmd1bGFyLyIsInNvdXJjZXMiOlsiZWZmZWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsa0JBQWtCLEVBTWxCLFlBQVksRUFDWixnQkFBZ0IsR0FDakIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQXNCLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3RDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBR3pDLE1BQU0sT0FBTyxPQUFPOzs7Ozs7SUFJbEIsWUFDRSxLQUFZLEVBQ1osTUFBYyxFQUNPLEtBQXVCO1FBTjlDLFlBQU8sR0FBd0MsRUFBRSxDQUFDO1FBUWhELElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsbUJBQ25CLFlBQVksQ0FDYjtZQUNFLEtBQUs7WUFDTCxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO1NBQ3JDLEVBQ0QsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUNuQixJQUNELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFDcEMsQ0FBQztJQUNMLENBQUM7Ozs7OztJQUVELFVBQVUsQ0FBQyxRQUFhLEVBQUUsSUFBdUI7UUFDL0MsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU87U0FDUjtRQUVELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUks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dE5hbWVPZk11dGF0aW9uLFxuICBpc011dGF0aW9uQXNBY3Rpb24sXG4gIE1ldGFkYXRhLFxuICBFZmZlY3RNZXRob2QsXG4gIEFjdGlvbixcbiAgRWZmZWN0Q29udGV4dCxcbiAgU3RhdGVDbGFzcyxcbiAgTUVUQURBVEFfS0VZLFxuICBidWlsZEdldENhY2hlS2V5LFxufSBmcm9tICdAbG9vbmEvY29yZSc7XG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdCwgT25EZXN0cm95LCBJbmplY3Rvcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fwb2xsb0NhY2hlfSBmcm9tICdhcG9sbG8tY2FjaGUnO1xuaW1wb3J0IHtBcG9sbG99IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtMb29uYX0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHtMT09OQV9DQUNIRX0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHtTY2FubmVkQWN0aW9uc30gZnJvbSAnLi9hY3Rpb25zJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEVmZmVjdHMge1xuICBlZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTxFZmZlY3RNZXRob2Q+PiA9IHt9O1xuICBnZXRDb250ZXh0OiAoKSA9PiBFZmZlY3RDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGxvb25hOiBMb29uYSxcbiAgICBhcG9sbG86IEFwb2xsbyxcbiAgICBASW5qZWN0KExPT05BX0NBQ0hFKSBjYWNoZTogQXBvbGxvQ2FjaGU8YW55PixcbiAgKSB7XG4gICAgdGhpcy5nZXRDb250ZXh0ID0gKCkgPT4gKHtcbiAgICAgIC4uLmJ1aWxkQ29udGV4dChcbiAgICAgICAge1xuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGdldENhY2hlS2V5OiBidWlsZEdldENhY2hlS2V5KGNhY2hlKSxcbiAgICAgICAgfSxcbiAgICAgICAgYXBvbGxvLmdldENsaWVudCgpLFxuICAgICAgKSxcbiAgICAgIGRpc3BhdGNoOiBsb29uYS5kaXNwYXRjaC5iaW5kKGxvb25hKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEVmZmVjdHMoaW5zdGFuY2U6IGFueSwgbWV0YT86IE1ldGFkYXRhLkVmZmVjdHMpIHtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHR5cGUgaW4gbWV0YSkge1xuICAgICAgaWYgKCF0aGlzLmVmZmVjdHNbdHlwZV0pIHtcbiAgICAgICAgdGhpcy5lZmZlY3RzW3R5cGVdID0gW107XG4gICAgICB9XG5cbiAgICAgIG1ldGFbdHlwZV0uZm9yRWFjaCgoe3Byb3BOYW1lfSkgPT4ge1xuICAgICAgICB0aGlzLmVmZmVjdHNbdHlwZV0ucHVzaChpbnN0YW5jZVtwcm9wTmFtZV0uYmluZChpbnN0YW5jZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcnVuRWZmZWN0cyhhY3Rpb246IEFjdGlvbikge1xuICAgIGxldCB0eXBlID0gYWN0aW9uLnR5cGU7XG5cbiAgICBpZiAoaXNNdXRhdGlvbkFzQWN0aW9uKGFjdGlvbikpIHtcbiAgICAgIHR5cGUgPSBnZXROYW1lT2ZNdXRhdGlvbihhY3Rpb24ub3B0aW9ucy5tdXRhdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3QgZWZmZWN0c1RvUnVuID0gdGhpcy5lZmZlY3RzW3R5cGVdO1xuXG4gICAgaWYgKGVmZmVjdHNUb1J1bikge1xuICAgICAgZWZmZWN0c1RvUnVuLmZvckVhY2goZWZmZWN0ID0+IHtcbiAgICAgICAgZWZmZWN0KGFjdGlvbiwgdGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFZmZlY3RzUnVubmVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBhY3Rpb25zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVmZmVjdHM6IEVmZmVjdHMsXG4gICAgcHJpdmF0ZSBzY2FubmVkQWN0aW9uczogU2Nhbm5lZEFjdGlvbnMsXG4gICkge31cblxuICBzdGFydCgpIHtcbiAgICBpZiAoIXRoaXMuYWN0aW9uc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5hY3Rpb25zU3Vic2NyaXB0aW9uID0gdGhpcy5zY2FubmVkQWN0aW9ucy5zdWJzY3JpYmUoYWN0aW9uID0+IHtcbiAgICAgICAgdGhpcy5lZmZlY3RzLnJ1bkVmZmVjdHMoYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmFjdGlvbnNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYWN0aW9uc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5hY3Rpb25zU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFN0YXRlcygpIHtcbiAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFkZCA9IChzdGF0ZTogYW55KSA9PiB7XG4gICAgbmFtZXMucHVzaChzdGF0ZS5jb25zdHJ1Y3RvciAmJiBzdGF0ZS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgfTtcblxuICByZXR1cm4ge25hbWVzLCBhZGR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFN0YXRlKFxuICBzdGF0ZTogU3RhdGVDbGFzczxNZXRhZGF0YT4sXG4gIGluamVjdG9yOiBJbmplY3Rvcixcbik6IHtcbiAgaW5zdGFuY2U6IGFueTtcbiAgbWV0YTogTWV0YWRhdGE7XG59IHtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW5qZWN0b3IuZ2V0KHN0YXRlKSxcbiAgICBtZXRhOiBzdGF0ZVtNRVRBREFUQV9LRVldLFxuICB9O1xufVxuIl19