Skip to content
Snippets Groups Projects
media-player-element-component.directive.ts 1.99 KiB
Newer Older
  • Learn to ignore specific revisions
  •   Directive, EventEmitter, Input, OnDestroy, OnInit, Output
    
    import { Subject } from 'rxjs';
    
    import { takeUntil } from 'rxjs/operators';
    
    import { AudioElement } from 'common/models/elements/media-elements/audio';
    import { VideoElement } from 'common/models/elements/media-elements/video';
    import { ValueChangeElement } from 'common/models/elements/element';
    
    rhenck's avatar
    rhenck committed
    import { ElementComponent } from './element-component.directive';
    
    export abstract class MediaPlayerElementComponent extends ElementComponent implements OnInit, OnDestroy {
    
      @Input() savedPlaybackTime!: number;
    
      @Input() actualPlayingId!: Subject<string | null>;
      @Input() mediaStatusChanged!: Subject<string>;
    
      @Output() elementValueChanged = new EventEmitter<ValueChangeElement>();
    
      @Output() mediaPlayStatusChanged = new EventEmitter<string | null>();
      @Output() mediaValidStatusChanged = new EventEmitter<string>();
    
      abstract elementModel: AudioElement | VideoElement;
    
      active: boolean = true;
    
      isLoaded: Subject<boolean> = new Subject<boolean>();
    
      dependencyDissolved!: boolean;
    
      private ngUnsubscribe = new Subject<void>();
    
      ngOnInit(): void {
    
        this.dependencyDissolved = !this.elementModel.player.activeAfterID;
    
        if (this.actualPlayingId) {
          this.actualPlayingId
    
            .pipe(takeUntil(this.ngUnsubscribe))
    
            .subscribe((actualID: string | null): void => this.setActualPlayingMediaId(actualID));
        }
        if (this.mediaStatusChanged) {
          this.mediaStatusChanged
    
            .pipe(takeUntil(this.ngUnsubscribe))
    
            .subscribe((id: string): void => this.setActivatedAfterID(id));
        }
      }
    
      private setActualPlayingMediaId(id: string | null): void {
    
        this.active = !id || id === this.elementModel.id;
      }
    
      private setActivatedAfterID(id: string): void {
        if (!this.dependencyDissolved) {
    
          this.dependencyDissolved = id === (this.elementModel).player.activeAfterID;
    
    
      ngOnDestroy(): void {
        this.ngUnsubscribe.next();
        this.ngUnsubscribe.complete();
      }