{ "version": 3, "sources": ["src/app/_services/nav.service.ts"], "sourcesContent": ["import {DOCUMENT} from '@angular/common';\nimport {DestroyRef, inject, Inject, Injectable, Renderer2, RendererFactory2, RendererStyleFlags2} from '@angular/core';\nimport {distinctUntilChanged, filter, ReplaySubject, take} from 'rxjs';\nimport { HttpClient } from \"@angular/common/http\";\nimport {environment} from \"../../environments/environment\";\nimport {SideNavStream} from \"../_models/sidenav/sidenav-stream\";\nimport {TextResonse} from \"../_types/text-response\";\nimport {AccountService} from \"./account.service\";\nimport {map} from \"rxjs/operators\";\nimport {NavigationEnd, Router} from \"@angular/router\";\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NavService {\n\n private readonly accountService = inject(AccountService);\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n\n public localStorageSideNavKey = 'kavita--sidenav--expanded';\n\n private navbarVisibleSource = new ReplaySubject(1);\n /**\n * If the top Nav bar is rendered or not\n */\n navbarVisible$ = this.navbarVisibleSource.asObservable();\n\n private sideNavCollapseSource = new ReplaySubject(1);\n /**\n * If the Side Nav is in a collapsed state or not.\n */\n sideNavCollapsed$ = this.sideNavCollapseSource.asObservable();\n\n private sideNavVisibilitySource = new ReplaySubject(1);\n /**\n * If the side nav is rendered or not into the DOM.\n */\n sideNavVisibility$ = this.sideNavVisibilitySource.asObservable();\n\n usePreferenceSideNav$ = this.router.events.pipe(\n filter(event => event instanceof NavigationEnd),\n map((evt) => {\n const event = (evt as NavigationEnd);\n const url = event.urlAfterRedirects || event.url;\n return (\n /\\/admin\\/dashboard(#.*)?/.test(url) || /\\/preferences(\\/[^\\/]+|#.*)?/.test(url) || /\\/settings(\\/[^\\/]+|#.*)?/.test(url)\n );\n }),\n takeUntilDestroyed(this.destroyRef),\n );\n\n private renderer: Renderer2;\n baseUrl = environment.apiUrl;\n\n constructor(@Inject(DOCUMENT) private document: Document, rendererFactory: RendererFactory2, private httpClient: HttpClient) {\n this.renderer = rendererFactory.createRenderer(null, null);\n\n // To avoid flashing, let's check if we are authenticated before we show\n this.accountService.currentUser$.pipe(take(1)).subscribe(u => {\n if (u) {\n this.showNavBar();\n }\n });\n\n const sideNavState = (localStorage.getItem(this.localStorageSideNavKey) === 'true') || false;\n this.sideNavCollapseSource.next(sideNavState);\n this.showSideNav();\n }\n\n getSideNavStreams(visibleOnly = true) {\n return this.httpClient.get>(this.baseUrl + 'stream/sidenav?visibleOnly=' + visibleOnly);\n }\n\n updateSideNavStreamPosition(streamName: string, sideNavStreamId: number, fromPosition: number, toPosition: number) {\n return this.httpClient.post(this.baseUrl + 'stream/update-sidenav-position', {streamName, id: sideNavStreamId, fromPosition, toPosition}, TextResonse);\n }\n\n updateSideNavStream(stream: SideNavStream) {\n return this.httpClient.post(this.baseUrl + 'stream/update-sidenav-stream', stream, TextResonse);\n }\n\n createSideNavStream(smartFilterId: number) {\n return this.httpClient.post(this.baseUrl + 'stream/add-sidenav-stream?smartFilterId=' + smartFilterId, {});\n }\n\n createSideNavStreamFromExternalSource(externalSourceId: number) {\n return this.httpClient.post(this.baseUrl + 'stream/add-sidenav-stream-from-external-source?externalSourceId=' + externalSourceId, {});\n }\n\n bulkToggleSideNavStreamVisibility(streamIds: Array, targetVisibility: boolean) {\n return this.httpClient.post(this.baseUrl + 'stream/bulk-sidenav-stream-visibility', {ids: streamIds, visibility: targetVisibility});\n }\n\n /**\n * Shows the top nav bar. This should be visible on all pages except the reader.\n */\n showNavBar() {\n setTimeout(() => {\n const bodyElem = this.document.querySelector('body');\n this.renderer.setStyle(bodyElem, 'margin-top', 'var(--nav-offset)');\n this.renderer.removeStyle(bodyElem, 'scrollbar-gutter');\n this.renderer.setStyle(bodyElem, 'height', 'calc(var(--vh)*100 - var(--nav-offset))');\n this.renderer.setStyle(bodyElem, 'overflow', 'hidden');\n this.renderer.setStyle(this.document.querySelector('html'), 'height', 'calc(var(--vh)*100 - var(--nav-offset))');\n this.navbarVisibleSource.next(true);\n }, 10);\n }\n\n /**\n * Hides the top nav bar.\n */\n hideNavBar() {\n setTimeout(() => {\n const bodyElem = this.document.querySelector('body');\n this.renderer.removeStyle(bodyElem, 'height');\n this.renderer.setStyle(bodyElem, 'margin-top', '0px', RendererStyleFlags2.Important);\n this.renderer.setStyle(bodyElem, 'scrollbar-gutter', 'initial', RendererStyleFlags2.Important);\n this.renderer.removeStyle(this.document.querySelector('html'), 'height');\n this.renderer.setStyle(bodyElem, 'overflow', 'auto');\n this.navbarVisibleSource.next(false);\n }, 10);\n }\n\n /**\n * Shows the side nav. When being visible, the side nav will automatically return to previous collapsed state.\n */\n showSideNav() {\n this.sideNavVisibilitySource.next(true);\n }\n\n /**\n * Hides the side nav. This is useful for the readers and login page.\n */\n hideSideNav() {\n this.sideNavVisibilitySource.next(false);\n }\n\n toggleSideNav() {\n this.sideNavCollapseSource.pipe(take(1)).subscribe(val => {\n if (val === undefined) val = false;\n const newVal = !(val || false);\n this.sideNavCollapseSource.next(newVal);\n localStorage.setItem(this.localStorageSideNavKey, newVal + '');\n });\n }\n\n collapseSideNav(isCollapsed: boolean) {\n this.sideNavCollapseSource.next(isCollapsed);\n localStorage.setItem(this.localStorageSideNavKey, isCollapsed + '');\n }\n}\n"], "mappings": "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", "names": ["NavService", "constructor", "document", "rendererFactory", "httpClient", "accountService", "inject", "AccountService", "router", "Router", "destroyRef", "DestroyRef", "localStorageSideNavKey", "navbarVisibleSource", "ReplaySubject", "navbarVisible$", "asObservable", "sideNavCollapseSource", "sideNavCollapsed$", "sideNavVisibilitySource", "sideNavVisibility$", "usePreferenceSideNav$", "events", "pipe", "filter", "event", "NavigationEnd", "map", "evt", "url", "urlAfterRedirects", "test", "takeUntilDestroyed", "baseUrl", "environment", "apiUrl", "renderer", "createRenderer", "currentUser$", "take", "subscribe", "u", "showNavBar", "sideNavState", "localStorage", "getItem", "next", "showSideNav", "getSideNavStreams", "visibleOnly", "get", "updateSideNavStreamPosition", "streamName", "sideNavStreamId", "fromPosition", "toPosition", "post", "id", "TextResonse", "updateSideNavStream", "stream", "createSideNavStream", "smartFilterId", "createSideNavStreamFromExternalSource", "externalSourceId", "bulkToggleSideNavStreamVisibility", "streamIds", "targetVisibility", "ids", "visibility", "setTimeout", "bodyElem", "querySelector", "setStyle", "removeStyle", "hideNavBar", "RendererStyleFlags2", "Important", "hideSideNav", "toggleSideNav", "val", "undefined", "newVal", "setItem", "collapseSideNav", "isCollapsed", "\u0275\u0275inject", "DOCUMENT", "RendererFactory2", "HttpClient", "factory", "\u0275fac", "providedIn"] }