diff --git a/src/app/quiz/quiz-manager/quiz-manager/quiz-manager.component.ts b/src/app/quiz/quiz-manager/quiz-manager/quiz-manager.component.ts index c802558b61d4f8bbb09a6348f70afd353ae2043c..0868aea2927558ab06e5c8b6936f1881343135a1 100644 --- a/src/app/quiz/quiz-manager/quiz-manager/quiz-manager.component.ts +++ b/src/app/quiz/quiz-manager/quiz-manager/quiz-manager.component.ts @@ -3,6 +3,7 @@ import { Router } from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; import { Subscription } from 'rxjs'; +import { environment } from '../../../../environments/environment'; import { AutoUnsubscribe } from '../../../../lib/AutoUnsubscribe'; import { availableQuestionTypes, IAvailableQuestionType } from '../../../../lib/available-question-types'; import { DefaultAnswerEntity } from '../../../../lib/entities/answer/DefaultAnswerEntity'; @@ -54,13 +55,17 @@ export class QuizManagerComponent implements OnDestroy { this.footerBarService.TYPE_REFERENCE = QuizManagerComponent.TYPE; - footerBarService.replaceFooterElements([ + const footerElements = [ this.footerBarService.footerElemHome, this.footerBarService.footerElemStartQuiz, this.footerBarService.footerElemNicknames, this.footerBarService.footerElemMemberGroup, this.footerBarService.footerElemSound, - ]); + ]; + if (environment.forceQuizTheme) { + footerElements.push(this.footerBarService.footerElemTheme); + } + footerBarService.replaceFooterElements(footerElements); this._subscriptions.push(this.quizService.quizUpdateEmitter.subscribe(() => { this.footerBarService.footerElemStartQuiz.isActive = this.quizService.isValid() && this.connectionService.serverAvailable; diff --git a/src/app/root/nickname-chooser/nickname-input/nickname-input.component.ts b/src/app/root/nickname-chooser/nickname-input/nickname-input.component.ts index 3ee0828ae75f0ee430e2c19c68aef81eaf79cc0b..9a910918753a99ad4b8c1c8d4169e4b9ca0aa442 100644 --- a/src/app/root/nickname-chooser/nickname-input/nickname-input.component.ts +++ b/src/app/root/nickname-chooser/nickname-input/nickname-input.component.ts @@ -62,6 +62,12 @@ export class NicknameInputComponent implements OnInit, OnDestroy { this.router.navigate(['/quiz', 'flow', 'lobby']); }, data => { this.isLoggingIn = false; + + if (!data) { + this.router.navigate(['/']); + return; + } + switch (data.step) { case MessageProtocol.DuplicateLogin: this._failedLoginReason = 'plugins.splashscreen.error.error_messages.duplicate_user'; @@ -79,6 +85,8 @@ export class NicknameInputComponent implements OnInit, OnDestroy { if (this.attendeeService.ownNick) { this.router.navigate(['/']); } + + this.quizService.loadDataToPlay(sessionStorage.getItem(StorageKey.CurrentQuizName)); } public ngOnDestroy(): void { diff --git a/src/app/root/nickname-chooser/nickname-select/nickname-select.component.ts b/src/app/root/nickname-chooser/nickname-select/nickname-select.component.ts index 509f0a627ac4bac556562c939a2e5741c30e58e0..8d0d2e066a40190195403b344afbedf8eff0189a 100644 --- a/src/app/root/nickname-chooser/nickname-select/nickname-select.component.ts +++ b/src/app/root/nickname-chooser/nickname-select/nickname-select.component.ts @@ -89,6 +89,7 @@ export class NicknameSelectComponent implements OnInit, OnDestroy { this.router.navigate(['/quiz', 'flow', 'lobby']); }, (err) => { console.log('NicknameSelectComponent: PutMember failed', err); + this.router.navigate(['/']); this.isLoggingIn = null; }); } @@ -106,9 +107,12 @@ export class NicknameSelectComponent implements OnInit, OnDestroy { this.router.navigate(['/']); } this._isLoading = true; - this.memberApiService.getAvailableNames(this.quizService.quiz.name).subscribe(data => { - this._isLoading = false; - this._nicks = this._nicks.concat(data); + + this.quizService.loadDataToPlay(sessionStorage.getItem(StorageKey.CurrentQuizName)).then(() => { + this.memberApiService.getAvailableNames(this.quizService.quiz.name).subscribe(data => { + this._isLoading = false; + this._nicks = this._nicks.concat(data); + }); }); } diff --git a/src/app/root/theme-switcher/theme-switcher.component.ts b/src/app/root/theme-switcher/theme-switcher.component.ts index 6330e4d7a81d1cfec7ff8dc17300eadb4d15c2d9..bb7e0d77dbd981a96665e5e6d95888272c25bf0c 100644 --- a/src/app/root/theme-switcher/theme-switcher.component.ts +++ b/src/app/root/theme-switcher/theme-switcher.component.ts @@ -1,8 +1,13 @@ import { isPlatformBrowser } from '@angular/common'; -import { Component, Inject, PLATFORM_ID } from '@angular/core'; +import { Component, EventEmitter, Inject, OnDestroy, PLATFORM_ID } from '@angular/core'; +import { Router } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { environment } from '../../../environments/environment'; +import { AutoUnsubscribe } from '../../../lib/AutoUnsubscribe'; import { DbTable, StorageKey } from '../../../lib/enums/enums'; import { FooterBarService } from '../../service/footer-bar/footer-bar.service'; import { HeaderLabelService } from '../../service/header-label/header-label.service'; +import { QuizService } from '../../service/quiz/quiz.service'; import { StorageService } from '../../service/storage/storage.service'; import { ThemesService } from '../../service/themes/themes.service'; @@ -10,11 +15,14 @@ import { ThemesService } from '../../service/themes/themes.service'; selector: 'app-theme-switcher', templateUrl: './theme-switcher.component.html', styleUrls: ['./theme-switcher.component.scss'], -}) -export class ThemeSwitcherComponent { +}) // +@AutoUnsubscribe('_subscriptions') // +export class ThemeSwitcherComponent implements OnDestroy { public static TYPE = 'ThemeSwitcherComponent'; private previewThemeBackup: string; + private _subscriptions: Array = []; + private _themeChangedEmitter = new EventEmitter(); constructor( @Inject(PLATFORM_ID) private platformId: Object, @@ -22,16 +30,44 @@ export class ThemeSwitcherComponent { private headerLabelService: HeaderLabelService, private themesService: ThemesService, private storageService: StorageService, + private quizService: QuizService, + private router: Router, ) { this.footerBarService.TYPE_REFERENCE = ThemeSwitcherComponent.TYPE; - footerBarService.replaceFooterElements([ - this.footerBarService.footerElemHome, this.footerBarService.footerElemAbout, this.footerBarService.footerElemTranslation, - ]); + headerLabelService.headerLabel = 'component.theme_switcher.set_theme'; + if (isPlatformBrowser(this.platformId)) { this.previewThemeBackup = document.getElementsByTagName('html').item(0).dataset['theme']; } + + this._subscriptions.push(this.quizService.quizUpdateEmitter.subscribe(() => { + this._subscriptions.push(this._themeChangedEmitter.subscribe((themeId) => { + this.quizService.quiz.sessionConfig.theme = themeId; + this.quizService.persist(); + })); + })); + + let footerElements; + if (environment.forceQuizTheme && sessionStorage.getItem(StorageKey.CurrentQuizName)) { + this.quizService.loadDataToEdit(sessionStorage.getItem(StorageKey.CurrentQuizName)); + footerElements = [this.footerBarService.footerElemBack]; + + this.footerBarService.footerElemBack.onClickCallback = () => { + this.router.navigate(['/quiz', 'manager']); + }; + } else { + footerElements = [ + this.footerBarService.footerElemHome, this.footerBarService.footerElemAbout, this.footerBarService.footerElemTranslation, + ]; + } + footerBarService.replaceFooterElements(footerElements); + } + + public ngOnDestroy(): void { + this._subscriptions.forEach(sub => sub.unsubscribe()); + this.footerBarService.footerElemBack.restoreClickCallback(); } public updateTheme(id: string): void { @@ -39,6 +75,7 @@ export class ThemeSwitcherComponent { document.getElementsByTagName('html').item(0).dataset['theme'] = id; this.previewThemeBackup = document.getElementsByTagName('html').item(0).dataset['theme']; this.storageService.create(DbTable.Config, StorageKey.DefaultTheme, this.previewThemeBackup).subscribe(); + this._themeChangedEmitter.emit(id); } } diff --git a/src/app/service/themes/themes.service.ts b/src/app/service/themes/themes.service.ts index 82e6760decc185e1eb1f6ecdc5cd0fdb2055265a..20bafba81dfc32d10851273b9409f82f130eb9a2 100644 --- a/src/app/service/themes/themes.service.ts +++ b/src/app/service/themes/themes.service.ts @@ -1,5 +1,6 @@ import { isPlatformBrowser, isPlatformServer } from '@angular/common'; import { EventEmitter, Inject, Injectable, PLATFORM_ID } from '@angular/core'; +import { environment } from '../../../environments/environment'; import { themes } from '../../../lib/available-themes'; import { DefaultSettings } from '../../../lib/default.settings'; import { DbState, DbTable, StorageKey } from '../../../lib/enums/enums'; @@ -47,17 +48,20 @@ export class ThemesService { return; } - const themeConfig = await Promise.all([ - this.storageService.read(DbTable.Config, StorageKey.DefaultTheme).toPromise(), - this.storageService.read(DbTable.Config, StorageKey.QuizTheme).toPromise(), - new Promise(resolve => { - if (this.quizService.quiz && this.quizService.quiz.sessionConfig.theme) { - resolve(this.quizService.quiz.sessionConfig.theme); - return; - } - resolve('theme-Material'); - }), - ]); + const themePromises: Array> = []; + if (!environment.forceQuizTheme || !this.quizService.quiz) { + themePromises.push(this.storageService.read(DbTable.Config, StorageKey.DefaultTheme).toPromise(), + this.storageService.read(DbTable.Config, StorageKey.QuizTheme).toPromise()); + } + themePromises.push(new Promise(resolve => { + if (this.quizService.quiz && this.quizService.quiz.sessionConfig.theme) { + resolve(this.quizService.quiz.sessionConfig.theme); + return; + } + resolve(DefaultSettings.defaultQuizSettings.sessionConfig.theme); + })); + + const themeConfig = await Promise.all(themePromises); const usedTheme = themeConfig[0] || themeConfig[1] || themeConfig[2]; const themeDataset = document.getElementsByTagName('html').item(0).dataset['theme']; diff --git a/src/app/themes/themes.component.ts b/src/app/themes/themes.component.ts index 6c758cd2bf179463144aa06fa81e933458e31cff..58a3e22e43b12b97934b9caf8a27124e10905b67 100644 --- a/src/app/themes/themes.component.ts +++ b/src/app/themes/themes.component.ts @@ -12,14 +12,16 @@ import { TrackingService } from '../service/tracking/tracking.service'; }) export class ThemesComponent implements OnDestroy { public static TYPE = 'ThemesComponent'; + @Output() public updateTheme = new EventEmitter(); @Output() public previewTheme = new EventEmitter(); @Output() public restoreTheme = new EventEmitter(); + private _currentTheme: string; constructor( - private translateService: TranslateService, public themesService: ThemesService, + private translateService: TranslateService, private trackingService: TrackingService, private themesApiService: ThemesApiService, ) { diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index eac8196d5732b29c1b1884fcadebad2d64fcb5b7..65aa09aa5d52a87c84dd1c8c3846628f38821c78 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -7,6 +7,7 @@ export const environment = { infoProjectTabEnabled: true, infoBackendApiEnabled: true, requireLoginToCreateQuiz: false, + forceQuizTheme: false, }; export enum DEVICE_TYPES { diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 19ebc54f5a84bd4771d193e12a064019169484cb..e7e36c24baa249b868dd63b4a135d8ee9ea81c87 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -12,6 +12,7 @@ export const environment = { infoProjectTabEnabled: false, infoBackendApiEnabled: false, requireLoginToCreateQuiz: true, + forceQuizTheme: false, }; export enum DEVICE_TYPES { diff --git a/src/environments/environment.westermann.ts b/src/environments/environment.westermann.ts index 00c2e052ad153006b67d40ebabf6107358c2af75..5ae9244deec335510124b26cca7ad9fa18f64a6b 100644 --- a/src/environments/environment.westermann.ts +++ b/src/environments/environment.westermann.ts @@ -7,6 +7,7 @@ export const environment = { infoProjectTabEnabled: false, infoBackendApiEnabled: false, requireLoginToCreateQuiz: true, + forceQuizTheme: true, }; export enum DEVICE_TYPES {