+ private injectCSS () {
+ // Inject CSS if modified (admin config settings)
+ this.serverService.configLoaded
+ .pipe(skip(1)) // We only want to subscribe to reloads, because the CSS is already injected by the server
+ .subscribe(() => {
+ const headStyle = document.querySelector('style.custom-css-style')
+ if (headStyle) headStyle.parentNode.removeChild(headStyle)
+
+ const config = this.serverService.getConfig()
+
+ // We test customCSS if the admin removed the css
+ if (this.customCSS || config.instance.customizations.css) {
+ const styleTag = '<style>' + config.instance.customizations.css + '</style>'
+ this.customCSS = this.domSanitizer.bypassSecurityTrustHtml(styleTag)
+ }
+ })
+ }
+
+ private async loadPlugins () {
+ this.pluginService.initializePlugins()
+
+ this.hooks.runAction('action:application.init', 'common')
+ }
+
+ private async openModalsIfNeeded () {
+ this.serverService.configLoaded
+ .pipe(
+ switchMap(() => this.authService.userInformationLoaded),
+ map(() => this.authService.getUser()),
+ filter(user => user.role === UserRole.ADMINISTRATOR)
+ ).subscribe(user => setTimeout(() => this.openAdminModals(user))) // setTimeout because of ngIf in template
+ }
+
+ private async openAdminModals (user: User) {
+ if (user.noWelcomeModal !== true) return this.welcomeModal.show()
+
+ const config = this.serverService.getConfig()
+ if (user.noInstanceConfigWarningModal === true || !config.signup.allowed) return
+
+ this.instanceService.getAbout()
+ .subscribe(about => {
+ if (
+ config.instance.name.toLowerCase() === 'peertube' ||
+ !about.instance.terms ||
+ !about.instance.administrator ||
+ !about.instance.maintenanceLifetime
+ ) {
+ this.instanceConfigWarningModal.show(about)
+ }
+ })
+ }
+
+ private initHotkeys () {
+ this.hotkeysService.add([
+ new Hotkey(['/', 's'], (event: KeyboardEvent): boolean => {
+ document.getElementById('search-video').focus()
+ return false
+ }, undefined, this.i18n('Focus the search bar')),
+
+ new Hotkey('b', (event: KeyboardEvent): boolean => {
+ this.toggleMenu()
+ return false
+ }, undefined, this.i18n('Toggle the left menu')),
+
+ new Hotkey('g o', (event: KeyboardEvent): boolean => {
+ this.router.navigate([ '/videos/overview' ])
+ return false
+ }, undefined, this.i18n('Go to the discover videos page')),
+
+ new Hotkey('g t', (event: KeyboardEvent): boolean => {
+ this.router.navigate([ '/videos/trending' ])
+ return false
+ }, undefined, this.i18n('Go to the trending videos page')),
+
+ new Hotkey('g r', (event: KeyboardEvent): boolean => {
+ this.router.navigate([ '/videos/recently-added' ])
+ return false
+ }, undefined, this.i18n('Go to the recently added videos page')),
+
+ new Hotkey('g l', (event: KeyboardEvent): boolean => {
+ this.router.navigate([ '/videos/local' ])
+ return false
+ }, undefined, this.i18n('Go to the local videos page')),