import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core'; import { Title } from '@angular/platform-browser'; import { Subscription } from 'rxjs'; import { environment } from '../environments/environment'; import { Theme } from './core/enums/theme.enum'; import { LanguageService } from './core/services/language.service'; import { ThemeService } from './core/services/theme.service'; import { NavigationEnd, Route, Router, RouterOutlet } from '@angular/router'; import { slideInAnimation } from './shared/animations/main'; import { FramaKeyboardShortcuts } from './shared/shortcuts/main'; import { ShortcutEventOutput, ShortcutInput } from 'ng-keyboard-shortcuts'; import { PollService } from './core/services/poll.service'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], animations: [slideInAnimation], }) export class AppComponent implements OnInit, OnDestroy, AfterViewInit { shortcuts: ShortcutInput[] = FramaKeyboardShortcuts; public appTitle: string = environment.appTitle; public appLogo: string = environment.appLogo; public themeClass: string; public isSidebarOpened = false; public devModeEnabled = !environment.production; private themeSubscription: Subscription; public environment = environment; constructor( private router: Router, private titleService: Title, private themeService: ThemeService, private pollService: PollService, private languageService: LanguageService // private mockingService: MockingService ) {} printpath(parent: string, config: Route[]) { for (let i = 0; i < config.length; i++) { const route = config[i]; console.info(parent + '/' + route.path); if (route.children) { const currentPath = route.path ? parent + '/' + route.path : parent; this.printpath(currentPath, route.children); } } } ngOnInit(): void { this.printpath('', this.router.config); this.router.events.subscribe((evt) => { console.log('route changed', evt); if (!(evt instanceof NavigationEnd)) { return; } window.scrollTo(0, 0); }); if (!environment.production) { this.appTitle += ' [DEV]'; } const loadedPoll = this.pollService._poll.getValue(); this.titleService.setTitle(this.appTitle + ' - ' + loadedPoll.title); this.languageService.configureAndInitTranslations(); this.themeSubscription = this.themeService.theme.subscribe((theme: Theme) => { switch (theme) { case Theme.DARK: this.themeClass = 'theme-dark-crystal'; break; case Theme.CONTRAST: this.themeClass = 'theme-hot-covid'; break; case Theme.RED: this.themeClass = 'theme-hot-covid'; break; default: this.themeClass = 'theme-light-watermelon'; } }); } ngAfterViewInit(): void { console.log('this.shortcuts', this.shortcuts); this.shortcuts.push( { key: '?', label: 'Help', description: 'Question mark', command: (e) => console.log('question mark clicked', { e }), preventDefault: true, }, { key: ['up up down down left right left right b a enter'], label: 'Sequences', description: 'Konami code!', command: (output: ShortcutEventOutput) => console.log('Konami code!!!', output), }, { key: ['cmd + b'], label: 'Help', description: 'Cmd + b', command: (e) => console.log(e), preventDefault: true, } ); console.log('this.shortcuts', this.shortcuts); } ngOnDestroy(): void { if (this.themeSubscription) { this.themeSubscription.unsubscribe(); } } public toggleSidebar(status: boolean): void { this.isSidebarOpened = status === true; } prepareRoute(outlet: RouterOutlet) { return outlet && outlet.activatedRouteData && outlet.activatedRouteData.animation; } }