From 84c820bc6060052ea68d772f4eda85a7c044aef4 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Tue, 26 Aug 2025 22:56:48 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(frontend)=20add=20client-side=20API?= =?UTF-8?q?=20call=20for=20participant=20permission=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement frontend functionality to call backend endpoints for updating specific participant permissions through proper server-mediated requests. --- .../rooms/api/updateParticipantPermissions.ts | 41 +++++++++++++++++++ .../api/updateParticipantsPermissions.ts | 23 +++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/frontend/src/features/rooms/api/updateParticipantPermissions.ts create mode 100644 src/frontend/src/features/rooms/api/updateParticipantsPermissions.ts diff --git a/src/frontend/src/features/rooms/api/updateParticipantPermissions.ts b/src/frontend/src/features/rooms/api/updateParticipantPermissions.ts new file mode 100644 index 00000000..8db03289 --- /dev/null +++ b/src/frontend/src/features/rooms/api/updateParticipantPermissions.ts @@ -0,0 +1,41 @@ +import { Participant, Track } from 'livekit-client' +import { fetchApi } from '@/api/fetchApi' +import { useRoomData } from '@/features/rooms/livekit/hooks/useRoomData' +import Source = Track.Source + +export const useParticipantPermissions = () => { + const data = useRoomData() + + const updateParticipantPermissions = async ( + participant: Participant, + sources: Array + ) => { + if (!data?.id) { + throw new Error('Room id is not available') + } + + const newPermissions = { + can_subscribe: participant.permissions?.canSubscribe, + can_publish_data: participant.permissions?.canPublishData, + can_update_metadata: participant.permissions?.canUpdateMetadata, + can_subscribe_metrics: participant.permissions?.canSubscribeMetrics, + can_publish: sources.length > 0, + can_publish_sources: sources.map((source) => source.toUpperCase()), + } + + try { + return fetchApi(`rooms/${data.id}/update-participant/`, { + method: 'POST', + body: JSON.stringify({ + participant_identity: participant.identity, + permission: newPermissions, + }), + }) + } catch (error) { + console.error( + `Failed to update participant's permissions ${participant.identity}: ${error instanceof Error ? error.message : 'Unknown error'}` + ) + } + } + return { updateParticipantPermissions } +} diff --git a/src/frontend/src/features/rooms/api/updateParticipantsPermissions.ts b/src/frontend/src/features/rooms/api/updateParticipantsPermissions.ts new file mode 100644 index 00000000..098bc6c2 --- /dev/null +++ b/src/frontend/src/features/rooms/api/updateParticipantsPermissions.ts @@ -0,0 +1,23 @@ +import { Participant, Track } from 'livekit-client' +import { useParticipantPermissions } from './updateParticipantPermissions' +type Source = Track.Source + +export const useUpdateParticipantsPermissions = () => { + const { updateParticipantPermissions } = useParticipantPermissions() + + const updateParticipantsPermissions = ( + participants: Array, + sources: Array + ) => { + try { + const promises = participants.map((participant) => + updateParticipantPermissions(participant, sources) + ) + return Promise.all(promises) + } catch (error) { + console.error('An error occurred while updating permissions :', error) + throw new Error('An error occurred while updating permissions.') + } + } + return { updateParticipantsPermissions } +}