frontend: update meeting component to improve closed room state

This commit is contained in:
juancarmore 2025-09-03 16:45:25 +02:00
parent c10aadfbd5
commit e2d61483f1
3 changed files with 64 additions and 44 deletions

View File

@ -208,7 +208,6 @@
<mat-icon class="ov-room-icon room-icon">video_chat</mat-icon> <mat-icon class="ov-room-icon room-icon">video_chat</mat-icon>
<div class="room-info"> <div class="room-info">
<h1 class="room-title">{{ roomName }}</h1> <h1 class="room-title">{{ roomName }}</h1>
<p class="room-subtitle">Choose how you want to proceed</p>
</div> </div>
</div> </div>
@ -222,43 +221,53 @@
<mat-card-title>{{ roomClosed ? 'Room Closed' : 'Join Meeting' }}</mat-card-title> <mat-card-title>{{ roomClosed ? 'Room Closed' : 'Join Meeting' }}</mat-card-title>
<mat-card-subtitle>{{ <mat-card-subtitle>{{
roomClosed roomClosed
? 'This room is currently closed and not accepting new participants' ? 'This room is not available for meetings'
: 'Enter the room and start connecting' : 'Enter the room and start connecting'
}}</mat-card-subtitle> }}</mat-card-subtitle>
</div> </div>
</mat-card-header> </mat-card-header>
<mat-card-content class="card-content"> <mat-card-content class="card-content">
<form [formGroup]="participantForm" (ngSubmit)="submitAccessMeeting()" class="join-form"> @if (!roomClosed) {
<mat-form-field appearance="outline" class="name-field"> <form [formGroup]="participantForm" (ngSubmit)="submitAccessMeeting()" class="join-form">
<mat-label>Your display name</mat-label> <mat-form-field appearance="outline" class="name-field">
<input <mat-label>Your display name</mat-label>
id="participant-name-input" <input
matInput id="participant-name-input"
placeholder="Enter your name" matInput
formControlName="name" placeholder="Enter your name"
required formControlName="name"
/> required
<mat-icon matSuffix class="ov-action-icon">person</mat-icon> />
@if (participantForm.get('name')?.hasError('minlength')) { <mat-icon matSuffix class="ov-action-icon">person</mat-icon>
<mat-error> The name must be at least <strong>4 characters</strong> </mat-error> @if (participantForm.get('name')?.hasError('minlength')) {
} <mat-error> The name must be at least <strong>4 characters</strong> </mat-error>
@if (participantForm.get('name')?.hasError('required')) { }
<mat-error> The name is <strong>required</strong> </mat-error> @if (participantForm.get('name')?.hasError('required')) {
} <mat-error> The name is <strong>required</strong> </mat-error>
</mat-form-field> }
</mat-form-field>
<button <button
mat-raised-button mat-raised-button
color="primary" color="primary"
id="participant-name-submit" id="participant-name-submit"
type="submit" type="submit"
class="join-button" class="join-button"
[disabled]="participantForm.invalid || roomClosed" [disabled]="participantForm.invalid"
> >
<span>Join Meeting</span> <span>Join Meeting</span>
</button> </button>
</form> </form>
} @else {
<div class="room-closed-message">
<mat-icon class="warning-icon">warning</mat-icon>
<p>
Sorry, this room is closed. You cannot join at this time. Please contact the meeting
organizer for more information.
</p>
</div>
}
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
@ -296,7 +305,7 @@
</div> </div>
<!-- Room URL Badge --> <!-- Room URL Badge -->
@if (features().canModerateRoom) { @if (!roomClosed && features().canModerateRoom) {
<ov-share-meeting-link <ov-share-meeting-link
[meetingUrl]="hostname + '/room/' + roomId" [meetingUrl]="hostname + '/room/' + roomId"
(copyClicked)="copySpeakerLink()" (copyClicked)="copySpeakerLink()"

View File

@ -31,13 +31,6 @@
color: var(--ov-meet-text-primary); color: var(--ov-meet-text-primary);
line-height: var(--ov-meet-line-height-tight); line-height: var(--ov-meet-line-height-tight);
} }
.room-subtitle {
margin: var(--ov-meet-spacing-xs) 0 0 0;
font-size: var(--ov-meet-font-size-lg);
color: var(--ov-meet-text-secondary);
line-height: var(--ov-meet-line-height-normal);
}
} }
} }
@ -145,11 +138,34 @@
} }
} }
.room-closed-message {
@include ov-flex-center;
flex-direction: column;
gap: var(--ov-meet-spacing-md);
text-align: center;
.warning-icon {
@include ov-icon(xl);
color: var(--ov-meet-color-warning);
}
p {
margin: 0;
font-size: var(--ov-meet-font-size-md);
color: var(--ov-meet-text-secondary);
line-height: var(--ov-meet-line-height-relaxed);
}
}
// Secondary Card - Recordings styling // Secondary Card - Recordings styling
.secondary-card { .secondary-card {
.card-header { .card-header {
background: linear-gradient(135deg, var(--ov-meet-surface-color) 0%, var(--ov-meet-color-accent) 180%); background: linear-gradient(135deg, var(--ov-meet-surface-color) 0%, var(--ov-meet-color-accent) 180%);
} }
.card-content {
text-align: center;
}
} }
// Join Form - Form styling // Join Form - Form styling

View File

@ -223,11 +223,6 @@ export class MeetingComponent implements OnInit {
if (participantName) { if (participantName) {
this.participantForm.get('name')?.setValue(participantName); this.participantForm.get('name')?.setValue(participantName);
} }
// Disable the form if the room is closed
if (this.roomClosed) {
this.participantForm.disable();
}
} }
async goToRecordings() { async goToRecordings() {