UNPKG

@ui-tool/core

Version:
77 lines 12.2 kB
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==