vroom-react
Version:
Vroom React UI
179 lines (154 loc) • 5.14 kB
text/typescript
import { useEffect, useState } from 'react'
import {useSdkStateGlobal} from '@/contexts/SdkStateGlobal'
import {VROOM_SDK_EVENT} from 'vroom-web-sdk-beta'
function useParticipants (participants: any) {
const [ pendingTask, setPendingTask ] = useState([])
const [ attendees, setAttendees ] = useState([])
const [participantsState, setParticipantsState] = useState(participants)
const [ isListenerSet, setIsListenerSet ] = useState(false)
const sdkStateGlobal = useSdkStateGlobal()
useEffect(() => {
if (sdkStateGlobal.stateAll && !isListenerSet) {
sdkStateGlobal.stateAll.on(VROOM_SDK_EVENT.JOIN, (data: any) => {
if (data?.email !== "bot-recorder@vroom.com") {
handleAddParticipant(data)
}
})
sdkStateGlobal.stateAll.on(VROOM_SDK_EVENT.UPDATE_TRACK, (data: any) => {
sdkStateGlobal.stateAll.mapSubscriberStream(sdkStateGlobal.stateAll.streams, data)
})
sdkStateGlobal.stateAll.on(VROOM_SDK_EVENT.UPDATE_ATTENDEE, (data: any) => {
// console.log('VROOM_SDK_EVENT.UPDATE_ATTENDEE', data)
handleAttendeeUpdate(data)
})
sdkStateGlobal.stateAll.on(VROOM_SDK_EVENT.MUTE_AUDIO, (data: any) => {
// console.log('VROOM_SDK_EVENT.MUTE_AUDIO', data)
handleParticipantMuteAudio(data)
})
sdkStateGlobal.stateAll.on(VROOM_SDK_EVENT.MUTE_VIDEO, (data: any) => {
// console.log('VROOM_SDK_EVENT.MUTE_VIDEO', data)
handleParticipantMuteVideo(data)
})
setIsListenerSet(true)
}
}, [sdkStateGlobal.stateAll])
const handleInitParticipant = (data: any) => {
if (data) {
const hasVideo = data?.streams?.find((i: any) => i.type === 'video')
const hasAudio = data?.streams?.find((i: any) => i.type === 'audio')
sdkStateGlobal.setParticipants({type: 'add', payload: {
...data,
id: data.id,
displayName: data?.displayName || data?.display,
codecs: data?.codecs,
hasVideo: !!hasVideo,
hasAudio: !!hasAudio,
streams: data?.streams,
}})
}
}
const handleAddParticipant = (data: any) => {
if (data) {
const hasVideo = data?.streams?.find((i: any) => i.type === 'video')
const hasAudio = data?.streams?.find((i: any) => i.type === 'audio')
sdkStateGlobal.setParticipants({type: 'add', payload: {
...data,
id: data.id,
displayName: data?.displayName || data?.display,
codecs: data?.codecs,
hasVideo: !!hasVideo,
hasAudio: !!hasAudio,
streams: data?.streams,
}})
}
}
const handleSetVideoMediaStream = (data: any) => {
data
.map((media: any) => {
if (media.type === 'video') {
sdkStateGlobal.setParticipants({
type: 'set_video_stream',
payload: {
id: media.id,
type: media.type,
mediaStream: media.mediaStream
}
})
sdkStateGlobal.setPublisherVideos({
type: 'add',
payload: {
id: media.id,
type: media.type,
mediaStream: media.mediaStream
}
})
}
if (media.type === 'audio') {
sdkStateGlobal.setParticipants({
type: 'set_audio_stream',
payload: {
id: media.id,
type: media.type,
mediaStream: media.mediaStream
}
})
sdkStateGlobal.setPublisherAudios({
type: 'add',
payload: {
id: media.id,
type: media.type,
mediaStream: media.mediaStream
}
})
}
})
}
const handleDeleteParticipant = (participant: any) => {
sdkStateGlobal.setParticipants({type: 'remove', payload: participant})
}
const handleAttendeeUpdate = (attend: any) => {
if (attend?.isQueue) {
const existIndex = pendingTask.findIndex((i: any) => i.task === attend.task)
if (existIndex > -1) {
pendingTask.splice(existIndex, 1)
setPendingTask(prev => prev.filter((i: any) => i.task !== attend.task))
}
} else {
let newTask = [...pendingTask]
const tObj = {
task: 'attendee_update',
isQueue: true,
data: attend
}
// @ts-ignore
newTask[newTask.length] = tObj
setPendingTask(newTask)
}
}
const handleClearAttendees = () => {
setAttendees([])
}
const handleClearParticipantState = () => {
setParticipantsState([])
}
const handleParticipantMuteAudio = (msg: any) => {
// console.log('on mute audio', msg)
}
const handleParticipantMuteVideo = (msg: any) => {
// console.log('on mute video', msg)
}
return {
attendees,
participantsState,
handleInitParticipant,
handleAddParticipant,
handleDeleteParticipant,
handleSetVideoMediaStream,
handleAttendeeUpdate,
handleClearAttendees,
handleClearParticipantState,
handleParticipantMuteAudio,
handleParticipantMuteVideo,
}
}
export default useParticipants