UNPKG

@tarktech/ngx-context

Version:

Angular Context: Easy property binding for router outlet and nested component trees.

86 lines 11 kB
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'; import * as i0 from "@angular/core"; import * as i1 from "./provider.component"; export class AbstractContextConsumer { provider; target; destroy$ = new Subject(); initialized; _contextMap = {}; _consume = ''; 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() { return this.target['_view']?.component || this.target['context']; } constructor(provider, target) { this.provider = provider; this.target = target; } 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(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: AbstractContextConsumer, deps: [{ token: i1.ContextProviderComponent }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: AbstractContextConsumer, inputs: { contextMap: "contextMap", consume: "consume" }, usesOnChanges: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: AbstractContextConsumer, decorators: [{ type: Directive }], ctorParameters: function () { return [{ type: i1.ContextProviderComponent }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { contextMap: [{ type: Input }], consume: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3VtZXIuYWJzdHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29udGV4dC9zcmMvbGliL2NvbnN1bWVyLmFic3RyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQyxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUloRSxNQUFNLE9BQU8sdUJBQXVCO0lBNkJ0QjtJQUNBO0lBN0JGLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQy9CLFdBQVcsQ0FBVTtJQUNyQixXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLFFBQVEsR0FBc0IsRUFBRSxDQUFDO0lBRTNDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXJCLElBQ0ksVUFBVSxDQUFDLEdBQWU7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksT0FBTyxDQUFDLE9BQTBCO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FB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LElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO3VHQXRGVSx1QkFBdUI7MkZBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkFEbkMsU0FBUzsrSUFVSixVQUFVO3NCQURiLEtBQUs7Z0JBU0YsT0FBTztzQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBwYXJzZUtleXMgfSBmcm9tICcuL2ludGVybmFscyc7XHJcbmltcG9ydCB7IENvbnRleHRQcm92aWRlckNvbXBvbmVudCB9IGZyb20gJy4vcHJvdmlkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29udGV4dE1hcCB9IGZyb20gJy4vc3ltYm9scyc7XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGNsYXNzIEFic3RyYWN0Q29udGV4dENvbnN1bWVyPFQ+IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgcHJvdGVjdGVkIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9jb250ZXh0TWFwID0ge307XHJcbiAgcHJvdGVjdGVkIF9jb25zdW1lOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xyXG5cclxuICBjb25zdW1lZCA9IG5ldyBNYXAoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY29udGV4dE1hcChtYXA6IENvbnRleHRNYXApIHtcclxuICAgIHRoaXMuX2NvbnRleHRNYXAgPSBtYXAgfHwge307XHJcbiAgfVxyXG4gIGdldCBjb250ZXh0TWFwKCk6IENvbnRleHRNYXAge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHRNYXA7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb25zdW1lKGNvbnN1bWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLl9jb25zdW1lID0gY29uc3VtZSB8fCAnJztcclxuICB9XHJcbiAgZ2V0IGNvbnN1bWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnN1bWU7XHJcbiAgfVxyXG5cclxuICBnZXQgY29tcG9uZW50KCk6IFQge1xyXG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0WydfdmlldyddPy5jb21wb25lbnQgfHwgdGhpcy50YXJnZXRbJ2NvbnRleHQnXVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgcHJvdmlkZXI6IENvbnRleHRQcm92aWRlckNvbXBvbmVudCxcclxuICAgIHByb3RlY3RlZCB0YXJnZXQ6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkge31cclxuXHJcbiAgcHJvdGVjdGVkIGluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25zdW1lZDogc3RyaW5nW10gPSBwYXJzZUtleXModGhpcy5jb25zdW1lKTtcclxuXHJcbiAgICB0aGlzLnByb3ZpZGVyLnJlc2V0JFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5uZ09uQ2hhbmdlcygpKTtcclxuXHJcbiAgICBpZiAodGhpcy5wcm92aWRlci5wcm92aWRlLmxlbmd0aClcclxuICAgICAgdGhpcy5wcm92aWRlci5jaGFuZ2UkXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgICBzdGFydFdpdGgoLi4uQXJyYXkuZnJvbSh0aGlzLnByb3ZpZGVyLnByb3ZpZGVkLmtleXMoKSkpLFxyXG4gICAgICAgICAgZmlsdGVyKGtleSA9PiAhIWtleSksXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUocHJvdmlkZXJLZXkgPT4gdGhpcy5zeW5jUHJvcGVydGllcyhjb25zdW1lZCwgcHJvdmlkZXJLZXkpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3VtZWQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFtrZXldID0gdmFsdWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNvbnN1bWVkLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3luY1Byb3BlcnRpZXMoY29uc3VtZWQ6IHN0cmluZ1tdLCBwcm92aWRlcktleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQga2V5ID0gdGhpcy5wcm92aWRlci5jb250ZXh0TWFwW3Byb3ZpZGVyS2V5XSB8fCBwcm92aWRlcktleTtcclxuICAgIGtleSA9IHRoaXMuY29udGV4dE1hcFtrZXldIHx8IGtleTtcclxuXHJcbiAgICBpZiAoY29uc3VtZWQubGVuZ3RoICYmIGNvbnN1bWVkLmluZGV4T2Yoa2V5KSA8IDApIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXRoaXMuY29uc3VtZWQuaGFzKGtleSkpIHRoaXMuY29uc3VtZWQuc2V0KGtleSwgdGhpcy5jb21wb25lbnRba2V5XSk7XHJcblxyXG4gICAgdGhpcy5jb21wb25lbnRba2V5XSA9IHRoaXMucHJvdmlkZXIuY29tcG9uZW50W3Byb3ZpZGVyS2V5XTtcclxuICAgIHRoaXMudGFyZ2V0Lm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuXHJcbiAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgaWYgKHRoaXMudGFyZ2V0ICYmIHRoaXMucHJvdmlkZXIpIHRoaXMuaW5pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB0aGlzLm5nT25DaGFuZ2VzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==