Files
openstapps/src/app/app.module.ts
2021-09-10 15:39:23 +00:00

172 lines
5.3 KiB
TypeScript

/*
* Copyright (C) 2018-2020 StApps
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {
CommonModule,
LocationStrategy,
PathLocationStrategy,
registerLocaleData,
} from '@angular/common';
import {HttpClient} from '@angular/common/http';
import localeDe from '@angular/common/locales/de';
import {APP_INITIALIZER, NgModule, Provider} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {RouteReuseStrategy} from '@angular/router';
import {Diagnostic} from '@ionic-native/diagnostic/ngx';
import {SplashScreen} from '@ionic-native/splash-screen/ngx';
import {StatusBar} from '@ionic-native/status-bar/ngx';
import {IonicModule, IonicRouteStrategy} from '@ionic/angular';
import {
TranslateLoader,
TranslateModule,
TranslateService,
} from '@ngx-translate/core';
import {TranslateHttpLoader} from '@ngx-translate/http-loader';
import moment from 'moment';
import 'moment/min/locales';
import {LoggerModule, NGXLogger, NgxLoggerLevel} from 'ngx-logger';
import {environment} from '../environments/environment';
import {AppRoutingModule} from './app-routing.module';
import {AppComponent} from './app.component';
import {ConfigModule} from './modules/config/config.module';
import {ConfigProvider} from './modules/config/config.provider';
import {DataModule} from './modules/data/data.module';
import {MapModule} from './modules/map/map.module';
import {MenuModule} from './modules/menu/menu.module';
import {NewsModule} from './modules/news/news.module';
import {ScheduleModule} from './modules/schedule/schedule.module';
import {SettingsModule} from './modules/settings/settings.module';
import {SettingsProvider} from './modules/settings/settings.provider';
import {StorageModule} from './modules/storage/storage.module';
import {ThingTranslateModule} from './translation/thing-translate.module';
import {fakeBackendProvider} from './_helpers/fake-backend.interceptor';
import {UtilModule} from './util/util.module';
import {initLogger} from './_helpers/ts-logger';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {FavoritesModule} from './modules/favorites/favorites.module';
registerLocaleData(localeDe);
/**
* Initializes settings from Config before other components
*
* @param logger TODO
* @param settingsProvider provider of settings (e.g. language that has been set)
* @param configProvider TODO
* @param translateService TODO
*/
export function initSettingsFactory(
logger: NGXLogger,
settingsProvider: SettingsProvider,
configProvider: ConfigProvider,
translateService: TranslateService,
) {
return async () => {
initLogger(logger);
await settingsProvider.init();
try {
// set language from settings
if (configProvider.firstSession) {
await settingsProvider.setSettingValue(
'profile',
'language',
translateService.getBrowserLang(),
);
}
const languageCode = (await settingsProvider.getValue(
'profile',
'language',
)) as string;
// this language will be used as a fallback when a translation isn't found in the current language
translateService.setDefaultLang('en');
translateService.use(languageCode);
moment.locale(languageCode);
} catch (error) {
logger.warn(error);
}
};
}
/**
* TODO
*
* @param http TODO
*/
export function createTranslateLoader(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
const providers: Provider[] = [
StatusBar,
SplashScreen,
Diagnostic,
{
provide: RouteReuseStrategy,
useClass: IonicRouteStrategy,
},
{
provide: LocationStrategy,
useClass: PathLocationStrategy,
},
{
provide: APP_INITIALIZER,
multi: true,
deps: [NGXLogger, SettingsProvider, ConfigProvider, TranslateService],
useFactory: initSettingsFactory,
},
];
/**
* TODO
*/
@NgModule({
bootstrap: [AppComponent],
declarations: [AppComponent],
imports: [
AppRoutingModule,
BrowserModule,
BrowserAnimationsModule,
CommonModule,
ConfigModule,
DataModule,
IonicModule.forRoot(),
FavoritesModule,
MapModule,
MenuModule,
NewsModule,
ScheduleModule,
SettingsModule,
StorageModule,
ThingTranslateModule.forRoot(),
TranslateModule.forRoot({
loader: {
deps: [HttpClient],
provide: TranslateLoader,
useFactory: createTranslateLoader,
},
}),
UtilModule,
// use maximal logging level when not in production, minimal (log only fatal errors) in production
LoggerModule.forRoot({
level: environment.production
? NgxLoggerLevel.FATAL
: NgxLoggerLevel.TRACE,
}),
],
providers: environment.use_fake_backend
? [providers, fakeBackendProvider]
: providers,
})
export class AppModule {}