2022-02-07 15:40:05 +01:00
|
|
|
import { Component, ContentChild, ElementRef, HostListener, Input, OnInit, TemplateRef, ViewChild } from '@angular/core';
|
2022-01-19 17:24:11 +01:00
|
|
|
import { FormControl, Validators } from '@angular/forms';
|
|
|
|
import { MatMenuPanel, MatMenuTrigger } from '@angular/material/menu';
|
|
|
|
import { NicknameMatcher } from '../../matchers/nickname.matcher';
|
|
|
|
import { VideoSizeIcon } from '../../models/icon.model';
|
|
|
|
import { ScreenType, VideoType } from '../../models/video-type.model';
|
|
|
|
import { Storage } from '../../models/storage.model';
|
|
|
|
import { DocumentService } from '../../services/document/document.service';
|
|
|
|
import { CdkOverlayService } from '../../services/cdk-overlay/cdk-overlay.service';
|
|
|
|
import { WebrtcService } from '../../services/webrtc/webrtc.service';
|
|
|
|
import { LayoutService } from '../../services/layout/layout.service';
|
|
|
|
import { StorageService } from '../../services/storage/storage.service';
|
|
|
|
import { Signal } from '../../models/signal.model';
|
|
|
|
import { LayoutClass } from '../../models/layout.model';
|
|
|
|
import { PublisherProperties } from 'openvidu-browser';
|
2022-01-26 11:30:30 +01:00
|
|
|
import { StreamModel } from '../../models/participant.model';
|
2022-01-19 17:24:11 +01:00
|
|
|
import { ParticipantService } from '../../services/participant/participant.service';
|
|
|
|
|
|
|
|
@Component({
|
2022-01-26 11:30:30 +01:00
|
|
|
selector: 'ov-stream',
|
|
|
|
templateUrl: './stream.component.html',
|
|
|
|
styleUrls: ['./stream.component.css']
|
2022-01-19 17:24:11 +01:00
|
|
|
})
|
2022-01-26 11:30:30 +01:00
|
|
|
export class StreamComponent implements OnInit {
|
2022-01-19 17:24:11 +01:00
|
|
|
videoSizeIconEnum = VideoSizeIcon;
|
|
|
|
videoTypeEnum = VideoType;
|
|
|
|
videoSizeIcon: VideoSizeIcon = VideoSizeIcon.BIG;
|
|
|
|
mutedSound: boolean;
|
|
|
|
toggleNickname: boolean;
|
|
|
|
nicknameFormControl: FormControl;
|
|
|
|
matcher: NicknameMatcher;
|
2022-02-07 10:43:21 +01:00
|
|
|
_stream: StreamModel;
|
2022-02-07 15:40:05 +01:00
|
|
|
private _streamContainer: ElementRef;
|
2022-01-19 17:24:11 +01:00
|
|
|
@ViewChild(MatMenuTrigger) public menuTrigger: MatMenuTrigger;
|
|
|
|
@ViewChild('menu') menu: MatMenuPanel;
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
protected documentService: DocumentService,
|
|
|
|
protected openViduWebRTCService: WebrtcService,
|
|
|
|
protected layoutService: LayoutService,
|
|
|
|
protected participantService: ParticipantService,
|
|
|
|
protected storageService: StorageService,
|
|
|
|
protected cdkSrv: CdkOverlayService
|
|
|
|
) {}
|
|
|
|
|
|
|
|
// @HostListener('document:fullscreenchange', ['$event'])
|
|
|
|
// @HostListener('document:webkitfullscreenchange', ['$event'])
|
|
|
|
// @HostListener('document:mozfullscreenchange', ['$event'])
|
|
|
|
// @HostListener('document:MSFullscreenChange', ['$event'])
|
|
|
|
// onFullscreenHandler(event) {
|
|
|
|
// this.isFullscreenEnabled = !this.isFullscreenEnabled;
|
|
|
|
// }
|
|
|
|
|
2022-02-07 15:40:05 +01:00
|
|
|
@ViewChild('streamContainer', { static: false, read: ElementRef })
|
|
|
|
set streamContainer(streamContainer: ElementRef) {
|
|
|
|
setTimeout(() => {
|
|
|
|
if (streamContainer) {
|
|
|
|
this._streamContainer = streamContainer;
|
|
|
|
if (this._stream.type === VideoType.SCREEN) {
|
|
|
|
this.toggleVideoEnlarged(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, 0);
|
|
|
|
}
|
2022-01-19 17:24:11 +01:00
|
|
|
|
|
|
|
@Input()
|
2022-02-07 10:43:21 +01:00
|
|
|
set stream(stream: StreamModel) {
|
|
|
|
this._stream = stream;
|
2022-02-07 15:40:05 +01:00
|
|
|
this.checkVideoEnlarged();
|
2022-02-07 10:43:21 +01:00
|
|
|
this.nicknameFormControl = new FormControl(this._stream.nickname, [Validators.maxLength(25), Validators.required]);
|
2022-01-19 17:24:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@ViewChild('nicknameInput')
|
|
|
|
set nicknameInputElement(element: ElementRef) {
|
|
|
|
setTimeout(() => {
|
|
|
|
element?.nativeElement.focus();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
ngOnInit() {
|
|
|
|
this.matcher = new NicknameMatcher();
|
|
|
|
}
|
|
|
|
|
|
|
|
ngOnDestroy() {
|
|
|
|
this.cdkSrv.setSelector('body');
|
|
|
|
}
|
|
|
|
|
2022-02-07 15:40:05 +01:00
|
|
|
toggleVideoEnlarged(resetAll?) {
|
|
|
|
const element = this.documentService.getHTMLElementByClassName(this._streamContainer.nativeElement, LayoutClass.ROOT_ELEMENT);
|
2022-01-19 17:24:11 +01:00
|
|
|
if (!!resetAll) {
|
|
|
|
this.documentService.removeAllBigElementClass();
|
2022-02-07 15:40:05 +01:00
|
|
|
this.participantService.resetMyVideoEnlarged();
|
|
|
|
this.participantService.resetRemotesVideoEnlarged();
|
2022-01-19 17:24:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
this.documentService.toggleBigElementClass(element);
|
|
|
|
|
2022-02-07 10:43:21 +01:00
|
|
|
if (!!this._stream.streamManager?.stream?.connection?.connectionId) {
|
|
|
|
if (this.openViduWebRTCService.isMyOwnConnection(this._stream.streamManager?.stream?.connection?.connectionId)) {
|
2022-02-07 15:40:05 +01:00
|
|
|
this.participantService.toggleMyVideoEnlarged(this._stream.streamManager?.stream?.connection?.connectionId);
|
2022-01-19 17:24:11 +01:00
|
|
|
} else {
|
2022-02-07 15:40:05 +01:00
|
|
|
this.participantService.toggleRemoteVideoEnlarged(this._stream.streamManager?.stream?.connection?.connectionId);
|
2022-01-19 17:24:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
this.layoutService.update();
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleVideoMenu(event) {
|
|
|
|
if (this.menuTrigger.menuOpen) {
|
|
|
|
this.menuTrigger.closeMenu();
|
|
|
|
return;
|
|
|
|
}
|
2022-02-07 10:43:21 +01:00
|
|
|
this.cdkSrv.setSelector('#container-' + this._stream.streamManager?.stream?.streamId);
|
2022-01-19 17:24:11 +01:00
|
|
|
this.menuTrigger.openMenu();
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleSound() {
|
|
|
|
this.mutedSound = !this.mutedSound;
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleNicknameForm() {
|
2022-02-07 10:43:21 +01:00
|
|
|
if (this._stream.local) {
|
2022-01-19 17:24:11 +01:00
|
|
|
this.toggleNickname = !this.toggleNickname;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
eventKeyPress(event) {
|
|
|
|
if (event && event.keyCode === 13 && this.nicknameFormControl.valid) {
|
|
|
|
const nickname = this.nicknameFormControl.value;
|
2022-02-07 10:43:21 +01:00
|
|
|
this.participantService.setNickname(this._stream.connectionId, nickname);
|
2022-01-19 17:24:11 +01:00
|
|
|
this.storageService.set(Storage.USER_NICKNAME, nickname);
|
2022-02-07 15:40:05 +01:00
|
|
|
this.openViduWebRTCService.sendSignal(Signal.NICKNAME_CHANGED, undefined, { clientData: nickname });
|
2022-01-19 17:24:11 +01:00
|
|
|
this.toggleNicknameForm();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async replaceScreenTrack() {
|
|
|
|
const properties: PublisherProperties = {
|
|
|
|
videoSource: ScreenType.SCREEN,
|
|
|
|
publishVideo: true,
|
|
|
|
publishAudio: !this.participantService.isMyCameraEnabled(),
|
|
|
|
mirror: false
|
|
|
|
};
|
|
|
|
await this.openViduWebRTCService.replaceTrack(this.participantService.getMyScreenPublisher(), properties);
|
|
|
|
}
|
|
|
|
|
2022-02-07 15:40:05 +01:00
|
|
|
protected checkVideoEnlarged() {
|
|
|
|
this.videoSizeIcon = this._stream.videoEnlarged ? VideoSizeIcon.NORMAL : VideoSizeIcon.BIG;
|
2022-01-19 17:24:11 +01:00
|
|
|
}
|
|
|
|
}
|