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