1 import { filter } from 'rxjs/operators'
2 import { Injectable } from '@angular/core'
3 import { ActivatedRoute, ActivatedRouteSnapshot, Event, NavigationEnd, Router, Scroll } from '@angular/router'
4 import { ServerService } from '../server'
6 export const enum RouterSetting {
8 REUSE_COMPONENT = 1 << 0,
9 DISABLE_SCROLL_RESTORE = 1 << 1
13 export class PeerTubeRouterService {
14 static readonly ROUTE_SETTING_NAME = 's'
17 private route: ActivatedRoute,
18 private router: Router,
19 private server: ServerService
22 addRouteSetting (toAdd: RouterSetting) {
23 if (this.hasRouteSetting(toAdd)) return
25 const current = this.getRouteSetting()
27 this.setRouteSetting(current | toAdd)
30 deleteRouteSetting (toDelete: RouterSetting) {
31 const current = this.getRouteSetting()
33 this.setRouteSetting(current & ~toDelete)
36 getRouteSetting (snapshot?: ActivatedRouteSnapshot) {
37 return (snapshot || this.route.snapshot).queryParams[PeerTubeRouterService.ROUTE_SETTING_NAME]
40 setRouteSetting (value: number) {
41 let path = window.location.pathname
42 if (!path || path === '/') path = this.server.getHTMLConfig().instance.defaultClientRoute
44 const queryParams = { [PeerTubeRouterService.ROUTE_SETTING_NAME]: value }
46 this.router.navigate([ path ], { queryParams, replaceUrl: true, queryParamsHandling: 'merge' })
49 hasRouteSetting (setting: RouterSetting, snapshot?: ActivatedRouteSnapshot) {
50 return !!(this.getRouteSetting(snapshot) & setting)
53 getNavigationEndEvents () {
54 return this.router.events.pipe(
55 filter((e: Event): e is NavigationEnd => e instanceof NavigationEnd)
60 return this.router.events.pipe(
61 filter((e: Event): e is Scroll => e instanceof Scroll)
65 silentNavigate (baseRoute: string[], queryParams: { [id: string]: string }) {
66 let routeSetting = this.getRouteSetting() ?? RouterSetting.NONE
67 routeSetting |= RouterSetting.DISABLE_SCROLL_RESTORE
72 [PeerTubeRouterService.ROUTE_SETTING_NAME]: routeSetting
75 return this.router.navigate(baseRoute, { queryParams })