/** Angular Imports */ import { Component, OnInit } from '@angular/core'; import { Router, NavigationEnd, ActivatedRoute } from '@angular/router'; import { Title } from '@angular/platform-browser'; import { MatSnackBar } from '@angular/material'; /** rxjs Imports */ import { merge } from 'rxjs'; import { filter, map, mergeMap } from 'rxjs/operators'; /** Translation Imports */ import { TranslateService } from '@ngx-translate/core'; /** Environment Configuration */ import { environment } from 'environments/environment'; /** Custom Services */ import { Logger } from './core/logger/logger.service'; import { I18nService } from './core/i18n/i18n.service'; import { ThemeStorageService } from './shared/theme-picker/theme-storage.service'; import { AlertService } from './core/alert/alert.service'; /** Custom Models */ import { Alert } from './core/alert/alert.model'; /** Initialize Logger */ const log = new Logger('MifosX'); /** * Main web app component. */ @Component({ selector: 'mifosx-web-app', templateUrl: './web-app.component.html', styleUrls: ['./web-app.component.scss'] }) export class WebAppComponent implements OnInit { /** * @param {Router} router Router for navigation. * @param {ActivatedRoute} activatedRoute Activated Route. * @param {Title} titleService Title Service. * @param {TranslateService} translateService Translate Service. * @param {I18nService} i18nService I18n Service. * @param {ThemeStorageService} themeStorageService Theme Storage Service. * @param {MatSnackBar} snackBar Material Snackbar for notifications. * @param {AlertService} alertService Alert Service. */ constructor(private router: Router, private activatedRoute: ActivatedRoute, private titleService: Title, private translateService: TranslateService, private i18nService: I18nService, private themeStorageService: ThemeStorageService, public snackBar: MatSnackBar, private alertService: AlertService) { } /** * Initial Setup: * * 1) Logger * * 2) Language and Translations * * 3) Page Title * * 4) Theme * * 5) Alerts */ ngOnInit() { // Setup logger if (environment.production) { Logger.enableProductionMode(); } log.debug('init'); // Setup translations this.i18nService.init(environment.defaultLanguage, environment.supportedLanguages); // Change page title on navigation or language change, based on route data const onNavigationEnd = this.router.events.pipe(filter(event => event instanceof NavigationEnd)); merge(this.translateService.onLangChange, onNavigationEnd) .pipe( map(() => { let route = this.activatedRoute; while (route.firstChild) { route = route.firstChild; } return route; }), filter(route => route.outlet === 'primary'), mergeMap(route => route.data) ) .subscribe(event => { const title = event['title']; if (title) { this.titleService.setTitle(`${this.translateService.instant(title)} | Mifos X`); } }); // Stores top 100 user activites as local storage object. let activities: string[] = []; if (localStorage.getItem('mifosXLocation')) { const activitiesArray: string[] = JSON.parse(localStorage.getItem('mifosXLocation')); const length = activitiesArray.length; activities = length > 100 ? activitiesArray.slice(length - 100) : activitiesArray; } // Store route URLs array in local storage on navigation end. onNavigationEnd.subscribe(() => { activities.push(this.router.url); localStorage.setItem('mifosXLocation', JSON.stringify(activities)); }); // Setup theme const theme = this.themeStorageService.getTheme(); if (theme) { this.themeStorageService.installTheme(theme); } // Setup alerts this.alertService.alertEvent.subscribe((alertEvent: Alert) => { this.snackBar.open(`${alertEvent.message}`, 'Close', { duration: 2000, horizontalPosition: 'right', verticalPosition: 'top' }); }); } }