diff --git a/projects/player/src/app/services/intersection.service.ts b/projects/player/src/app/classes/intersection-detector.ts similarity index 73% rename from projects/player/src/app/services/intersection.service.ts rename to projects/player/src/app/classes/intersection-detector.ts index df382b5b02c4308c2e08a7dc440e2ca0f366a9df..f7488dc089e865c8ac269a2c4669eb0cfe8b0c86 100644 --- a/projects/player/src/app/services/intersection.service.ts +++ b/projects/player/src/app/classes/intersection-detector.ts @@ -1,17 +1,13 @@ -import { - EventEmitter, Inject, Injectable, Output -} from '@angular/core'; -import { DOCUMENT } from '@angular/common'; +import { EventEmitter } from '@angular/core'; -@Injectable({ - providedIn: 'root' -}) -export class IntersectionService { +export class IntersectionDetector { intersectionObserver!: IntersectionObserver; elements: { id: string, element: Element }[] = []; - @Output() intersecting = new EventEmitter<string>(); + root!: Document; + intersecting = new EventEmitter<string>(); - constructor(@Inject(DOCUMENT) private document: Document) { + constructor(root: Document) { + this.root = root; this.initIntersectionObserver(); } @@ -24,7 +20,7 @@ export class IntersectionService { } }); }, { - root: document, + root: this.root, rootMargin: '0px 0px 0px 0px' } ); @@ -39,7 +35,6 @@ export class IntersectionService { 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/services/unit-state.service.ts b/projects/player/src/app/services/unit-state.service.ts index 5fe370dc834eabbf856f94a767c4332b17184343..f7196967a38d1055fcb78d62c315ac91c0e38472 100644 --- a/projects/player/src/app/services/unit-state.service.ts +++ b/projects/player/src/app/services/unit-state.service.ts @@ -1,5 +1,6 @@ -import { Injectable } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { Observable, Subject } from 'rxjs'; +import { DOCUMENT } from '@angular/common'; import { StatusChangeElement, UnitStateElementCode, @@ -12,7 +13,7 @@ import { import { TextElement } from '../../../../common/models/text-element'; import { VideoElement } from '../../../../common/models/video-element'; import { AudioElement } from '../../../../common/models/audio-element'; -import { IntersectionService } from './intersection.service'; +import { IntersectionDetector } from '../classes/intersection-detector'; @Injectable({ providedIn: 'root' @@ -20,9 +21,12 @@ import { IntersectionService } from './intersection.service'; export class UnitStateService { private _presentedPageAdded = new Subject<number>(); private _unitStateElementCodeChanged = new Subject<UnitStateElementCode>(); + private intersectionDetector!: IntersectionDetector; unitStateElementCodes!: UnitStateElementCode[]; - constructor(private intersectionService: IntersectionService) {} + constructor(@Inject(DOCUMENT) private document: Document) { + this.intersectionDetector = new IntersectionDetector(document); + } private getUnitStateElement(id: string): UnitStateElementCode | undefined { return this.unitStateElementCodes @@ -58,8 +62,8 @@ export class UnitStateService { registerElement(elementModel: UIElement, element: Element): void { this.initUnitStateValue(elementModel); - this.intersectionService.observe(elementModel.id, element); - this.intersectionService.intersecting + this.intersectionDetector.observe(elementModel.id, element); + this.intersectionDetector.intersecting .subscribe((id: string) => { this.changeElementStatus({ id: id, status: 'DISPLAYED' }); });