+ private serverService: ServerService,
+ private pluginService: PluginService,
+ private domSanitizer: DomSanitizer,
+ private redirectService: RedirectService,
+ private screenService: ScreenService,
+ private hotkeysService: HotkeysService,
+ private themeService: ThemeService,
+ private hooks: HooksService
+ ) { }
+
+ get serverVersion () {
+ return this.serverService.getConfig().serverVersion
+ }
+
+ get serverCommit () {
+ const commit = this.serverService.getConfig().serverCommit || ''
+ return (commit !== '') ? '...' + commit : commit
+ }
+
+ get instanceName () {
+ return this.serverService.getConfig().instance.name
+ }
+
+ get defaultRoute () {
+ return RedirectService.DEFAULT_ROUTE
+ }
+
+ ngOnInit () {
+ document.getElementById('incompatible-browser').className += ' browser-ok'
+
+ this.authService.loadClientCredentials()
+
+ if (this.isUserLoggedIn()) {
+ // The service will automatically redirect to the login page if the token is not valid anymore
+ this.authService.refreshUserInformation()
+ }
+
+ // Load custom data from server
+ this.serverService.loadConfig()
+ this.serverService.loadVideoCategories()
+ this.serverService.loadVideoLanguages()
+ this.serverService.loadVideoLicences()
+ this.serverService.loadVideoPrivacies()
+ this.serverService.loadVideoPlaylistPrivacies()
+
+ this.loadPlugins()
+ this.themeService.initialize()
+
+ // Do not display menu on small screens
+ if (this.screenService.isInSmallView()) {
+ this.isMenuDisplayed = false
+ }
+
+ this.initRouteEvents()
+ this.injectJS()
+ this.injectCSS()
+
+ this.initHotkeys()
+
+ fromEvent(window, 'resize')
+ .pipe(debounceTime(200))
+ .subscribe(() => this.onResize())
+ }
+
+ isUserLoggedIn () {
+ return this.authService.isLoggedIn()
+ }
+
+ toggleMenu () {
+ this.isMenuDisplayed = !this.isMenuDisplayed
+ this.isMenuChangedByUser = true
+ }
+
+ onResize () {
+ this.isMenuDisplayed = window.innerWidth >= 800 && !this.isMenuChangedByUser
+ }
+
+ private initRouteEvents () {
+ let resetScroll = true
+ const eventsObs = this.router.events
+
+ const scrollEvent = eventsObs.pipe(filter((e: Event): e is Scroll => e instanceof Scroll))
+ const navigationEndEvent = eventsObs.pipe(filter((e: Event): e is NavigationEnd => e instanceof NavigationEnd))
+
+ scrollEvent.subscribe(e => {
+ if (e.position) {
+ return this.viewportScroller.scrollToPosition(e.position)
+ }
+
+ if (e.anchor) {
+ return this.viewportScroller.scrollToAnchor(e.anchor)
+ }
+
+ if (resetScroll) {
+ return this.viewportScroller.scrollToPosition([ 0, 0 ])