From 4d384ee426b75e2cd2d37ec4be311b38f1e9c33d Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Fri, 29 Oct 2021 15:15:30 +0200
Subject: [PATCH] [player] Remove methods from UnitStateService to
 ElementContainer

---
 .../src/app/classes/intersection-detector.ts  |  1 +
 .../element-container.component.ts            | 44 +++++++++++++++--
 .../src/app/services/unit-state.service.ts    | 49 ++-----------------
 3 files changed, 46 insertions(+), 48 deletions(-)

diff --git a/projects/player/src/app/classes/intersection-detector.ts b/projects/player/src/app/classes/intersection-detector.ts
index f7488dc08..9d760c93b 100644
--- a/projects/player/src/app/classes/intersection-detector.ts
+++ b/projects/player/src/app/classes/intersection-detector.ts
@@ -35,6 +35,7 @@ export class IntersectionDetector {
     const intersectedElementIndex = this.elements.findIndex(e => e.element === element);
     if (intersectedElementIndex > -1) {
       const intersectedElement = this.elements[intersectedElementIndex];
+      this.intersecting.emit(intersectedElement.id);
       this.intersectionObserver.unobserve(intersectedElement.element);
       this.elements.splice(intersectedElementIndex, 1);
     }
diff --git a/projects/player/src/app/components/element-container/element-container.component.ts b/projects/player/src/app/components/element-container/element-container.component.ts
index 74358834c..be1e6acef 100644
--- a/projects/player/src/app/components/element-container/element-container.component.ts
+++ b/projects/player/src/app/components/element-container/element-container.component.ts
@@ -14,7 +14,7 @@ import { FormService } from '../../services/form.service';
 import { UnitStateService } from '../../services/unit-state.service';
 import { MarkingService } from '../../services/marking.service';
 import {
-  InputElement,
+  InputElement, InputElementValue,
   UIElement,
   ValueChangeElement
 } from '../../../../../common/models/uI-element';
@@ -23,6 +23,9 @@ import { FormElementComponent } from '../../../../../common/form-element-compone
 import { ElementComponent } from '../../../../../common/element-component.directive';
 import { CompoundElementComponent }
   from '../../../../../common/element-components/compound-elements/compound-element.directive';
+import { TextElement } from '../../../../../common/models/text-element';
+import { VideoElement } from '../../../../../common/models/video-element';
+import { AudioElement } from '../../../../../common/models/audio-element';
 
 @Component({
   selector: 'app-element-container',
@@ -54,10 +57,12 @@ export class ElementContainerComponent implements OnInit {
     const elementComponentFactory =
       ElementFactory.getComponentFactory(this.elementModel.type, this.componentFactoryResolver);
     const elementComponent = this.elementComponentContainer.createComponent(elementComponentFactory).instance;
-    elementComponent.elementModel = this.unitStateService.restoreUnitStateValue(this.elementModel);
+    elementComponent.elementModel = this.restoreUnitStateValue(this.elementModel);
 
     if (elementComponent.domElement) {
-      this.unitStateService.registerElement(elementComponent.elementModel, elementComponent.domElement);
+      this.unitStateService.registerElement(
+        this.initUnitStateValue(elementComponent.elementModel), elementComponent.domElement
+      );
     }
 
     if (elementComponent.childrenAdded) {
@@ -66,7 +71,7 @@ export class ElementContainerComponent implements OnInit {
         .subscribe((children: QueryList<ElementComponent>) => {
           children.forEach(child => {
             if (child.domElement) {
-              this.unitStateService.registerElement(child.elementModel, child.domElement);
+              this.unitStateService.registerElement(this.initUnitStateValue(child.elementModel), child.domElement);
             }
           });
         });
@@ -141,6 +146,37 @@ export class ElementContainerComponent implements OnInit {
     }
   }
 
+  private restoreUnitStateValue(elementModel: UIElement): UIElement {
+    const unitStateElementCode = this.unitStateService.getUnitStateElement(elementModel.id);
+    if (unitStateElementCode && unitStateElementCode.value !== undefined) {
+      switch (elementModel.type) {
+        case 'text':
+          elementModel.text = unitStateElementCode.value;
+          break;
+        case 'video':
+        case 'audio':
+          elementModel.playbackTime = unitStateElementCode.value;
+          break;
+        default:
+          elementModel.value = unitStateElementCode.value;
+      }
+    }
+    return elementModel;
+  }
+
+  private initUnitStateValue = (elementModel: UIElement): { id: string, value: InputElementValue } => {
+    switch (elementModel.type) {
+      case 'text':
+        return { id: elementModel.id, value: (elementModel as TextElement).text };
+      case 'video':
+        return { id: elementModel.id, value: (elementModel as VideoElement).playbackTime };
+      case 'audio':
+        return { id: elementModel.id, value: (elementModel as AudioElement).playbackTime };
+      default:
+        return { id: elementModel.id, value: (elementModel as InputElement).value };
+    }
+  };
+
   private registerFormGroup(elementForm: FormGroup): void {
     this.formService.registerFormGroup({
       formGroup: elementForm,
diff --git a/projects/player/src/app/services/unit-state.service.ts b/projects/player/src/app/services/unit-state.service.ts
index f7196967a..ff9a503d0 100644
--- a/projects/player/src/app/services/unit-state.service.ts
+++ b/projects/player/src/app/services/unit-state.service.ts
@@ -7,12 +7,7 @@ import {
   UnitStateElementCodeStatus,
   UnitStateElementCodeStatusValue
 } from '../models/verona';
-import {
-  InputElement, InputElementValue, UIElement, ValueChangeElement
-} from '../../../../common/models/uI-element';
-import { TextElement } from '../../../../common/models/text-element';
-import { VideoElement } from '../../../../common/models/video-element';
-import { AudioElement } from '../../../../common/models/audio-element';
+import { InputElementValue, ValueChangeElement } from '../../../../common/models/uI-element';
 import { IntersectionDetector } from '../classes/intersection-detector';
 
 @Injectable({
@@ -28,7 +23,7 @@ export class UnitStateService {
     this.intersectionDetector = new IntersectionDetector(document);
   }
 
-  private getUnitStateElement(id: string): UnitStateElementCode | undefined {
+  getUnitStateElement(id: string): UnitStateElementCode | undefined {
     return this.unitStateElementCodes
       .find((elementCode: UnitStateElementCode): boolean => elementCode.id === id);
   }
@@ -60,33 +55,15 @@ export class UnitStateService {
     return this._presentedPageAdded.asObservable();
   }
 
-  registerElement(elementModel: UIElement, element: Element): void {
-    this.initUnitStateValue(elementModel);
-    this.intersectionDetector.observe(elementModel.id, element);
+  registerElement(element: { id: string, value: InputElementValue }, domElement: Element): void {
+    this.addUnitStateElementCode(element.id, element.value);
+    this.intersectionDetector.observe(element.id, domElement);
     this.intersectionDetector.intersecting
       .subscribe((id: string) => {
         this.changeElementStatus({ id: id, status: 'DISPLAYED' });
       });
   }
 
-  restoreUnitStateValue(elementModel: UIElement): UIElement {
-    const unitStateElementCode = this.getUnitStateElement(elementModel.id);
-    if (unitStateElementCode && unitStateElementCode.value !== undefined) {
-      switch (elementModel.type) {
-        case 'text':
-          elementModel.text = unitStateElementCode.value;
-          break;
-        case 'video':
-        case 'audio':
-          elementModel.playbackTime = unitStateElementCode.value;
-          break;
-        default:
-          elementModel.value = unitStateElementCode.value;
-      }
-    }
-    return elementModel;
-  }
-
   addPresentedPage(presentedPage: number): void {
     this._presentedPageAdded.next(presentedPage);
   }
@@ -105,22 +82,6 @@ export class UnitStateService {
     this.setUnitStateElementCodeStatus(elementStatus.id, elementStatus.status);
   }
 
-  private initUnitStateValue(elementModel: UIElement): void {
-    switch (elementModel.type) {
-      case 'text':
-        this.addUnitStateElementCode(elementModel.id, (elementModel as TextElement).text);
-        break;
-      case 'video':
-        this.addUnitStateElementCode(elementModel.id, (elementModel as VideoElement).playbackTime);
-        break;
-      case 'audio':
-        this.addUnitStateElementCode(elementModel.id, (elementModel as AudioElement).playbackTime);
-        break;
-      default:
-        this.addUnitStateElementCode(elementModel.id, (elementModel as InputElement).value);
-    }
-  }
-
   private addUnitStateElementCode(id: string, value: InputElementValue): void {
     if (!this.getUnitStateElement(id)) {
       const unitStateElementCode: UnitStateElementCode = { id: id, value: value, status: 'NOT_REACHED' };
-- 
GitLab