mirror of https://github.com/Chocobozzz/PeerTube
79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
import { filter } from 'rxjs/operators'
|
|
import { Injectable } from '@angular/core'
|
|
import { ActivatedRoute, ActivatedRouteSnapshot, Event, NavigationEnd, Router, Scroll } from '@angular/router'
|
|
import { ServerService } from '../server'
|
|
|
|
export const enum RouterSetting {
|
|
NONE = 0,
|
|
REUSE_COMPONENT = 1 << 0,
|
|
DISABLE_SCROLL_RESTORE = 1 << 1
|
|
}
|
|
|
|
@Injectable()
|
|
export class PeerTubeRouterService {
|
|
static readonly ROUTE_SETTING_NAME = 's'
|
|
|
|
constructor (
|
|
private route: ActivatedRoute,
|
|
private router: Router,
|
|
private server: ServerService
|
|
) { }
|
|
|
|
addRouteSetting (toAdd: RouterSetting) {
|
|
if (this.hasRouteSetting(toAdd)) return
|
|
|
|
const current = this.getRouteSetting()
|
|
|
|
this.setRouteSetting(current | toAdd)
|
|
}
|
|
|
|
deleteRouteSetting (toDelete: RouterSetting) {
|
|
const current = this.getRouteSetting()
|
|
|
|
this.setRouteSetting(current & ~toDelete)
|
|
}
|
|
|
|
getRouteSetting (snapshot?: ActivatedRouteSnapshot) {
|
|
return (snapshot || this.route.snapshot).queryParams[PeerTubeRouterService.ROUTE_SETTING_NAME]
|
|
}
|
|
|
|
setRouteSetting (value: number) {
|
|
let path = window.location.pathname
|
|
if (!path || path === '/') path = this.server.getHTMLConfig().instance.defaultClientRoute
|
|
|
|
const queryParams = { [PeerTubeRouterService.ROUTE_SETTING_NAME]: value }
|
|
|
|
this.router.navigate([ path ], { queryParams, replaceUrl: true, queryParamsHandling: 'merge' })
|
|
}
|
|
|
|
hasRouteSetting (setting: RouterSetting, snapshot?: ActivatedRouteSnapshot) {
|
|
return !!(this.getRouteSetting(snapshot) & setting)
|
|
}
|
|
|
|
getNavigationEndEvents () {
|
|
return this.router.events.pipe(
|
|
filter((e: Event): e is NavigationEnd => e instanceof NavigationEnd)
|
|
)
|
|
}
|
|
|
|
getScrollEvents () {
|
|
return this.router.events.pipe(
|
|
filter((e: Event): e is Scroll => e instanceof Scroll)
|
|
)
|
|
}
|
|
|
|
silentNavigate (baseRoute: string[], queryParams: { [id: string]: string }) {
|
|
let routeSetting = this.getRouteSetting() ?? RouterSetting.NONE
|
|
routeSetting |= RouterSetting.DISABLE_SCROLL_RESTORE
|
|
|
|
queryParams = {
|
|
...queryParams,
|
|
|
|
[PeerTubeRouterService.ROUTE_SETTING_NAME]: routeSetting
|
|
}
|
|
|
|
return this.router.navigate(baseRoute, { queryParams })
|
|
}
|
|
|
|
}
|