mirror of
https://github.com/suitenumerique/meet.git
synced 2026-08-13 12:17:24 +00:00
81 lines
2.2 KiB
TypeScript
81 lines
2.2 KiB
TypeScript
import { type Participant, Track } from 'livekit-client'
|
|
import Source = Track.Source
|
|
import { useRoomData } from '../livekit/hooks/useRoomData'
|
|
import {
|
|
useNotifyParticipants,
|
|
NotificationType,
|
|
} from '@/features/notifications'
|
|
import { fetchApi } from '@/api/fetchApi'
|
|
import { useIsAdminOrOwner } from '../livekit/hooks/useIsAdminOrOwner'
|
|
|
|
import { useCallback } from 'react'
|
|
import { getLiveKitAuthHeaders } from '../utils/getLiveKitAuthHeaders'
|
|
|
|
export const useMuteParticipant = () => {
|
|
const apiRoomData = useRoomData()
|
|
const { notifyParticipants } = useNotifyParticipants()
|
|
const isAdminOrOwner = useIsAdminOrOwner()
|
|
|
|
const muteParticipant = useCallback(
|
|
async (participant: Participant) => {
|
|
if (!apiRoomData?.livekit?.room) {
|
|
throw new Error('Room id is not available')
|
|
}
|
|
|
|
const trackSid = participant.getTrackPublication(
|
|
Source.Microphone
|
|
)?.trackSid
|
|
|
|
if (!trackSid) {
|
|
return
|
|
}
|
|
|
|
// Guard against undefined token for non-admin users
|
|
if (!isAdminOrOwner && !apiRoomData.livekit.token) {
|
|
console.error('Cannot mute participant: missing auth token')
|
|
return
|
|
}
|
|
|
|
const headers = !isAdminOrOwner
|
|
? getLiveKitAuthHeaders(apiRoomData.livekit.token)
|
|
: undefined
|
|
|
|
let response
|
|
try {
|
|
response = await fetchApi(
|
|
`rooms/${apiRoomData.livekit.room}/mute-participant/`,
|
|
{
|
|
method: 'POST',
|
|
headers,
|
|
body: JSON.stringify({
|
|
participant_identity: participant.identity,
|
|
track_sid: trackSid,
|
|
}),
|
|
}
|
|
)
|
|
} catch (error) {
|
|
console.error(
|
|
`Failed to mute participant ${participant.identity}: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
)
|
|
return
|
|
}
|
|
|
|
try {
|
|
await notifyParticipants({
|
|
type: NotificationType.ParticipantMuted,
|
|
destinationIdentities: [participant.identity],
|
|
})
|
|
} catch (e) {
|
|
console.error(
|
|
`Failed to notify muted participant ${participant.identity}: ${e}`
|
|
)
|
|
}
|
|
|
|
return response
|
|
},
|
|
[apiRoomData, isAdminOrOwner, notifyParticipants]
|
|
)
|
|
|
|
return { muteParticipant }
|
|
}
|