diff --git a/projects/player/src/app/app.component.ts b/projects/player/src/app/app.component.ts index fc6aa6595874ce964e9efd91ef52f200934310dd..1893dbed9f75191fe7cac8234fcb5cc4e7af0a50 100644 --- a/projects/player/src/app/app.component.ts +++ b/projects/player/src/app/app.component.ts @@ -7,7 +7,8 @@ import { import { VeronaSubscriptionService } from './services/verona-subscription.service'; import { VeronaPostService } from './services/verona-post.service'; import { NativeEventService } from './services/native-event.service'; -import { PlayerConfig, VopStartCommand } from './models/verona'; +import { MetaDataService } from './services/meta-data.service'; +import { PlayerConfig, UnitState, VopStartCommand } from './models/verona'; import { FormPage } from '../../../common/form'; @Component({ @@ -24,12 +25,13 @@ export class AppComponent implements OnInit { constructor(private translateService: TranslateService, private veronaSubscriptionService: VeronaSubscriptionService, private veronaPostService: VeronaPostService, + private metaDataService: MetaDataService, private nativeEventService: NativeEventService) { } ngOnInit(): void { this.initSubscriptions(); - this.veronaPostService.sendVopReadyNotification(); + this.veronaPostService.sendVopReadyNotification(this.metaDataService.playerMetadata); this.translateService.addLangs(['de']); this.translateService.setDefaultLang('de'); } @@ -43,17 +45,36 @@ export class AppComponent implements OnInit { .subscribe((focused: boolean): void => this.onFocus(focused)); } + private initUnit(pages: UnitPage[], unitState: UnitState | undefined): void { + const storedPages: FormPage[] = unitState?.dataParts?.pages ? + JSON.parse(unitState.dataParts.pages) : []; + if (storedPages.length > 0) { + if (unitState?.unitStateDataType && + this.metaDataService.verifyUnitStateDataType(unitState.unitStateDataType)) { + this.pages = this.addStoredValues(pages, storedPages); + } else { + // eslint-disable-next-line no-console + console.warn('player: wrong unitStateDataType'); + this.pages = pages; + } + } else { + this.pages = pages; + } + } + private onStart(message: VopStartCommand): void { // eslint-disable-next-line no-console console.log('player: onStart', message); - const unitDefinition: Unit = message.unitDefinition ? JSON.parse(message.unitDefinition) : []; - const storedPages: FormPage[] = message.unitState?.dataParts?.pages ? - JSON.parse(message.unitState.dataParts.pages) : []; - this.pages = storedPages.length > 0 ? - this.addStoredValues(unitDefinition.pages, storedPages) : - unitDefinition.pages; - this.playerConfig = message.playerConfig || {}; - this.veronaPostService.sessionId = message.sessionId; + const unitDefinition: Unit = message.unitDefinition ? JSON.parse(message.unitDefinition) : {}; + if (unitDefinition.veronaModuleVersion && + this.metaDataService.verifyUnitDefinitionVersion(unitDefinition.veronaModuleVersion)) { + this.veronaPostService.sessionId = message.sessionId; + this.playerConfig = message.playerConfig || {}; + this.initUnit(unitDefinition.pages, message.unitState); + } else { + // eslint-disable-next-line no-console + console.warn('player: wrong unitDefinitionType'); + } } private addStoredValues = (unitPages: UnitPage[], storedPages: FormPage[]): UnitPage[] => unitPages diff --git a/projects/player/src/app/components/form.component.ts b/projects/player/src/app/components/form.component.ts index 2d733622d46d7d58af3ea690ec9be9110dd076c0..8a02a90aea17a0b8b3c0186292626cc295237114 100644 --- a/projects/player/src/app/components/form.component.ts +++ b/projects/player/src/app/components/form.component.ts @@ -10,6 +10,8 @@ import { TranslateService } from '@ngx-translate/core'; import { FormService } from '../../../../common/form.service'; import { VeronaSubscriptionService } from '../services/verona-subscription.service'; import { VeronaPostService } from '../services/verona-post.service'; +import { MessageService } from '../../../../common/message.service'; +import { MetaDataService } from '../services/meta-data.service'; import { FormControlElement, FormControlValidators, ChildFormGroup, ValueChangeElement, FormModel } from '../../../../common/form'; @@ -17,7 +19,6 @@ import { PlayerConfig, UnitState, VopNavigationDeniedNotification } from '../models/verona'; import { UnitPage } from '../../../../common/unit'; -import { MessageService } from '../../../../common/message.service'; @Component({ selector: 'app-form', @@ -41,6 +42,7 @@ export class FormComponent implements OnInit, OnDestroy { private veronaSubscriptionService: VeronaSubscriptionService, private veronaPostService: VeronaPostService, private messageService: MessageService, + private metaDataService: MetaDataService, private translateService: TranslateService, protected changeDetectorRef: ChangeDetectorRef) { } @@ -111,7 +113,8 @@ export class FormComponent implements OnInit, OnDestroy { const unitState: UnitState = { dataParts: { pages: JSON.stringify(formModel.pages) - } + }, + unitStateDataType: this.metaDataService.playerMetadata.supportedUnitStateDataTypes }; this.veronaPostService.sendVopStateChangedNotification({ unitState }); } @@ -120,10 +123,4 @@ export class FormComponent implements OnInit, OnDestroy { this.ngUnsubscribe.next(); this.ngUnsubscribe.complete(); } - - /// ////////////////////// only for dev - submit(): void { - // eslint-disable-next-line no-console - console.log('player: form.value', this.form.value); - } } diff --git a/projects/player/src/app/models/verona.ts b/projects/player/src/app/models/verona.ts index d7082caf5c600a049cbc870578857fc1be55c01a..56dcc08666f76c3aece65add2ec39cdcfc16bfa1 100644 --- a/projects/player/src/app/models/verona.ts +++ b/projects/player/src/app/models/verona.ts @@ -69,8 +69,11 @@ export interface VopContinueCommand { sessionId: string; } -export interface VopReadyNotification { +export interface VopReadyNotification extends VopMetaData{ type: 'vopReadyNotification'; +} + +export interface VopMetaData { apiVersion: string; notSupportedApiFeatures?: string; supportedUnitDefinitionTypes?: string; diff --git a/projects/player/src/app/services/meta-data.service.ts b/projects/player/src/app/services/meta-data.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..8f8801229c8c58efbfb486e508b6b22777a8b2d4 --- /dev/null +++ b/projects/player/src/app/services/meta-data.service.ts @@ -0,0 +1,32 @@ +import { Inject, Injectable } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { VopMetaData } from '../models/verona'; + +@Injectable({ + providedIn: 'root' +}) +export class MetaDataService { + playerMetadata!: VopMetaData; + + constructor(@Inject(DOCUMENT) private document: Document) { + const playerMetadata: NamedNodeMap = document.querySelectorAll('meta')[1].attributes; + this.playerMetadata = { + apiVersion: + playerMetadata.getNamedItem('data-api-version')?.value || '', + notSupportedApiFeatures: + playerMetadata.getNamedItem('data-not-supported-api-features')?.value, + supportedUnitDefinitionTypes: + playerMetadata.getNamedItem('data-supported-unit-definition-types')?.value, + supportedUnitStateDataTypes: + playerMetadata.getNamedItem('data-supported-unit-state-data-types')?.value + }; + } + + verifyUnitDefinitionVersion(unitDefinition: string): boolean { + return (this.playerMetadata.supportedUnitDefinitionTypes === unitDefinition); + } + + verifyUnitStateDataType(unitStateDataType: string): boolean { + return (this.playerMetadata.supportedUnitStateDataTypes === unitStateDataType); + } +} diff --git a/projects/player/src/app/services/verona-post.service.ts b/projects/player/src/app/services/verona-post.service.ts index de9d88ed0f4772ddaaa9d723ee14376ca82dfc76..48f396aeae089b0efa3e72021d602553e5edf4ce 100644 --- a/projects/player/src/app/services/verona-post.service.ts +++ b/projects/player/src/app/services/verona-post.service.ts @@ -1,21 +1,15 @@ -import { Inject, Injectable } from '@angular/core'; -import { DOCUMENT } from '@angular/common'; +import { Injectable } from '@angular/core'; import { - LogData, NavigationTarget, PlayerState, UnitState, VopMessage + LogData, NavigationTarget, PlayerState, UnitState, VopMessage, VopMetaData } from '../models/verona'; @Injectable({ providedIn: 'root' }) export class VeronaPostService { - private readonly playerMetadata!: NamedNodeMap; private _sessionId!: string; - constructor(@Inject(DOCUMENT) private document: Document) { - this.playerMetadata = document.querySelectorAll('meta')[1].attributes; - } - - set sessionId(sessionId:string) { + set sessionId(sessionId: string) { this._sessionId = sessionId; } @@ -44,18 +38,11 @@ export class VeronaPostService { }); } - sendVopReadyNotification(): void { - if (this.playerMetadata) { + sendVopReadyNotification(playerMetadata: VopMetaData): void { + if (playerMetadata) { this.send({ type: 'vopReadyNotification', - apiVersion: - this.playerMetadata.getNamedItem('data-api-version')?.value || '', - notSupportedApiFeatures: - this.playerMetadata.getNamedItem('data-not-supported-api-features')?.value, - supportedUnitDefinitionTypes: - this.playerMetadata.getNamedItem('data-supported-unit-definition-types')?.value, - supportedUnitStateDataTypes: - this.playerMetadata.getNamedItem('data-supported-unit-state-data-types')?.value + ...playerMetadata }); } else { // eslint-disable-next-line no-console diff --git a/projects/player/src/html_wrapper/index.html b/projects/player/src/html_wrapper/index.html index c548a6bae666442cf6de228bd717e8ab3c605d43..c42654c5c34cec24331f6850f57832d8356ac88b 100644 --- a/projects/player/src/html_wrapper/index.html +++ b/projects/player/src/html_wrapper/index.html @@ -5,12 +5,12 @@ <title>Verona Player Aspect</title> <meta name="application-name" content="iqb-player-aspect" - data-version="3.3.3" + data-version="3.0.0" data-repository-url="https://github.com/iqb-berlin/verona-modules-apect" - data-api-version="2.1.0" + data-api-version="3.0.0" data-not-supported-api-features="" - data-supported-unit-definition-types="iqb-scripted@1.0" - data-supported-unit-state-data-types="iqb-key-value@1.0.0" + data-supported-unit-definition-types="iqb-aspect-module@0.0.1" + data-supported-unit-state-data-types="iqb-aspect-player@0.0.1" data-supported-browsers='{"Firefox": 69, "Chrome": 72, "Edge": 79}' /> <script type="application/ld+json"> diff --git a/projects/player/src/index.html b/projects/player/src/index.html index 1e7deeee86c5303ea83f959d54bd78b24d2d7d55..57c37ed7ee00083d31c0dc8d4d714706a0271211 100644 --- a/projects/player/src/index.html +++ b/projects/player/src/index.html @@ -4,12 +4,12 @@ <meta charset="utf-8"> <title>Player</title> <meta name="application-name" content="iqb-player-aspect" - data-version="3.3.3" + data-version="3.0.0" data-repository-url="https://github.com/iqb-berlin/verona-modules-apect" - data-api-version="2.1.0" + data-api-version="3.0.0" data-not-supported-api-features="" - data-supported-unit-definition-types="iqb-scripted@1.0" - data-supported-unit-state-data-types="iqb-key-value@1.0.0" + data-supported-unit-definition-types="iqb-aspect-module@0.0.1" + data-supported-unit-state-data-types="iqb-aspect-player@0.0.1" data-supported-browsers='{"Firefox": 69, "Chrome": 72, "Edge": 79}' /> <base href="/">