(frontend) notify participant when her was muted

Make sure a participant is notified when another one muted her.
It will help display a notification to alert the participant.
This commit is contained in:
lebaudantoine
2025-02-11 18:13:18 +01:00
committed by aleb_the_flash
parent fc36ae8b49
commit bd4fcc2a5e
2 changed files with 41 additions and 17 deletions

View File

@@ -1,5 +1,6 @@
export enum NotificationType { export enum NotificationType {
ParticipantJoined = 'participantJoined', ParticipantJoined = 'participantJoined',
HandRaised = 'handRaised', HandRaised = 'handRaised',
ParticipantMuted = 'participantMuted',
// todo - implement message received notification // todo - implement message received notification
} }

View File

@@ -3,11 +3,23 @@ import Source = Track.Source
import { fetchServerApi } from './fetchServerApi' import { fetchServerApi } from './fetchServerApi'
import { buildServerApiUrl } from './buildServerApiUrl' import { buildServerApiUrl } from './buildServerApiUrl'
import { useRoomData } from '../hooks/useRoomData' import { useRoomData } from '../hooks/useRoomData'
import { useRoomContext } from '@livekit/components-react'
import { NotificationType } from '@/features/notifications/NotificationType'
export const useMuteParticipant = () => { export const useMuteParticipant = () => {
const data = useRoomData() const data = useRoomData()
const room = useRoomContext()
const muteParticipant = (participant: Participant) => { const notifyParticipant = async (participant: Participant) => {
const encoder = new TextEncoder()
const data = encoder.encode(NotificationType.ParticipantMuted)
await room.localParticipant.publishData(data, {
reliable: true,
destinationIdentities: [participant.identity],
})
}
const muteParticipant = async (participant: Participant) => {
if (!data || !data?.livekit) { if (!data || !data?.livekit) {
throw new Error('Room data is not available') throw new Error('Room data is not available')
} }
@@ -18,7 +30,9 @@ export const useMuteParticipant = () => {
if (!trackSid) { if (!trackSid) {
throw new Error('Missing audio track') throw new Error('Missing audio track')
} }
return fetchServerApi(
try {
const response = await fetchServerApi(
buildServerApiUrl( buildServerApiUrl(
data.livekit.url, data.livekit.url,
'twirp/livekit.RoomService/MutePublishedTrack' 'twirp/livekit.RoomService/MutePublishedTrack'
@@ -34,6 +48,15 @@ export const useMuteParticipant = () => {
}), }),
} }
) )
await notifyParticipant(participant)
return response
} catch (error) {
console.error(
`Failed to mute participant ${participant.identity}: ${error instanceof Error ? error.message : 'Unknown error'}`
)
}
} }
return { muteParticipant } return { muteParticipant }
} }