openvidu-components: Added directive for hidding/showing mute button

pull/707/head
csantosm 2022-03-10 12:55:43 +01:00
parent 41f83bc340
commit 27d70de3cd
7 changed files with 74 additions and 7 deletions

View File

@ -16,7 +16,6 @@
::ng-deep .participant-action-buttons > *:not(#action-btn) > * { ::ng-deep .participant-action-buttons > *:not(#action-btn) > * {
margin: auto; margin: auto;
} }
mat-list-item { mat-list-item {

View File

@ -11,7 +11,7 @@
<button <button
mat-icon-button mat-icon-button
id="action-btn" id="action-btn"
*ngIf="!_participant.local" *ngIf="!_participant.local && showMuteButton"
[class.warn-btn]="_participant.isMutedForcibly" [class.warn-btn]="_participant.isMutedForcibly"
(click)="toggleMuteForcibly()" (click)="toggleMuteForcibly()"
> >

View File

@ -1,6 +1,8 @@
import { ChangeDetectionStrategy, Component, ContentChild, Input, TemplateRef } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, Input, OnDestroy, OnInit, TemplateRef } from '@angular/core';
import { Subscription } from 'rxjs';
import { ParticipantPanelItemElementsDirective } from '../../../../directives/template/openvidu-angular.directive'; import { ParticipantPanelItemElementsDirective } from '../../../../directives/template/openvidu-angular.directive';
import { ParticipantAbstractModel } from '../../../../models/participant.model'; import { ParticipantAbstractModel } from '../../../../models/participant.model';
import { OpenViduAngularConfigService } from '../../../../services/config/openvidu-angular.config.service';
@Component({ @Component({
selector: 'ov-participant-panel-item', selector: 'ov-participant-panel-item',
@ -8,8 +10,11 @@ import { ParticipantAbstractModel } from '../../../../models/participant.model';
styleUrls: ['./participant-panel-item.component.css'], styleUrls: ['./participant-panel-item.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class ParticipantPanelItemComponent { export class ParticipantPanelItemComponent implements OnInit, OnDestroy {
@ContentChild('participantPanelItemElements', { read: TemplateRef }) participantPanelItemElementsTemplate: TemplateRef<any>; @ContentChild('participantPanelItemElements', { read: TemplateRef }) participantPanelItemElementsTemplate: TemplateRef<any>;
showMuteButton: boolean = true;
private muteButtonSub: Subscription;
@ContentChild(ParticipantPanelItemElementsDirective) @ContentChild(ParticipantPanelItemElementsDirective)
set externalItemElements(externalItemElements: ParticipantPanelItemElementsDirective) { set externalItemElements(externalItemElements: ParticipantPanelItemElementsDirective) {
// This directive will has value only when ITEM ELEMENTS component tagget with '*ovParticipantPanelItemElements' directive // This directive will has value only when ITEM ELEMENTS component tagget with '*ovParticipantPanelItemElements' directive
@ -25,9 +30,25 @@ export class ParticipantPanelItemComponent {
} }
_participant: ParticipantAbstractModel; _participant: ParticipantAbstractModel;
constructor() {} constructor(private libService: OpenViduAngularConfigService, private cd: ChangeDetectorRef) {}
ngOnInit(): void {
this.subscribeToParticipantPanelItemDirectives();
}
ngOnDestroy(): void {
if (this.muteButtonSub) this.muteButtonSub.unsubscribe();
}
toggleMuteForcibly() { toggleMuteForcibly() {
this._participant.setMutedForcibly(!this._participant.isMutedForcibly); this._participant.setMutedForcibly(!this._participant.isMutedForcibly);
} }
private subscribeToParticipantPanelItemDirectives() {
this.muteButtonSub = this.libService.participantItemMuteButton.subscribe((value: boolean) => {
console.warn("show mute", value);
this.showMuteButton = value;
this.cd.markForCheck();
});
}
} }

View File

@ -1,4 +1,5 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { ParticipantPanelItemMuteButtonDirective } from './participant-panel-item.directive';
import { import {
StreamDisplayParticipantNameDirective, StreamDisplayParticipantNameDirective,
StreamDisplayAudioDetectionDirective, StreamDisplayAudioDetectionDirective,
@ -31,7 +32,8 @@ import { AudioMutedDirective, MinimalDirective, VideoMutedDirective } from './vi
StreamDisplayParticipantNameDirective, StreamDisplayParticipantNameDirective,
StreamDisplayAudioDetectionDirective, StreamDisplayAudioDetectionDirective,
StreamSettingsButtonDirective, StreamSettingsButtonDirective,
LogoDirective LogoDirective,
ParticipantPanelItemMuteButtonDirective
], ],
exports: [ exports: [
MinimalDirective, MinimalDirective,
@ -47,7 +49,8 @@ import { AudioMutedDirective, MinimalDirective, VideoMutedDirective } from './vi
StreamDisplayParticipantNameDirective, StreamDisplayParticipantNameDirective,
StreamDisplayAudioDetectionDirective, StreamDisplayAudioDetectionDirective,
StreamSettingsButtonDirective, StreamSettingsButtonDirective,
LogoDirective LogoDirective,
ParticipantPanelItemMuteButtonDirective
] ]
}) })
export class ApiDirectiveModule {} export class ApiDirectiveModule {}

View File

@ -0,0 +1,39 @@
import { Directive, AfterViewInit, OnDestroy, Input, ElementRef } from '@angular/core';
import { OpenViduAngularConfigService } from '../../services/config/openvidu-angular.config.service';
@Directive({
selector: 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]'
})
export class ParticipantPanelItemMuteButtonDirective implements AfterViewInit, OnDestroy {
@Input() set participantPanelItemMuteButton(value: boolean) {
this.muteValue = value;
this.update(this.muteValue);
}
@Input() set muteButton(value: boolean) {
this.muteValue = value;
this.update(this.muteValue);
}
muteValue: boolean = true;
constructor(public elementRef: ElementRef, private libService: OpenViduAngularConfigService) {}
ngAfterViewInit() {
this.update(this.muteValue);
}
ngOnDestroy(): void {
this.clear();
}
clear() {
this.muteValue = true;
this.update(true);
}
update(value: boolean) {
console.warn('directive mute ', value);
if (this.libService.participantItemMuteButton.getValue() !== value) {
this.libService.participantItemMuteButton.next(value);
}
}
}

View File

@ -41,6 +41,8 @@ export class OpenViduAngularConfigService {
displayAudioDetectionObs: Observable<boolean>; displayAudioDetectionObs: Observable<boolean>;
settingsButton = <BehaviorSubject<boolean>>new BehaviorSubject(true); settingsButton = <BehaviorSubject<boolean>>new BehaviorSubject(true);
settingsButtonObs: Observable<boolean>; settingsButtonObs: Observable<boolean>;
participantItemMuteButton = <BehaviorSubject<boolean>>new BehaviorSubject(true);
participantItemMuteButtonObs: Observable<boolean>;
constructor(@Inject('OPENVIDU_ANGULAR_CONFIG') config: OpenViduAngularConfig) { constructor(@Inject('OPENVIDU_ANGULAR_CONFIG') config: OpenViduAngularConfig) {
this.configuration = config; this.configuration = config;
@ -61,6 +63,8 @@ export class OpenViduAngularConfigService {
this.displayParticipantNameObs = this.displayParticipantName.asObservable(); this.displayParticipantNameObs = this.displayParticipantName.asObservable();
this.displayAudioDetectionObs = this.displayAudioDetection.asObservable(); this.displayAudioDetectionObs = this.displayAudioDetection.asObservable();
this.settingsButtonObs = this.settingsButton.asObservable(); this.settingsButtonObs = this.settingsButton.asObservable();
// Participant item observables
this.participantItemMuteButtonObs = this.participantItemMuteButton.asObservable();
} }
getConfig(): OpenViduAngularConfig { getConfig(): OpenViduAngularConfig {

View File

@ -53,3 +53,4 @@ export * from './lib/directives/template/openvidu-angular.directive';
export * from './lib/directives/api/toolbar.directive'; export * from './lib/directives/api/toolbar.directive';
export * from './lib/directives/api/stream.directive'; export * from './lib/directives/api/stream.directive';
export * from './lib/directives/api/videoconference.directive'; export * from './lib/directives/api/videoconference.directive';
export * from './lib/directives/api/participant-panel-item.directive';