@tarktech/ngx-context
Version:
Angular Context: Easy property binding for router outlet and nested component trees.
86 lines • 11 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';
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==