ngx-context
Version:
Angular Context: Easy property binding for router outlet and nested component trees.
84 lines • 9.96 kB
JavaScript
import { ChangeDetectorRef, Directive, Input } from '@angular/core';
import { Subject } from 'rxjs';
import { filter, startWith, takeUntil } from 'rxjs/operators';
import { parseKeys } from './internals';
import { ContextProviderComponent } from './provider.component';
export class AbstractContextConsumer {
constructor(provider, target) {
this.provider = provider;
this.target = target;
this.destroy$ = new Subject();
this._contextMap = {};
this._consume = '';
this.consumed = new Map();
}
set contextMap(map) {
this._contextMap = map || {};
}
get contextMap() {
return this._contextMap;
}
set consume(consume) {
this._consume = consume || '';
}
get consume() {
return this._consume;
}
get component() {
var _a;
return ((_a = this.target['_view']) === null || _a === void 0 ? void 0 : _a.component) || this.target['context'];
}
init() {
const consumed = parseKeys(this.consume);
this.provider.reset$
.pipe(takeUntil(this.destroy$))
.subscribe(() => this.ngOnChanges());
if (this.provider.provide.length)
this.provider.change$
.pipe(takeUntil(this.destroy$), startWith(...Array.from(this.provider.provided.keys())), filter(key => !!key))
.subscribe(providerKey => this.syncProperties(consumed, providerKey));
}
reset() {
this.consumed.forEach((value, key) => {
this.component[key] = value;
});
this.consumed.clear();
}
syncProperties(consumed, providerKey) {
let key = this.provider.contextMap[providerKey] || providerKey;
key = this.contextMap[key] || key;
if (consumed.length && consumed.indexOf(key) < 0)
return;
if (!this.consumed.has(key))
this.consumed.set(key, this.component[key]);
this.component[key] = this.provider.component[providerKey];
this.target.markForCheck();
}
ngOnChanges() {
if (this.initialized) {
this.destroy$.next();
this.reset();
if (this.target && this.provider)
this.init();
}
}
ngOnDestroy() {
this.destroy$.next();
}
ngOnInit() {
this.initialized = true;
this.ngOnChanges();
}
}
AbstractContextConsumer.decorators = [
{ type: Directive }
];
AbstractContextConsumer.ctorParameters = () => [
{ type: ContextProviderComponent },
{ type: ChangeDetectorRef }
];
AbstractContextConsumer.propDecorators = {
contextMap: [{ type: Input }],
consume: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3VtZXIuYWJzdHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29udGV4dC9zcmMvbGliL2NvbnN1bWVyLmFic3RyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQyxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJaEUsTUFBTSxPQUFPLHVCQUF1QjtJQTRCbEMsWUFDWSxRQUFrQyxFQUNsQyxNQUF5QjtRQUR6QixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQTdCM0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFL0IsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsYUFBUSxHQUFzQixFQUFFLENBQUM7UUFFM0MsYUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUF5QmxCLENBQUM7SUF2QkosSUFDSSxVQUFVLENBQUMsR0FBZTtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFDSSxPQUFPLENBQUMsT0FBMEI7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxP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QVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7OztZQXZGRixTQUFTOzs7WUFIRCx3QkFBd0I7WUFKeEIsaUJBQWlCOzs7eUJBZ0J2QixLQUFLO3NCQVFMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHBhcnNlS2V5cyB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB7IENvbnRleHRQcm92aWRlckNvbXBvbmVudCB9IGZyb20gJy4vcHJvdmlkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbnRleHRNYXAgfSBmcm9tICcuL3N5bWJvbHMnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBBYnN0cmFjdENvbnRleHRDb25zdW1lcjxUPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQge1xuICBwcm90ZWN0ZWQgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfY29udGV4dE1hcCA9IHt9O1xuICBwcm90ZWN0ZWQgX2NvbnN1bWU6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG5cbiAgY29uc3VtZWQgPSBuZXcgTWFwKCk7XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbnRleHRNYXAobWFwOiBDb250ZXh0TWFwKSB7XG4gICAgdGhpcy5fY29udGV4dE1hcCA9IG1hcCB8fCB7fTtcbiAgfVxuICBnZXQgY29udGV4dE1hcCgpOiBDb250ZXh0TWFwIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dE1hcDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBjb25zdW1lKGNvbnN1bWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY29uc3VtZSA9IGNvbnN1bWUgfHwgJyc7XG4gIH1cbiAgZ2V0IGNvbnN1bWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9jb25zdW1lO1xuICB9XG5cbiAgZ2V0IGNvbXBvbmVudCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRbJ192aWV3J10/LmNvbXBvbmVudCB8fCB0aGlzLnRhcmdldFsnY29udGV4dCddXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcHJvdmlkZXI6IENvbnRleHRQcm92aWRlckNvbXBvbmVudCxcbiAgICBwcm90ZWN0ZWQgdGFyZ2V0OiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBpbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnN1bWVkOiBzdHJpbmdbXSA9IHBhcnNlS2V5cyh0aGlzLmNvbnN1bWUpO1xuXG4gICAgdGhpcy5wcm92aWRlci5yZXNldCRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5uZ09uQ2hhbmdlcygpKTtcblxuICAgIGlmICh0aGlzLnByb3ZpZGVyLnByb3ZpZGUubGVuZ3RoKVxuICAgICAgdGhpcy5wcm92aWRlci5jaGFuZ2UkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICBzdGFydFdpdGgoLi4uQXJyYXkuZnJvbSh0aGlzLnByb3ZpZGVyLnByb3ZpZGVkLmtleXMoKSkpLFxuICAgICAgICAgIGZpbHRlcihrZXkgPT4gISFrZXkpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUocHJvdmlkZXJLZXkgPT4gdGhpcy5zeW5jUHJvcGVydGllcyhjb25zdW1lZCwgcHJvdmlkZXJLZXkpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnN1bWVkLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIHRoaXMuY29tcG9uZW50W2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29uc3VtZWQuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW5jUHJvcGVydGllcyhjb25zdW1lZDogc3RyaW5nW10sIHByb3ZpZGVyS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQga2V5ID0gdGhpcy5wcm92aWRlci5jb250ZXh0TWFwW3Byb3ZpZGVyS2V5XSB8fCBwcm92aWRlcktleTtcbiAgICBrZXkgPSB0aGlzLmNvbnRleHRNYXBba2V5XSB8fCBrZXk7XG5cbiAgICBpZiAoY29uc3VtZWQubGVuZ3RoICYmIGNvbnN1bWVkLmluZGV4T2Yoa2V5KSA8IDApIHJldHVybjtcblxuICAgIGlmICghdGhpcy5jb25zdW1lZC5oYXMoa2V5KSkgdGhpcy5jb25zdW1lZC5zZXQoa2V5LCB0aGlzLmNvbXBvbmVudFtrZXldKTtcblxuICAgIHRoaXMuY29tcG9uZW50W2tleV0gPSB0aGlzLnByb3ZpZGVyLmNvbXBvbmVudFtwcm92aWRlcktleV07XG4gICAgdGhpcy50YXJnZXQubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG5cbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLnByb3ZpZGVyKSB0aGlzLmluaXQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMubmdPbkNoYW5nZXMoKTtcbiAgfVxufVxuIl19