@wizdm/teleport
Version:
Template teleporting
64 lines • 9.52 kB
JavaScript
import { Injectable, InjectionToken, Inject, Optional } from '@angular/core';
import { filter, map, scan, shareReplay, distinctUntilChanged } from 'rxjs/operators';
import { BehaviorSubject } from 'rxjs';
import * as i0 from "@angular/core";
export const TeleportConfigToken = new InjectionToken('wizdm.teleport.config');
export class TeleportService {
constructor(config) {
this.inner$ = new BehaviorSubject(null);
this.beam$ = this.inner$.pipe(shareReplay((config === null || config === void 0 ? void 0 : config.bufferSize) || 1));
}
/** Beam observable streaming the template to render as they occur */
beam(name) {
return this.beam$.pipe(
// Filters only those instances targetting the requested portal
filter(payload => !payload || payload.target === name),
// Buffers the requests
scan((history, payload) => {
// Clears all the history
if (!payload || payload.action === 'clearAll') {
return [];
}
// Seeks for the given template in the history first
const index = history.findIndex(value => value.template === payload.template);
// Removes the template from the history
if (index >= 0 && payload.action === 'clear') {
return history.splice(index, 1), history;
}
// Activates the new template
if (payload.action === 'activate') {
// If already existing, replaces the payload in place
if (index >= 0) {
return history.splice(index, 1, payload), history;
}
// Pushes the new template otherwise
history.push(payload);
}
return history;
}, []),
// Emits the last template in history or null
map(history => history[history.length - 1] || null), distinctUntilChanged());
}
/** Activates the template at the given target portal */
activate(target, template, data) {
this.inner$.next({ action: 'activate', target, template, data });
}
/** Clears the template from the target portal */
clear(target, template) {
this.inner$.next({ action: 'clear', target, template });
}
/** Clear all the portals */
clearAll() {
this.inner$.next({ action: 'clearAll' });
}
}
TeleportService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TeleportService_Factory() { return new TeleportService(i0.ɵɵinject(TeleportConfigToken, 8)); }, token: TeleportService, providedIn: "root" });
TeleportService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
TeleportService.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [TeleportConfigToken,] }] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZXBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RlbGVwb3J0L3NyYy9saWIvdGVsZXBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFlLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQWMsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUVuRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBaUIsdUJBQXVCLENBQUMsQ0FBQztBQWdCL0YsTUFBTSxPQUFPLGVBQWU7SUFLMUIsWUFBcUQsTUFBc0I7UUFIbkUsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFrQixJQUFJLENBQUMsQ0FBQztRQUsxRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFFLFdBQVcsQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxVQUFVLEtBQUksQ0FBQyxDQUFDLENBQUUsQ0FBQztJQUN4RSxDQUFDO0lBRUQscUVBQXFFO0lBQzlELElBQUksQ0FBQyxJQUFZO1FBRXRCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1FBRXBCLCtEQUErRDtRQUMvRCxNQUFNLENBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBRTtRQUV4RCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBRXpCLHlCQUF5QjtZQUN6QixJQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO2dCQUFFLE9BQU8sRUFBRSxDQUFDO2FBQUU7WUFFNUQsb0RBQW9EO1lBQ3BELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUUsQ0FBQztZQUVoRix3Q0FBd0M7WUFDeEMsSUFBRyxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxFQUFFO2dCQUFFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO2FBQUU7WUFFMUYsNkJBQTZCO1lBQzdCLElBQUcsT0FBTyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7Z0JBRWhDLHFEQUFxRDtnQkFDckQsSUFBRyxLQUFLLElBQUksQ0FBQyxFQUFFO29CQUFFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQztpQkFBRTtnQkFFckUsb0NBQW9DO2dCQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZCO1lBRUQsT0FBTyxPQUFPLENBQUM7UUFFakIsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUVOLDZDQUE2QztRQUM3QyxHQUFHLENBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUUsRUFBRSxvQkFBb0IsRUFBRSxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUVELHdEQUF3RDtJQUNqRCxRQUFRLENBQUMsTUFBYyxFQUFFLFFBQWtDLEVBQUUsSUFBVTtRQUM1RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxpREFBaUQ7SUFDMUMsS0FBSyxDQUFDLE1BQWMsRUFBRSxRQUFrQztRQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDRCQUE0QjtJQUNyQixRQUFRO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDOzs7O1lBakVGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7OzRDQU1jLFFBQVEsWUFBSSxNQUFNLFNBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWYsIEluamVjdGlvblRva2VuLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc2Nhbiwgc2hhcmVSZXBsYXksIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBjb25zdCBUZWxlcG9ydENvbmZpZ1Rva2VuID0gbmV3IEluamVjdGlvblRva2VuPFRlbGVwb3J0Q29uZmlnPignd2l6ZG0udGVsZXBvcnQuY29uZmlnJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVsZXBvcnRDb25maWcge1xuICBidWZmZXJTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVwb3J0UGF5bG9hZCB7XG4gIGFjdGlvbjogJ2FjdGl2YXRlJ3wnY2xlYXInfCdjbGVhckFsbCc7ICBcbiAgdGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxPYmplY3R8bnVsbD47ICBcbiAgdGFyZ2V0Pzogc3RyaW5nO1xuICBkYXRhPzogYW55O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUZWxlcG9ydFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgaW5uZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZWxlcG9ydFBheWxvYWQ+KG51bGwpO1xuICByZWFkb25seSBiZWFtJDogT2JzZXJ2YWJsZTxUZWxlcG9ydFBheWxvYWQ+O1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoVGVsZXBvcnRDb25maWdUb2tlbikgY29uZmlnOiBUZWxlcG9ydENvbmZpZykgeyBcblxuICAgIHRoaXMuYmVhbSQgPSB0aGlzLmlubmVyJC5waXBlKCBzaGFyZVJlcGxheShjb25maWc/LmJ1ZmZlclNpemUgfHwgMSkgKTtcbiAgfVxuXG4gIC8qKiBCZWFtIG9ic2VydmFibGUgc3RyZWFtaW5nIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIgYXMgdGhleSBvY2N1ciAqL1xuICBwdWJsaWMgYmVhbShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRlbGVwb3J0UGF5bG9hZD4ge1xuICAgIFxuICAgIHJldHVybiB0aGlzLmJlYW0kLnBpcGUoIFxuICAgIFxuICAgICAgLy8gRmlsdGVycyBvbmx5IHRob3NlIGluc3RhbmNlcyB0YXJnZXR0aW5nIHRoZSByZXF1ZXN0ZWQgcG9ydGFsXG4gICAgICBmaWx0ZXIoIHBheWxvYWQgPT4gIXBheWxvYWQgfHwgcGF5bG9hZC50YXJnZXQgPT09IG5hbWUgKSxcblxuICAgICAgLy8gQnVmZmVycyB0aGUgcmVxdWVzdHNcbiAgICAgIHNjYW4oIChoaXN0b3J5LCBwYXlsb2FkKSA9PiB7XG5cbiAgICAgICAgLy8gQ2xlYXJzIGFsbCB0aGUgaGlzdG9yeVxuICAgICAgICBpZighcGF5bG9hZCB8fCBwYXlsb2FkLmFjdGlvbiA9PT0gJ2NsZWFyQWxsJykgeyByZXR1cm4gW107IH1cblxuICAgICAgICAvLyBTZWVrcyBmb3IgdGhlIGdpdmVuIHRlbXBsYXRlIGluIHRoZSBoaXN0b3J5IGZpcnN0XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaGlzdG9yeS5maW5kSW5kZXgoIHZhbHVlID0+IHZhbHVlLnRlbXBsYXRlID09PSBwYXlsb2FkLnRlbXBsYXRlICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlcyB0aGUgdGVtcGxhdGUgZnJvbSB0aGUgaGlzdG9yeVxuICAgICAgICBpZihpbmRleCA+PSAwICYmIHBheWxvYWQuYWN0aW9uID09PSAnY2xlYXInKSB7IHJldHVybiBoaXN0b3J5LnNwbGljZShpbmRleCwgMSksIGhpc3Rvcnk7IH1cblxuICAgICAgICAvLyBBY3RpdmF0ZXMgdGhlIG5ldyB0ZW1wbGF0ZVxuICAgICAgICBpZihwYXlsb2FkLmFjdGlvbiA9PT0gJ2FjdGl2YXRlJykgeyBcbiAgICAgICAgXG4gICAgICAgICAgLy8gSWYgYWxyZWFkeSBleGlzdGluZywgcmVwbGFjZXMgdGhlIHBheWxvYWQgaW4gcGxhY2VcbiAgICAgICAgICBpZihpbmRleCA+PSAwKSB7IHJldHVybiBoaXN0b3J5LnNwbGljZShpbmRleCwgMSwgcGF5bG9hZCksIGhpc3Rvcnk7IH1cblxuICAgICAgICAgIC8vIFB1c2hlcyB0aGUgbmV3IHRlbXBsYXRlIG90aGVyd2lzZVxuICAgICAgICAgIGhpc3RvcnkucHVzaChwYXlsb2FkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoaXN0b3J5O1xuXG4gICAgICB9LCBbXSksXG5cbiAgICAgIC8vIEVtaXRzIHRoZSBsYXN0IHRlbXBsYXRlIGluIGhpc3Rvcnkgb3IgbnVsbFxuICAgICAgbWFwKCBoaXN0b3J5ID0+IGhpc3RvcnlbaGlzdG9yeS5sZW5ndGggLSAxXSB8fCBudWxsICksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBBY3RpdmF0ZXMgdGhlIHRlbXBsYXRlIGF0IHRoZSBnaXZlbiB0YXJnZXQgcG9ydGFsICovXG4gIHB1YmxpYyBhY3RpdmF0ZSh0YXJnZXQ6IHN0cmluZywgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPE9iamVjdHxudWxsPiwgZGF0YT86IGFueSkge1xuICAgIHRoaXMuaW5uZXIkLm5leHQoeyBhY3Rpb246ICdhY3RpdmF0ZScsIHRhcmdldCwgdGVtcGxhdGUsIGRhdGEgfSk7XG4gIH1cblxuICAvKiogQ2xlYXJzIHRoZSB0ZW1wbGF0ZSBmcm9tIHRoZSB0YXJnZXQgcG9ydGFsICovXG4gIHB1YmxpYyBjbGVhcih0YXJnZXQ6IHN0cmluZywgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPE9iamVjdHxudWxsPikge1xuICAgIHRoaXMuaW5uZXIkLm5leHQoeyBhY3Rpb246ICdjbGVhcicsIHRhcmdldCwgdGVtcGxhdGUgfSk7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIHRoZSBwb3J0YWxzICovXG4gIHB1YmxpYyBjbGVhckFsbCgpIHsgXG4gICAgdGhpcy5pbm5lciQubmV4dCh7IGFjdGlvbjogJ2NsZWFyQWxsJyB9KTtcbiAgfVxufSJdfQ==