{"version":3,"file":"chunk-d5u5wub8.js","sources":["packages/vanilla/lib/features/header/src/header.service.ts"],"sourcesContent":["import { Injectable, Type, WritableSignal, computed, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport {\n DslService,\n DynamicComponentsRegistry,\n ElementRepositoryService,\n MenuContentItem,\n MenuItemsService,\n MenuSection,\n NavigationService,\n ResizeObserverService,\n VanillaDynamicComponentsCategory,\n VanillaElements,\n} from '@frontend/vanilla/core';\nimport { MenuItemHighlightService } from '@frontend/vanilla/shared/menu-item';\nimport { BehaviorSubject, Observable, ReplaySubject, Subject, debounceTime, distinctUntilChanged, map, of, startWith, switchMap } from 'rxjs';\n\nimport { HeaderConfig, HeaderConfigElements } from './header.client-config';\n\n/**\n * @whatItDoes Provides utility functions for manipulating the header\n *\n * @description\n *\n * # Overview\n * This provides functionality for manipulating the header:\n * - Get header height\n * - Highlight product\n * - show/hide\n * @stable\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class HeaderService {\n currentHighlightedProductName: string | null = null;\n\n readonly unauthItems = signal(null);\n readonly productItems = signal(null);\n readonly pillItems = signal(null);\n readonly balance = signal(null);\n readonly bonusBalance = signal(null);\n readonly activeProduct = signal(null);\n readonly headerVisible = signal(false);\n readonly headerElementRect = signal<{ width: number; height: number }>({ width: 0, height: 0 });\n readonly headerComponentRect = signal<{ width: number; height: number }>({ width: 0, height: 0 });\n readonly hasHeaderElement = computed(() => this.headerComponentRect().width !== 0 || this.headerComponentRect().height !== 0);\n\n private highlightedProductEvents = new BehaviorSubject(null);\n private headerDisplayEvents: BehaviorSubject = new BehaviorSubject(true);\n private disabledItems: string[] = [];\n\n /** @internal */\n get highlightedProduct(): Observable {\n return this.highlightedProductEvents;\n }\n\n /** Observable of when the header is shown or hidden. Will instantly return current value to subscribers. */\n get display(): Observable {\n return this.headerDisplayEvents;\n }\n\n get version(): number {\n return this.headerContent.version;\n }\n\n private readonly authItems$$ = new ReplaySubject(1);\n readonly authItems$ = this.authItems$$.asObservable();\n\n // debounceTime prevents header flickering\n private readonly leftItems$$ = new ReplaySubject(1);\n readonly leftItems$ = this.leftItems$$.asObservable().pipe(\n debounceTime(10),\n distinctUntilChanged((prev, current) => prev.every((item, index) => item.name === current[index]?.name)),\n );\n\n constructor(\n private resizeObserver: ResizeObserverService,\n private elementRepositoryService: ElementRepositoryService,\n private headerContent: HeaderConfig,\n private dslService: DslService,\n private menuItemsService: MenuItemsService,\n private navigationService: NavigationService,\n private dynamicComponentsRegistry: DynamicComponentsRegistry,\n private menuItemHighlightingService: MenuItemHighlightService,\n ) {\n this.elementRepositoryService.elements$\n .pipe(\n map((v) => v.get(VanillaElements.HEADER_SLOT)),\n distinctUntilChanged(),\n switchMap((element) => {\n if (element) {\n return this.resizeObserver\n .observe(element)\n .pipe(map((entry) => ({ width: entry.contentBoxSize[0]!.blockSize, height: entry.contentBoxSize[0]!.inlineSize })));\n }\n return of({ width: 0, height: 0 });\n }),\n takeUntilDestroyed(),\n )\n .subscribe((rect) => this.headerComponentRect.set(rect));\n }\n\n initMenuItems() {\n this.evaluateMenuContentItems('leftItems', this.leftItems$$);\n this.evaluateMenuContentItems('authItems', this.authItems$$);\n this.evaluateMenuContentItems('unauthItems', this.unauthItems);\n this.evaluateMenuContentItems('productItems', this.productItems);\n this.evaluateMenuContentItems('pillItems', this.pillItems);\n this.evaluateBalanceParams();\n }\n\n private evaluateMenuContentItems(key: keyof HeaderConfigElements, store: Subject | WritableSignal) {\n const items = this.headerContent.elements[key];\n\n if (items?.length > 0) {\n // preload the components needed for the header section\n items.forEach((item) => this.preload(item.type));\n\n this.dslService.evaluateContent(items).subscribe((items: MenuContentItem[]) => {\n store instanceof Subject ? store.next(items) : store.set(items);\n });\n }\n }\n\n private authItemBalanceParam(condition: (item: MenuContentItem) => boolean): Observable {\n return this.authItems$$.pipe(\n startWith(this.headerContent.elements.authItems),\n map(\n (authItems: MenuContentItem[]) =>\n authItems.find((authItem: MenuContentItem) => condition(authItem) && authItem?.parameters?.balance)?.parameters?.balance,\n ),\n distinctUntilChanged(),\n switchMap((balanceParam: string | undefined) => {\n if (balanceParam) {\n return this.dslService.evaluateExpression(balanceParam);\n }\n\n return of(0);\n }),\n );\n }\n\n private evaluateBalanceParams() {\n this.authItemBalanceParam((authItem: MenuContentItem) => authItem.type === 'avatar-balance' || authItem.type === 'balance').subscribe(\n (balance: number) => {\n this.balance.set(balance);\n },\n );\n this.authItemBalanceParam((authItem) => authItem.type === 'bonus-balance').subscribe((balance: number) => {\n this.bonusBalance.set(balance);\n });\n }\n\n initProductHighlighting() {\n this.menuItemHighlightingService.initHighlighting(this.headerContent.products);\n this.navigationService.locationChange.subscribe(() => this.setHighlightedProduct());\n }\n\n /**\n * Because the header is fixed and therefore obstructs the top of the page, sometimes it's needed to know it's\n * height (f.e. for scrolling calculations).\n *\n * ```\n * headerService.getHeaderHeight();\n * ```\n */\n getHeaderHeight(): number {\n return this.headerComponentRect().height;\n }\n\n /**\n * Overrides highlighted product in the product switcher. If null is provided, it will reset selected product to\n * current product.\n *\n * ```\n * headerService.highlightProduct('sports');\n * headerService.highlightProduct(null);\n * ```\n *\n * Rules for highlighting (first one that matches will be highlighted):\n *\n * - first item with `highlight-url-pattern` parameter that matches current location absolute path will be\n * highlighted\n * - first item without `highlight-url-pattern` whose `url` is an exact match for current location absolute path\n * will be highlighted\n * - if `HeaderService.highlightProduct()` is called, that product will be highlighted (if it exists)\n * until `HeaderService.highlightProduct(null)` is called.\n * - the item corresponding to `Page.product` will be highlighted (if it exists)\n * - nothing will be highlighted\n */\n highlightProduct(name: string | null) {\n this.currentHighlightedProductName = name;\n\n this.setHighlightedProduct();\n }\n\n /** Set a component type for header item type. */\n setHeaderComponent(itemType: string, component: Type) {\n this.dynamicComponentsRegistry.registerComponent(VanillaDynamicComponentsCategory.Header, itemType, component);\n }\n\n // TODO: find all places where this is used and replace it with preload and get lazy component methods\n /** Gets a component type for header item type. */\n getHeaderComponent(itemType: string | undefined): Type | null {\n return this.dynamicComponentsRegistry.get(VanillaDynamicComponentsCategory.Header, itemType || 'button');\n }\n\n registerLazyCmp(itemType: string, lazyImportFn: () => Promise>) {\n this.dynamicComponentsRegistry.registerLazyComponent(VanillaDynamicComponentsCategory.Header, itemType, lazyImportFn);\n }\n\n /** Gets a lazy component type for header item type. */\n getLazyComponent(itemType: string | undefined): Promise | null> {\n return this.dynamicComponentsRegistry.getLazyComponent(VanillaDynamicComponentsCategory.Header, itemType || 'button');\n }\n\n /** Preload lazy component */\n preload(itemType: string) {\n this.dynamicComponentsRegistry.preloadLazyComponent(VanillaDynamicComponentsCategory.Header, itemType);\n }\n\n /** Assigns a number to be shown as a counter for a header item. */\n setItemCounter(itemName: string, count: any, cssClass?: string) {\n this.menuItemsService.setCounter(MenuSection.Header, itemName, count, cssClass);\n }\n\n /** Shows the header. List of items to be disabled can be passed. */\n show(disabledItems?: string[]) {\n this.headerDisplayEvents.next(true);\n this.headerVisible.set(true);\n this.disabledItems = disabledItems || [];\n }\n\n /** Hides the header. */\n hide() {\n this.headerDisplayEvents.next(false);\n this.headerVisible.set(false);\n }\n\n /** Checks if specific header element is disabled according to list on dynacon config.*/\n itemDisabled(item: string): boolean {\n return this.disabledItems.some((x) => x == item);\n }\n\n setHighlightedProduct() {\n const product = this.menuItemHighlightingService.setHighlightedProduct(this.headerContent.products, this.currentHighlightedProductName);\n\n if (product?.name) {\n this.menuItemHighlightingService.setActiveItem(MenuSection.Header, product.name);\n }\n\n this.highlightedProductEvents.next(product || null);\n this.activeProduct.set(product);\n }\n}\n"],"names":["HeaderService","highlightedProduct","highlightedProductEvents","display","headerDisplayEvents","version","headerContent","constructor","resizeObserver","elementRepositoryService","dslService","menuItemsService","navigationService","dynamicComponentsRegistry","menuItemHighlightingService","currentHighlightedProductName","unauthItems","signal","productItems","pillItems","balance","bonusBalance","activeProduct","headerVisible","headerElementRect","width","height","headerComponentRect","hasHeaderElement","computed","BehaviorSubject","disabledItems","authItems$$","ReplaySubject","authItems$","asObservable","leftItems$$","leftItems$","pipe","debounceTime","distinctUntilChanged","prev","current","every","item","index","name","elements$","map","v","get","VanillaElements","HEADER_SLOT","switchMap","element","observe","entry","contentBoxSize","blockSize","inlineSize","of","takeUntilDestroyed","subscribe","rect","set","initMenuItems","evaluateMenuContentItems","evaluateBalanceParams","key","store","items","elements","length","forEach","preload","type","evaluateContent","Subject","next","authItemBalanceParam","condition","startWith","authItems","find","authItem","parameters","balanceParam","evaluateExpression","initProductHighlighting","initHighlighting","products","locationChange","setHighlightedProduct","getHeaderHeight","highlightProduct","setHeaderComponent","itemType","component","registerComponent","VanillaDynamicComponentsCategory","Header","getHeaderComponent","registerLazyCmp","lazyImportFn","registerLazyComponent","getLazyComponent","preloadLazyComponent","setItemCounter","itemName","count","cssClass","setCounter","MenuSection","show","hide","itemDisabled","some","x","product","setActiveItem","ɵɵinject","ResizeObserverService","ElementRepositoryService","HeaderConfig","DslService","MenuItemsService","NavigationService","DynamicComponentsRegistry","MenuItemHighlightService","h","f","factory","ɵfac","providedIn","_HeaderService"],"mappings":"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"}