frontend: update meeting component for mobile link copying and improve leave button styling

This commit is contained in:
Carlos Santos 2025-09-22 15:06:43 +02:00
parent c310c984b1
commit dd8c5638df
4 changed files with 39 additions and 24 deletions

View File

@ -14,7 +14,6 @@ import { MatSelectModule } from '@angular/material/select';
import { MatTableModule } from '@angular/material/table'; import { MatTableModule } from '@angular/material/table';
import { MatToolbarModule } from '@angular/material/toolbar'; import { MatToolbarModule } from '@angular/material/toolbar';
import { MatTooltipModule } from '@angular/material/tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
import { ViewportService } from '@lib/services';
import { MeetRecordingInfo, MeetRecordingStatus } from '@lib/typings/ce'; import { MeetRecordingInfo, MeetRecordingStatus } from '@lib/typings/ce';
import { formatBytes, formatDurationToHMS } from '@lib/utils'; import { formatBytes, formatDurationToHMS } from '@lib/utils';
import { ViewportService } from 'openvidu-components-angular'; import { ViewportService } from 'openvidu-components-angular';

View File

@ -41,16 +41,27 @@
<ng-container *ovToolbarAdditionalButtons> <ng-container *ovToolbarAdditionalButtons>
<!-- Copy Link Button --> <!-- Copy Link Button -->
@if (features().canModerateRoom) { @if (features().canModerateRoom) {
<button @if (isMobile) {
id="copy-speaker-link" <button id="copy-speaker-link" mat-menu-item (click)="copySpeakerLink()" [disableRipple]="true">
mat-icon-button <mat-icon>link</mat-icon>
(click)="copySpeakerLink()" <span class="button-text">Copy meeting link</span>
[disableRipple]="true" </button>
matTooltip="Copy the meeting link" } @else {
> <button
<mat-icon>link</mat-icon> id="copy-speaker-link"
</button> mat-icon-button
(click)="copySpeakerLink()"
[disableRipple]="true"
matTooltip="Copy the meeting link"
>
<mat-icon>link</mat-icon>
</button>
}
}
</ng-container>
<ng-container *ovToolbarLeaveButton>
@if (features().canModerateRoom) {
<!-- Leave Button --> <!-- Leave Button -->
<button <button
id="leave-btn" id="leave-btn"
@ -59,6 +70,7 @@
matTooltip="Leave options" matTooltip="Leave options"
[disableRipple]="true" [disableRipple]="true"
class="custom-leave-btn" class="custom-leave-btn"
[class.mobile-btn]="isMobile"
> >
<mat-icon>call_end</mat-icon> <mat-icon>call_end</mat-icon>
</button> </button>
@ -112,9 +124,9 @@
<ov-participant-panel-item [participant]="participant"> <ov-participant-panel-item [participant]="participant">
<ng-container *ovParticipantPanelParticipantBadge> <ng-container *ovParticipantPanelParticipantBadge>
<span class="moderator-badge"> <span class="moderator-badge">
<mat-icon matTooltip="Moderator" class="material-symbols-outlined" <mat-icon matTooltip="Moderator" class="material-symbols-outlined">
>shield_person</mat-icon shield_person
> </mat-icon>
</span> </span>
</ng-container> </ng-container>
</ov-participant-panel-item> </ov-participant-panel-item>
@ -124,9 +136,9 @@
@if (participant.isModerator()) { @if (participant.isModerator()) {
<ng-container *ovParticipantPanelParticipantBadge> <ng-container *ovParticipantPanelParticipantBadge>
<span class="moderator-badge"> <span class="moderator-badge">
<mat-icon matTooltip="Moderator" class="material-symbols-outlined" <mat-icon matTooltip="Moderator" class="material-symbols-outlined">
>shield_person</mat-icon shield_person
> </mat-icon>
</span> </span>
</ng-container> </ng-container>
} }

View File

@ -294,15 +294,12 @@
// Custom leave button styling (existing functionality) // Custom leave button styling (existing functionality)
::ng-deep { ::ng-deep {
#media-buttons-container .custom-leave-btn { #media-buttons-container .custom-leave-btn {
&:hover {
background-color: var(--ov-meet-color-error) !important;
}
text-align: center; text-align: center;
background-color: var(--ov-meet-color-error) !important; background-color: var(--ov-meet-color-error) !important;
color: #fff !important; color: #fff !important;
border-radius: var(--ov-meet-radius-md) !important; border-radius: var(--ov-meet-radius-md) !important;
width: 65px !important; width: 65px;
margin: 0px !important; margin: 6px !important;
} }
} }

View File

@ -46,6 +46,7 @@ import {
ApiDirectiveModule, ApiDirectiveModule,
ParticipantService as ComponentParticipantService, ParticipantService as ComponentParticipantService,
DataPacket_Kind, DataPacket_Kind,
LeaveButtonDirective,
OpenViduComponentsUiModule, OpenViduComponentsUiModule,
OpenViduService, OpenViduService,
ParticipantLeftEvent, ParticipantLeftEvent,
@ -56,7 +57,8 @@ import {
RemoteParticipant, RemoteParticipant,
Room, Room,
RoomEvent, RoomEvent,
Track Track,
ViewportService
} from 'openvidu-components-angular'; } from 'openvidu-components-angular';
import { combineLatest, Subject, takeUntil } from 'rxjs'; import { combineLatest, Subject, takeUntil } from 'rxjs';
@ -67,7 +69,7 @@ import { combineLatest, Subject, takeUntil } from 'rxjs';
standalone: true, standalone: true,
imports: [ imports: [
OpenViduComponentsUiModule, OpenViduComponentsUiModule,
ApiDirectiveModule, // ApiDirectiveModule,
CommonModule, CommonModule,
MatFormFieldModule, MatFormFieldModule,
MatInputModule, MatInputModule,
@ -125,7 +127,8 @@ export class MeetingComponent implements OnInit {
protected ovComponentsParticipantService: ComponentParticipantService, protected ovComponentsParticipantService: ComponentParticipantService,
protected navigationService: NavigationService, protected navigationService: NavigationService,
protected notificationService: NotificationService, protected notificationService: NotificationService,
protected clipboard: Clipboard protected clipboard: Clipboard,
protected viewportService: ViewportService
) { ) {
this.features = this.featureConfService.features; this.features = this.featureConfService.features;
} }
@ -138,6 +141,10 @@ export class MeetingComponent implements OnInit {
return window.location.origin.replace('http://', '').replace('https://', ''); return window.location.origin.replace('http://', '').replace('https://', '');
} }
get isMobile(): boolean {
return this.viewportService.isMobile();
}
async ngOnInit() { async ngOnInit() {
this.roomId = this.roomService.getRoomId(); this.roomId = this.roomService.getRoomId();
this.roomSecret = this.roomService.getRoomSecret(); this.roomSecret = this.roomService.getRoomSecret();