diff --git a/src/app/dynamic-renderer/page-resolver/page-resolver.service.ts b/src/app/dynamic-renderer/page-resolver/page-resolver.service.ts new file mode 100644 index 0000000..5d874ca --- /dev/null +++ b/src/app/dynamic-renderer/page-resolver/page-resolver.service.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import { map, Observable } from 'rxjs'; +import { ConfigService } from '../../core/config/config.service'; +import { PageConfig } from '../../shared/models/config'; + +@Injectable({ providedIn: 'root' }) +export class PageResolverService { + constructor(private readonly configService: ConfigService) {} + + resolveByUrl(url: string): Observable { + const pagePath = this.toPagePath(url); + + return this.configService.loadBootstrap().pipe( + map((bootstrap) => { + return ( + bootstrap.pages.find((page) => { + if (page.visible === false) { + return false; + } + + return this.normalizePath(page.route.path) === pagePath; + }) ?? null + ); + }) + ); + } + + private toPagePath(url: string): string { + const noHash = url.split('#')[0]; + const noQuery = noHash.split('?')[0]; + const segments = noQuery.split('/').filter(Boolean); + const withoutLang = segments.length > 0 ? segments.slice(1) : []; + + if (withoutLang.length === 0) { + return '/'; + } + + return this.normalizePath(`/${withoutLang.join('/')}`); + } + + private normalizePath(path: string): string { + const trimmed = path.trim(); + if (!trimmed || trimmed === '/') { + return '/'; + } + + return `/${trimmed.replace(/^\/+/, '').replace(/\/+$/, '')}`; + } +} diff --git a/src/app/facades/website/website-runtime.facade.ts b/src/app/facades/website/website-runtime.facade.ts index fd49453..893300a 100644 --- a/src/app/facades/website/website-runtime.facade.ts +++ b/src/app/facades/website/website-runtime.facade.ts @@ -1,16 +1,16 @@ import { Injectable } from '@angular/core'; import { Observable, map } from 'rxjs'; -import { ConfigService } from '../../core/config/config.service'; import { BrandingEngineService } from '../../theme/runtime/branding-engine.service'; import { ThemeEngineService } from '../../theme/runtime/theme-engine.service'; import { PageRendererService } from '../../dynamic-renderer/page-renderer/page-renderer.service'; import { PageRenderModel } from '../../dynamic-renderer/page-renderer/page-renderer.model'; import { WidgetRegistryBootstrapService } from '../../widgets/registry/widget-registry.bootstrap.service'; +import { PageResolverService } from '../../dynamic-renderer/page-resolver/page-resolver.service'; @Injectable({ providedIn: 'root' }) export class WebsiteRuntimeFacade { constructor( - private readonly configService: ConfigService, + private readonly pageResolver: PageResolverService, private readonly pageRenderer: PageRendererService, private readonly registryBootstrap: WidgetRegistryBootstrapService, private readonly themeEngine: ThemeEngineService, @@ -23,10 +23,9 @@ export class WebsiteRuntimeFacade { this.brandingEngine.initialize(); } - getPageRenderModel(pageKey: string): Observable { - return this.configService.loadBootstrap().pipe( - map(bootstrap => { - const page = bootstrap.pages.find(p => p.key === pageKey && p.visible !== false); + getPageRenderModelForUrl(url: string): Observable { + return this.pageResolver.resolveByUrl(url).pipe( + map(page => { return page ? this.pageRenderer.toRenderModel(page) : null; }) ); diff --git a/src/app/pages/public/platform-home.component.ts b/src/app/pages/public/platform-home.component.ts index fa63385..b11a1a3 100644 --- a/src/app/pages/public/platform-home.component.ts +++ b/src/app/pages/public/platform-home.component.ts @@ -1,4 +1,5 @@ -import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; +import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core'; +import { Router } from '@angular/router'; import { DynamicPageLayoutComponent } from '../../layouts/containers/dynamic-page-layout.component'; import { PageRenderModel } from '../../dynamic-renderer/page-renderer/page-renderer.model'; import { WebsiteRuntimeFacade } from '../../facades/website/website-runtime.facade'; @@ -26,10 +27,11 @@ import { WebsiteRuntimeFacade } from '../../facades/website/website-runtime.faca export class PlatformHomeComponent { readonly model = signal(null); readonly loading = signal(true); + private readonly router = inject(Router); constructor(private readonly websiteRuntime: WebsiteRuntimeFacade) { this.websiteRuntime.initializeRuntime(); - this.websiteRuntime.getPageRenderModel('home').subscribe({ + this.websiteRuntime.getPageRenderModelForUrl(this.router.url).subscribe({ next: (model) => { this.model.set(model); this.loading.set(false); diff --git a/src/assets/mock/bootstrap/bootstrap.json b/src/assets/mock/bootstrap/bootstrap.json index d27321b..2f2328f 100644 --- a/src/assets/mock/bootstrap/bootstrap.json +++ b/src/assets/mock/bootstrap/bootstrap.json @@ -221,7 +221,7 @@ "key": "home", "title": "Home", "route": { - "path": "/", + "path": "/platform", "exact": true }, "layout": "default-public",