{ "version": 3, "sources": ["src/app/core/services/breadcrumb.service.ts"], "sourcesContent": ["import { Injectable, OnDestroy } from '@angular/core';\nimport { ActivatedRoute, NavigationEnd, Router, Scroll } from '@angular/router';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { filter, map, switchMap } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class BreadcrumbService implements OnDestroy {\n private _breadcrumbs$: BehaviorSubject;\n private currentBreadcrumb$: BehaviorSubject;\n private subscription: Subscription;\n\n constructor(\n private router: Router,\n private route: ActivatedRoute\n ) {\n this._breadcrumbs$ = new BehaviorSubject([]);\n this.currentBreadcrumb$ = new BehaviorSubject(null);\n this.initializeBreadcrumbHandling();\n }\n\n ngOnDestroy(): void {\n this.unsubscribe();\n }\n\n private initializeBreadcrumbHandling(): void {\n const route$ = this.router.events.pipe(\n filter(\n (event) =>\n event instanceof NavigationEnd ||\n (event instanceof Scroll &&\n event.routerEvent instanceof NavigationEnd)\n ),\n map(() => this.route),\n map((route) => {\n while (route.firstChild) {\n route = route.firstChild;\n }\n return route;\n })\n );\n\n this.subscription = this.calculateBreadcrumbs(route$).subscribe(\n (breadcrumbs) => {\n console.log(\n '🚀 ~ BreadcrumbService ~ initializeBreadcrumbHandling ~ breadcrumbs:',\n breadcrumbs\n );\n this._breadcrumbs$.next(breadcrumbs);\n }\n );\n }\n\n private calculateBreadcrumbs(\n route$: Observable\n ): Observable {\n return route$.pipe(\n switchMap((route) => {\n const breadcrumbs = this.buildBreadcrumbs(route.root);\n this._breadcrumbs$.next(breadcrumbs);\n return this.currentBreadcrumb$;\n }),\n filter((breadcrumb) => !!breadcrumb?.label && !!breadcrumb?.path),\n map((breadcrumbData) => this.modifyBreadcrumbs(breadcrumbData))\n );\n }\n\n private buildBreadcrumbs(\n route: ActivatedRoute,\n url = '',\n breadcrumbs: Breadcrumb[] = []\n ): Breadcrumb[] {\n const breadcrumbValue = route.snapshot.data['breadcrumb'];\n const label =\n typeof route.snapshot.data['breadcrumb'] === 'function'\n ? breadcrumbValue(route.snapshot.data)\n : breadcrumbValue;\n\n const isHomePage = route.routeConfig?.path === '';\n const hasHomeBreadcrumb = breadcrumbs.some(\n (breadcrumb) => breadcrumb.label\n );\n\n if (hasHomeBreadcrumb && isHomePage) {\n return breadcrumbs;\n }\n\n const [segment, ...rest] = route.snapshot.url;\n\n let nextUrl = segment ? `${url}/${segment.path}` : url;\n\n if (rest.length > 0) {\n rest.forEach((param) => {\n nextUrl += `/${param.path}`;\n });\n }\n\n const { queryParams } = this.route.snapshot;\n\n const breadcrumb: Breadcrumb = {\n label,\n path: nextUrl,\n params: breadcrumbs.length > 1 && queryParams\n };\n\n // Only adding route with non-empty label\n const newBreadcrumbs = breadcrumb.path\n ? [...breadcrumbs, breadcrumb]\n : [...breadcrumbs];\n\n if (route.firstChild) {\n return this.buildBreadcrumbs(route.firstChild, nextUrl, newBreadcrumbs);\n }\n\n return newBreadcrumbs;\n }\n\n setBreadcrumb(breadcrumb: Breadcrumb): void {\n this.currentBreadcrumb$.next(breadcrumb);\n }\n\n getBreadcrumbs$(): Observable {\n return this._breadcrumbs$.pipe(\n map((breadcrumbs) =>\n breadcrumbs.filter((breadcrumb) => !!breadcrumb?.label)\n )\n );\n }\n\n private modifyBreadcrumbs(currentBreadcrumbData: Breadcrumb): Breadcrumb[] {\n return this._breadcrumbs$.value.map((breadcrumb) => {\n if (breadcrumb.path.includes(currentBreadcrumbData.path)) {\n return {\n ...breadcrumb,\n path: currentBreadcrumbData.params\n ? `${breadcrumb.path}`\n : breadcrumb.path,\n params: breadcrumb?.params ?? this.route.snapshot.queryParams,\n label: currentBreadcrumbData.label\n };\n } else {\n return {\n ...breadcrumb,\n params: this._breadcrumbs$.value.length < 2 && undefined\n };\n }\n });\n }\n\n private unsubscribe(): void {\n this.subscription.unsubscribe();\n }\n}\n\nexport type Breadcrumb = {\n path: string;\n label: string;\n params?: { [key: string]: string };\n};\n"], "mappings": "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", "names": ["breadcrumb"] }