UNPKG

vroom-react

Version:
179 lines (154 loc) 5.14 kB
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