From eb8ab3fe63ee412689f29e5ed38b506aedc96565 Mon Sep 17 00:00:00 2001 From: Carlos Santos <4a.santos@gmail.com> Date: Thu, 7 Aug 2025 18:36:25 +0200 Subject: [PATCH] frontend: implement custom participant model and role management in meeting component --- .../lib/models/custom-participant.model.ts | 39 +++++++++ .../lib/pages/meeting/meeting.component.html | 87 +++++++++++++++---- .../lib/pages/meeting/meeting.component.scss | 17 ++++ .../lib/pages/meeting/meeting.component.ts | 39 +++++++-- .../src/lib/services/http.service.ts | 5 ++ .../src/lib/services/meeting.service.ts | 19 ++++ frontend/src/app/app.config.ts | 6 +- 7 files changed, 190 insertions(+), 22 deletions(-) create mode 100644 frontend/projects/shared-meet-components/src/lib/models/custom-participant.model.ts diff --git a/frontend/projects/shared-meet-components/src/lib/models/custom-participant.model.ts b/frontend/projects/shared-meet-components/src/lib/models/custom-participant.model.ts new file mode 100644 index 0000000..4ac9665 --- /dev/null +++ b/frontend/projects/shared-meet-components/src/lib/models/custom-participant.model.ts @@ -0,0 +1,39 @@ +import { MeetTokenMetadata, ParticipantRole } from '@lib/typings/ce'; +import { ParticipantModel, ParticipantProperties } from 'openvidu-components-angular'; + +// Represents a participant in the application. +export class CustomParticipantModel extends ParticipantModel { + // Indicates the role of the participant. + private _meetRole: ParticipantRole; + + // Creates a new instance of CustomParticipantModel. + constructor(props: ParticipantProperties) { + super(props); + const participant = props.participant; + this._meetRole = extractParticipantRole(participant.metadata); + } + + // Sets the role of the participant. + set meetRole(role: ParticipantRole) { + this._meetRole = role; + } + + // Checks if the participant is a moderator. + // Returns true if the participant's role is MODERATOR, otherwise false. + isModerator(): boolean { + return this._meetRole === ParticipantRole.MODERATOR; + } +} + +const extractParticipantRole = (metadata: any): ParticipantRole => { + let parsedMetadata: MeetTokenMetadata = metadata; + try { + parsedMetadata = JSON.parse(metadata || '{}'); + } catch (e) { + console.warn('Failed to parse participant metadata:', e); + } + if (!parsedMetadata || typeof parsedMetadata !== 'object') { + return ParticipantRole.PUBLISHER; + } + return parsedMetadata.selectedRole || ParticipantRole.PUBLISHER; +}; diff --git a/frontend/projects/shared-meet-components/src/lib/pages/meeting/meeting.component.html b/frontend/projects/shared-meet-components/src/lib/pages/meeting/meeting.component.html index 70dd790..63ea4f5 100644 --- a/frontend/projects/shared-meet-components/src/lib/pages/meeting/meeting.component.html +++ b/frontend/projects/shared-meet-components/src/lib/pages/meeting/meeting.component.html @@ -77,21 +77,6 @@ - -
- - @if (!participant.isLocal) { - - } -
-