@ui-tool/core
Version:
77 lines • 12.2 kB
JavaScript
import { InjectFlags } from '@angular/core';
import { from } from 'rxjs';
import { Router } from '@angular/router';
import { merge as lodashMerge } from 'lodash-es';
import { SMART_NAVIGATOR_ROUTES, SMART_NAVIGATOR_SCREEN_CODE_RESOLVER } from '../../constants/injectors/injectors';
import { SmartNavigatorExceptions } from '../../constants/smart-navigator-exceptions';
export class SmartNavigatorService {
//#endregion
//#region Constructor
constructor(injector) {
this.injector = injector;
const codeToUrlMappings = this.injector.get(SMART_NAVIGATOR_ROUTES);
this._router = this.injector.get(Router);
this._screenCodeResolvers = this.injector.get(SMART_NAVIGATOR_SCREEN_CODE_RESOLVER, null, InjectFlags.Optional);
this.__codeToUrlMappings = {};
if (codeToUrlMappings) {
this.__codeToUrlMappings = lodashMerge({}, codeToUrlMappings);
}
}
//#endregion
//#endregion
//#region Methods
// Navigate to a screen by using screen code.
navigateToScreenAsync(request) {
if (!request) {
throw new Error(SmartNavigatorExceptions.invalidNavigationRequest);
}
// Get raw url from screen code.
const rawUrl = this.loadRawUrl(request.code);
const compiled = this.__template(rawUrl);
const fullUrl = compiled(request.routeParams);
return from(this._router.navigate([fullUrl], request.extras));
}
// Get raw url.
loadRawUrl(code) {
if (!code || !code.length) {
throw new Error(SmartNavigatorExceptions.invalidScreenCode);
}
let url = this.__codeToUrlMappings[code];
if (url) {
return url;
}
const screenCodeResolvers = this._screenCodeResolvers;
if (!screenCodeResolvers || !screenCodeResolvers.length) {
throw new Error(SmartNavigatorExceptions.invalidScreenCode);
}
for (const screenCodeResolver of screenCodeResolvers) {
url = screenCodeResolver.loadUrl(code);
if (url && url.length) {
return url;
}
}
throw new Error(SmartNavigatorExceptions.invalidScreenCode);
}
// Build url tree.
buildUrlTree(screenCode, routeParams, extras) {
const rawUrl = this.loadRawUrl(screenCode) || '';
const compiled = this.__template(rawUrl);
const fullUrl = compiled(routeParams);
const urlTree = this._router.createUrlTree([fullUrl], extras);
return urlTree;
}
buildUrlTreeFromNavigationRequest(navigationRequest) {
return this.buildUrlTree(navigationRequest.code, navigationRequest.routeParams, navigationRequest.extras);
}
__template(value) {
return (params) => {
let rawValue = `${value ?? ''}`;
const rawParams = params || {};
Object.keys(rawParams).forEach(key => {
rawValue = rawValue.split('{{' + key + '}}').join(rawParams[key]);
});
return rawValue;
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtbmF2aWdhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL3NlcnZpY2VzL2ltcGxlbWVudGF0aW9ucy9zbWFydC1uYXZpZ2F0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFvQixNQUFNLEVBQVcsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUduSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV0RixNQUFNLE9BQU8scUJBQXFCO0lBV2hDLFlBQVk7SUFFWixxQkFBcUI7SUFFckIsWUFBNkIsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUU3QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsb0NBQW9DLEVBQ2hGLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFpQyxDQUFDO1FBQzlELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFFOUIsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxD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QUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbkMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUM7SUFDSixDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJU21hcnROYXZpZ2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zbWFydC1uYXZpZ2F0b3Itc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW5qZWN0RmxhZ3MsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRXh0cmFzLCBSb3V0ZXIsIFVybFRyZWUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgbWVyZ2UgYXMgbG9kYXNoTWVyZ2UgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgU01BUlRfTkFWSUdBVE9SX1JPVVRFUywgU01BUlRfTkFWSUdBVE9SX1NDUkVFTl9DT0RFX1JFU09MVkVSIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2luamVjdG9ycy9pbmplY3RvcnMnO1xuaW1wb3J0IHsgTmF2aWdhdGVUb1NjcmVlblJlcXVlc3QgfSBmcm9tICcuLi8uLi9tb2RlbHMvaW1wbGVtZW50YXRpb25zL3NtYXJ0LW5hdmlnYXRvcnMvbmF2aWdhdGUtdG8tc2NyZWVuLXJlcXVlc3QnO1xuaW1wb3J0IHsgSVNjcmVlbkNvZGVSZXNvbHZlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2NyZWVuLWNvZGUtcmVzb2x2ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNtYXJ0TmF2aWdhdG9yRXhjZXB0aW9ucyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9zbWFydC1uYXZpZ2F0b3ItZXhjZXB0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBTbWFydE5hdmlnYXRvclNlcnZpY2UgaW1wbGVtZW50cyBJU21hcnROYXZpZ2F0b3JTZXJ2aWNlIHtcblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX19jb2RlVG9VcmxNYXBwaW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG5cbiAgcHJvdGVjdGVkIF9yb3V0ZXI6IFJvdXRlcjtcblxuICBwcm90ZWN0ZWQgX3NjcmVlbkNvZGVSZXNvbHZlcnM6IElTY3JlZW5Db2RlUmVzb2x2ZXJbXTtcblxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb25zdHJ1Y3RvclxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XG5cbiAgICBjb25zdCBjb2RlVG9VcmxNYXBwaW5ncyA9IHRoaXMuaW5qZWN0b3IuZ2V0KFNNQVJUX05BVklHQVRPUl9ST1VURVMpO1xuICAgIHRoaXMuX3JvdXRlciA9IHRoaXMuaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgdGhpcy5fc2NyZWVuQ29kZVJlc29sdmVycyA9IHRoaXMuaW5qZWN0b3IuZ2V0KFNNQVJUX05BVklHQVRPUl9TQ1JFRU5fQ09ERV9SRVNPTFZFUixcbiAgICAgIG51bGwsIEluamVjdEZsYWdzLk9wdGlvbmFsKSBhcyBhbnkgYXMgSVNjcmVlbkNvZGVSZXNvbHZlcltdO1xuICAgIHRoaXMuX19jb2RlVG9VcmxNYXBwaW5ncyA9IHt9O1xuXG4gICAgaWYgKGNvZGVUb1VybE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9fY29kZVRvVXJsTWFwcGluZ3MgPSBsb2Rhc2hNZXJnZSh7fSwgY29kZVRvVXJsTWFwcGluZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBNZXRob2RzXG5cbiAgLy8gTmF2aWdhdGUgdG8gYSBzY3JlZW4gYnkgdXNpbmcgc2NyZWVuIGNvZGUuXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvU2NyZWVuQXN5bmMocmVxdWVzdDogTmF2aWdhdGVUb1NjcmVlblJlcXVlc3Q8YW55Pik6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuXG4gICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoU21hcnROYXZpZ2F0b3JFeGNlcHRpb25zLmludmFsaWROYXZpZ2F0aW9uUmVxdWVzdCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHJhdyB1cmwgZnJvbSBzY3JlZW4gY29kZS5cbiAgICBjb25zdCByYXdVcmwgPSB0aGlzLmxvYWRSYXdVcmwocmVxdWVzdC5jb2RlKTtcblxuICAgIGNvbnN0IGNvbXBpbGVkID0gdGhpcy5fX3RlbXBsYXRlKHJhd1VybCk7XG4gICAgY29uc3QgZnVsbFVybCA9IGNvbXBpbGVkKHJlcXVlc3Qucm91dGVQYXJhbXMpO1xuXG4gICAgcmV0dXJuIGZyb20odGhpcy5fcm91dGVyLm5hdmlnYXRlKFtmdWxsVXJsXSwgcmVxdWVzdC5leHRyYXMpKTtcbiAgfVxuXG4gIC8vIEdldCByYXcgdXJsLlxuICBwdWJsaWMgbG9hZFJhd1VybChjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghY29kZSB8fCAhY29kZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihTbWFydE5hdmlnYXRvckV4Y2VwdGlvbnMuaW52YWxpZFNjcmVlbkNvZGUpO1xuICAgIH1cblxuICAgIGxldCB1cmw6IHN0cmluZyB8IG51bGwgPSB0aGlzLl9fY29kZVRvVXJsTWFwcGluZ3NbY29kZV07XG4gICAgaWYgKHVybCkge1xuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JlZW5Db2RlUmVzb2x2ZXJzID0gdGhpcy5fc2NyZWVuQ29kZVJlc29sdmVycztcbiAgICBpZiAoIXNjcmVlbkNvZGVSZXNvbHZlcnMgfHwgIXNjcmVlbkNvZGVSZXNvbHZlcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoU21hcnROYXZpZ2F0b3JFeGNlcHRpb25zLmludmFsaWRTY3JlZW5Db2RlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNjcmVlbkNvZGVSZXNvbHZlciBvZiBzY3JlZW5Db2RlUmVzb2x2ZXJzKSB7XG4gICAgICB1cmwgPSBzY3JlZW5Db2RlUmVzb2x2ZXIubG9hZFVybChjb2RlKTtcbiAgICAgIGlmICh1cmwgJiYgdXJsLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihTbWFydE5hdmlnYXRvckV4Y2VwdGlvbnMuaW52YWxpZFNjcmVlbkNvZGUpO1xuICB9XG5cbiAgLy8gQnVpbGQgdXJsIHRyZWUuXG4gIHB1YmxpYyBidWlsZFVybFRyZWUoc2NyZWVuQ29kZTogc3RyaW5nLCByb3V0ZVBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogYW55OyB9LFxuICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcz86IE5hdmlnYXRpb25FeHRyYXMpOiBVcmxUcmVlIHtcbiAgICBjb25zdCByYXdVcmwgPSB0aGlzLmxvYWRSYXdVcmwoc2NyZWVuQ29kZSkgfHwgJyc7XG4gICAgY29uc3QgY29tcGlsZWQgPSB0aGlzLl9fdGVtcGxhdGUocmF3VXJsKTtcbiAgICBjb25zdCBmdWxsVXJsID0gY29tcGlsZWQocm91dGVQYXJhbXMpO1xuXG4gICAgY29uc3QgdXJsVHJlZSA9IHRoaXMuX3JvdXRlci5jcmVhdGVVcmxUcmVlKFtmdWxsVXJsXSwgZXh0cmFzKTtcbiAgICByZXR1cm4gdXJsVHJlZTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZFVybFRyZWVGcm9tTmF2aWdhdGlvblJlcXVlc3Q8VD4obmF2aWdhdGlvblJlcXVlc3Q6IE5hdmlnYXRlVG9TY3JlZW5SZXF1ZXN0PFQ+KTogVXJsVHJlZSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRVcmxUcmVlKG5hdmlnYXRpb25SZXF1ZXN0LmNvZGUsIG5hdmlnYXRpb25SZXF1ZXN0LnJvdXRlUGFyYW1zLCBuYXZpZ2F0aW9uUmVxdWVzdC5leHRyYXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3RlbXBsYXRlKHZhbHVlOiBzdHJpbmcpOiAocGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gc3RyaW5nIHtcbiAgICByZXR1cm4gKHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcgPT4ge1xuICAgICAgbGV0IHJhd1ZhbHVlID0gYCR7dmFsdWUgPz8gJyd9YDtcbiAgICAgIGNvbnN0IHJhd1BhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHJhd1BhcmFtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICByYXdWYWx1ZSA9IHJhd1ZhbHVlLnNwbGl0KCd7eycgKyBrZXkgKyAnfX0nKS5qb2luKHJhd1BhcmFtc1trZXldKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJhd1ZhbHVlO1xuICAgIH07XG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==