UNPKG

@harmowatch/ngx-redux-core

Version:

[![Join the chat at https://gitter.im/harmowatch/ngx-redux-core](https://badges.gitter.im/harmowatch/ngx-redux-core.svg)](https://gitter.im/harmowatch/ngx-redux-core?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

72 lines (71 loc) 7.71 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { ReplaySubject } from 'rxjs'; import { ReduxStateDecorator } from '@harmowatch/redux-decorators'; import { ReduxRegistry } from './providers/redux-registry'; /** * @template T */ export class ReduxSelector extends ReplaySubject { /** * @param {?} zone * @param {?=} selector * @param {?=} stateProvider */ constructor(zone, selector = '/', stateProvider) { if (!selector.startsWith(ReduxSelector.DELIMITER) && !stateProvider) { throw new Error('You need to provide a state provider, if you use relative selectors'); } super(1); ReduxRegistry.getStore().then(store => { /** @type {?} */ const next = () => { zone.run(() => { this.next(ReduxSelector.getValueByState(store.getState(), selector, stateProvider)); }); }; store.subscribe(() => next()); next(); // we need to trigger a initial value, otherwise we've to wait until the first state change }); } /** * @param {?} selector * @param {?=} stateProvider * @return {?} */ static normalize(selector, stateProvider) { if (!selector.startsWith(ReduxSelector.DELIMITER)) { /** @type {?} */ const stateName = ReduxStateDecorator.get(stateProvider).name; return `${ReduxSelector.DELIMITER}${stateName}${ReduxSelector.DELIMITER}${selector}`; } return selector; } /** * @template S * @param {?} state * @param {?} selector * @param {?=} stateProvider * @return {?} */ static getValueByState(state, selector, stateProvider) { /** @type {?} */ const value = ReduxSelector.normalize(selector, stateProvider).split(ReduxSelector.DELIMITER) .filter(propertyKey => propertyKey !== '') .reduce((previousValue, propertyKey) => { if (!previousValue || !previousValue.hasOwnProperty(propertyKey)) { return null; } return previousValue[propertyKey]; }, /** @type {?} */ (state)); return value; } } ReduxSelector.DELIMITER = '/'; if (false) { /** @type {?} */ ReduxSelector.DELIMITER; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtc2VsZWN0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaGFybW93YXRjaC9uZ3gtcmVkdXgtY29yZS8iLCJzb3VyY2VzIjpbInJlZHV4LXNlbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRW5FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7OztBQUkzRCxNQUFNLG9CQUF3QixTQUFRLGFBQWdCOzs7Ozs7SUFJcEQsWUFBWSxJQUFZLEVBQ1osUUFBUSxHQUFHLEdBQUcsRUFDZCxhQUF3QztRQUVsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbkUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1NBQ3hGO1FBRUQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRVQsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTs7WUFDcEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO2dCQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO2lCQUNyRixDQUFDLENBQUM7YUFDSixDQUFDO1lBRUYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLElBQUksRUFBRSxDQUFDO1NBQ1IsQ0FBQyxDQUFDO0tBRUo7Ozs7OztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBZ0IsRUFBRSxhQUF3QztRQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUU7O1lBQ2pELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDOUQsT0FBTyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEdBQUcsUUFBUSxFQUFFLENBQUM7U0FDdEY7UUFFRCxPQUFPLFFBQVEsQ0FBQzs7Ozs7Ozs7O0lBR1gsTUFBTSxDQUFDLGVBQWUsQ0FBSSxLQUF3QixFQUN4QixRQUFnQixFQUNoQixhQUF3Qzs7UUFNdkUsTUFBTSxLQUFLLEdBQU0sYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7YUFDN0YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxLQUFLLEVBQUUsQ0FBQzthQUN6QyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ2hFLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxPQUFPLGFBQWEsQ0FBRSxXQUFXLENBQUUsQ0FBQztTQUNyQyxvQkFBRSxLQUFXLEVBQUMsQ0FBQztRQUVsQixPQUFPLEtBQUssQ0FBQzs7OzBCQXBEcUIsR0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUmVkdXhTdGF0ZURlY29yYXRvciB9IGZyb20gJ0BoYXJtb3dhdGNoL3JlZHV4LWRlY29yYXRvcnMnO1xuXG5pbXBvcnQgeyBSZWR1eFJlZ2lzdHJ5IH0gZnJvbSAnLi9wcm92aWRlcnMvcmVkdXgtcmVnaXN0cnknO1xuaW1wb3J0IHsgUmVkdXhSb290U3RhdGUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVkdXgtcm9vdC1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVkdXhTdGF0ZVByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvcmVkdXgtc3RhdGUucHJvdmlkZXInO1xuXG5leHBvcnQgY2xhc3MgUmVkdXhTZWxlY3RvcjxUPiBleHRlbmRzIFJlcGxheVN1YmplY3Q8VD4ge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFTElNSVRFUiA9ICcvJztcblxuICBjb25zdHJ1Y3Rvcih6b25lOiBOZ1pvbmUsXG4gICAgICAgICAgICAgIHNlbGVjdG9yID0gJy8nLFxuICAgICAgICAgICAgICBzdGF0ZVByb3ZpZGVyPzogVHlwZTxSZWR1eFN0YXRlUHJvdmlkZXI+KSB7XG5cbiAgICBpZiAoIXNlbGVjdG9yLnN0YXJ0c1dpdGgoUmVkdXhTZWxlY3Rvci5ERUxJTUlURVIpICYmICFzdGF0ZVByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHByb3ZpZGUgYSBzdGF0ZSBwcm92aWRlciwgaWYgeW91IHVzZSByZWxhdGl2ZSBzZWxlY3RvcnMnKTtcbiAgICB9XG5cbiAgICBzdXBlcigxKTtcblxuICAgIFJlZHV4UmVnaXN0cnkuZ2V0U3RvcmUoKS50aGVuKHN0b3JlID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgIHpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm5leHQoUmVkdXhTZWxlY3Rvci5nZXRWYWx1ZUJ5U3RhdGUoc3RvcmUuZ2V0U3RhdGUoKSwgc2VsZWN0b3IsIHN0YXRlUHJvdmlkZXIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBzdG9yZS5zdWJzY3JpYmUoKCkgPT4gbmV4dCgpKTtcbiAgICAgIG5leHQoKTsgLy8gd2UgbmVlZCB0byB0cmlnZ2VyIGEgaW5pdGlhbCB2YWx1ZSwgb3RoZXJ3aXNlIHdlJ3ZlIHRvIHdhaXQgdW50aWwgdGhlIGZpcnN0IHN0YXRlIGNoYW5nZVxuICAgIH0pO1xuXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG5vcm1hbGl6ZShzZWxlY3Rvcjogc3RyaW5nLCBzdGF0ZVByb3ZpZGVyPzogVHlwZTxSZWR1eFN0YXRlUHJvdmlkZXI+KTogc3RyaW5nIHtcbiAgICBpZiAoIXNlbGVjdG9yLnN0YXJ0c1dpdGgoUmVkdXhTZWxlY3Rvci5ERUxJTUlURVIpKSB7XG4gICAgICBjb25zdCBzdGF0ZU5hbWUgPSBSZWR1eFN0YXRlRGVjb3JhdG9yLmdldChzdGF0ZVByb3ZpZGVyKS5uYW1lO1xuICAgICAgcmV0dXJuIGAke1JlZHV4U2VsZWN0b3IuREVMSU1JVEVSfSR7c3RhdGVOYW1lfSR7UmVkdXhTZWxlY3Rvci5ERUxJTUlURVJ9JHtzZWxlY3Rvcn1gO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RvcjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWVCeVN0YXRlPFM+KHN0YXRlOiBSZWR1eFJvb3RTdGF0ZTxTPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQcm92aWRlcj86IFR5cGU8UmVkdXhTdGF0ZVByb3ZpZGVyPik6IFMge1xuXG4gICAgLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlIGluIGEgY29uc3RhbnQgdG8gcHJldmVudFxuICAgICAqIFwiTWV0YWRhdGEgY29sbGVjdGVkIGNvbnRhaW5zIGFuIGVycm9yIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBhdCBydW50aW1lOiBMYW1iZGEgbm90IHN1cHBvcnRlZC5cIlxuICAgICAqIGVycm9yXG4gICAgICovXG4gICAgY29uc3QgdmFsdWU6IFMgPSBSZWR1eFNlbGVjdG9yLm5vcm1hbGl6ZShzZWxlY3Rvciwgc3RhdGVQcm92aWRlcikuc3BsaXQoUmVkdXhTZWxlY3Rvci5ERUxJTUlURVIpXG4gICAgICAuZmlsdGVyKHByb3BlcnR5S2V5ID0+IHByb3BlcnR5S2V5ICE9PSAnJylcbiAgICAgIC5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgIGlmICghcHJldmlvdXNWYWx1ZSB8fCAhcHJldmlvdXNWYWx1ZS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlWyBwcm9wZXJ0eUtleSBdO1xuICAgICAgfSwgc3RhdGUgYXMge30pO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbn1cbiJdfQ==