import styles from '@/page/Meeting/index.module.scss' import { useEffect, useRef, useState } from "react"; import Operation from '@/components/Operation'; import SpeakerModeModal from '@/components/SpeakerModeModal'; import InvitingPersonnelModal from '@/components/InvitingPersonnelModal'; import { Button, Input, Popover, Modal, Checkbox, message, Popconfirm } from "antd"; import { SearchOutlined, EllipsisOutlined } from '@ant-design/icons'; import { useLocation, useNavigate } from 'react-router-dom'; import { thumbImageBufferToBase64 } from '@/utils/package/base64' import { storage } from '@/utils'; import { GetRoomUser, PostOpenMicr, PostOpenCamera, GetLeaveAll, PostRoomManager, DeleteRoomManager, GetRoomKickout, GetShowUser, PostShowUser, GetJoin, GetLeave, PostMuteAll } from '@/api/Meeting'; import ImageUrl from '@/utils/package/ImageUrl' import agora from '@/utils/package/agora' import { onInvoke, onSignalr, offSignalr, onStart } from '@/utils/package/signalr'; import dayjs from 'dayjs'; import durationPlugin from 'dayjs/plugin/duration'; import { VideoSourceType } from 'agora-electron-sdk'; import Avatar from '@/components/Avatar'; import SharedFilesModel from '@/components/SharedFilesModel'; import StupWizard from '@/components/StupWizard'; const { exec } = require('child_process'); const fs = require('fs').promises; dayjs.extend(durationPlugin); const Meeting: React.FC = () => { const navigate = useNavigate(); const { state } = useLocation(); const speakerModeModalRef = useRef(); const sharedFilesModelRef = useRef(); const invitingPersonnelRef = useRef(); const stupWizardRef = useRef(); const [statusList, setStatusList] = useState({ userList: false, userChatList: false, }) const [isSharedScreenModal, setIsSharedScreenModal] = useState(false); const [user, setUser] = useState({}); const [sharedScreenList, setSharedScreenList] = useState([]); const [sharedScreenItem, setSharedScreenItem] = useState(''); const [textMsg, setTextMsg] = useState(''); const [footerList, setFooterList] = useState([ [ { title: '静音', icon: ImageUrl.icon22, iconActive: ImageUrl.icon22Active, active: false, }, { title: '关闭视频', icon: ImageUrl.icon23, iconActive: ImageUrl.icon23Active, active: false, }, ], [ { title: '共享屏幕', icon: ImageUrl.icon24, active: false, }, { title: '共享文件', icon: ImageUrl.icon25, active: false, }, { title: '邀请人员', icon: ImageUrl.icon26, active: false, }, { title: '录制', icon: ImageUrl.icon27, iconActive: ImageUrl.icon27Active, active: false, }, { title: '设置', icon: ImageUrl.icon28, active: false, }, { title: '结束', icon: ImageUrl.icon29, active: false, }, ], [ { title: '成员列表', icon: ImageUrl.icon30, active: false, }, { title: '聊天', icon: ImageUrl.icon31, active: false, }, ], ]) const [footerListIndex, setFooterListIndex] = useState({ itemIndex: 0, rowIndex: 0, }); const [roomUserList, setRoomUserList] = useState([]) const [chatList, setChatList] = useState([]) const [currentVideoId, setCurrentVideoId] = useState('') let [currentSeconds, setCurrentSeconds] = useState(0) const [currentEffective, setCurrentEffective] = useState(0) const [isComputerAudio, setIsComputerAudio] = useState(true) const [isFluencyPriority, setIsFluencyPriority] = useState(false) const [open, setOpen] = useState(false) const [modeOpen, setModeOpen] = useState(false) const [meetingMode, setMeetingMode] = useState('') const [userSearchValue, setUserSearchValue] = useState('') const [noViewChatList, setNoViewChatList] = useState(0) const [currentLookUserAccount, setCurrentLookUserAccount] = useState('') const [recorder, setRecorder] = useState('') const [mediaStream, setMediaStream] = useState('') const [isShare, setIsShare] = useState(null) const [isSharePopConfirm, setIsSharePopConfirm] = useState(false) const [isShareUser, setIsShareUser] = useState(null) const [currentLookUserStatus, setCurrentLookUserStatus] = useState<0 | 1 | 2 | 3 | 4>(1) let userInfo = JSON.parse(storage.getItem('user') as string) const msgTips = '您不是管理员或主讲人,无法开启此功能!' useEffect(() => { let time = null as any; setUser(userInfo) setTimeout(() => { window.electron.getIsMaximized().then((res: boolean) => { if (!res) { window.electron.setViewStatus('maximize') } }) }, 1000) setMeetingMode('StandardMode'); agora.init(true) agora.registerEventHandler({ onJoinChannelSuccess: async (info: any, _elapsed: any) => { if (String(info.localUid).length !== 9) { await getJoin(state.enableMicr, state.enableCamera) setTimeout(async () => { await agora.setupLocalVideo({ uid: Number(info.localUid), view: document.getElementById(`video-${info.localUid}`), channelId: info.channelId, sourceType: VideoSourceType.VideoSourceCameraPrimary, }) getShowUser(); }, 1000); } }, onUserJoined: async (info: any, remoteUid: any, _elapsed: any) => { if (String(remoteUid).length === 9) { setIsShare(remoteUid) } else { setTimeout(async () => { await agora.setupRemoteVideoJoin({ uid: Number(remoteUid), view: document.getElementById(`video-${remoteUid}`), channelId: info.channelId, }) }, 1000); } }, onUserOffline: async (_info: any, remoteUid: any, _reason: any) => { if (String(remoteUid).length === 9) { setIsShare(null) } setCurrentVideoId((res: any) => { if (Number(res) === remoteUid) { getShowUser(); } return res }) }, onAudioVolumeIndication: async (speakers: any) => { speakers.forEach((item: any) => { let dom = document.getElementById(`micr-${item.uid ? item.uid : userInfo.uid}`); if (dom) { const percentage = (item.volume / 255) * 100 dom.style.width = `${percentage}%` } }); } }) agora.startCameraCapture() agora.setJoinChannel({ channelId: state.channelId, uid: userInfo.uid, token: state.token, roleId: userInfo.roleId, }) storage.setItem('noViewChatList', 0) window.addEventListener('customStorageChange', handleCustomStorageChange); window.addEventListener('online', handleNetworkChange); window.addEventListener('offline', handleNetworkChange); time = setInterval(() => { setCurrentSeconds(currentSeconds++) }, 1000) return () => { window.removeEventListener('customStorageChange', handleCustomStorageChange); window.removeEventListener('online', handleNetworkChange); window.removeEventListener('offline', handleNetworkChange); clearInterval(time) }; }, []); useEffect(() => { const connection = (navigator as any).connection if (connection.downlink === 0) { setCurrentEffective(0) } else { let effectiveTypeLength = ['slow-2g', '2g', '3g', '4g'].indexOf((navigator as any).connection.effectiveType) setCurrentEffective(effectiveTypeLength + 1) } }, [(navigator as any).connection.effectiveType]); useEffect(() => { let currentVideoUserItem = roomUserList.find((item: any) => item.uid === currentVideoId || item.screenShareId === currentVideoId) if (currentVideoUserItem) { setCurrentLookUserAccount(currentVideoUserItem) } }, [currentVideoId]); useEffect(() => { if (isShare) { const item = roomUserList.find((item: any) => item.screenShareId === String(isShare)) setIsShareUser(item || null) } }, [isShare, roomUserList]); useEffect(() => { onSignalr(async (item: any) => { switch (item.key) { // 聊天 case 'ReceiveMessage': let meetingUserChatDom = document.getElementById('meetingUserChat') as HTMLElement; if (!meetingUserChatDom) { let storageNoViewChatList = Number(storage.getItem('noViewChatList')) storage.setItem('noViewChatList', storageNoViewChatList += 1) setNoViewChatList(storageNoViewChatList) } setChatList((newChatList: any) => [...newChatList, item]) break; // 扩展操作 case 'Operation': // 4:屏幕共享 switch (item.type) { case 4: setIsShare((res: any) => { if (userInfo.screenShareId === String(res)) { changeStatusList({ title: '停止共享' }, 1, 0) } return res }) break; } break; // 全员离开房间 case 'AllLeave': leaveChannel(false) break; // 踢出房间 case 'ForceExitRoom': leaveChannel(false) break; // 更新视图模式 case 'RefreshView': setMeetingMode(item.type) break; // 全员看他 case 'ShowUser': getShowUser() break; // 用户加入频道回调 case 'UserJoined': setAllUserListData('UserJoined', item) break; // 用户退出频道回调 case 'UserLeave': setAllUserListData('UserLeave', item) break; // 所有用户开闭麦 case 'OperAllMicr': setAllUserListData('OperAllMicr', item) break; // 用户关闭开启麦克风 case 'OperMicr': setAllUserListData('OperMicr', item) break; // 用户开启关闭摄像头 case 'OperCamera': setAllUserListData('OperCamera', item) break; // 主讲人用户信息刷新 case 'ManagerRefresh': if (item.user.uid === userInfo.uid) { await agora.updateChannelMediaOptions(item.user.isRoomManager) if (!item.user.isRoomManager) { await postOpenMicrApi(false, userInfo.uid) await postOpenCameraApi(false, userInfo.uid) } } setAllUserListData('ManagerRefresh', item) break; } }) return () => { offSignalr() } }, []) useEffect(() => { if (recorder) { recorder.start(); recorder.ondataavailable = (event: any) => { const blob = new Blob([event.data], { type: 'video/mp4', }); const reader = new FileReader() as any; reader.onload = async () => { const setting = await JSON.parse(storage.getItem('setting') as string) const buffer = Buffer.from(reader.result); await fs.writeFile(`${setting.recordingFilesPath}${+new Date()}.mp4`, buffer, {}); message.success(`录制成功!文件已保存至:${setting.recordingFilesPath}`) try { await fs.access(setting.recordingFilesPath, fs.constants.F_OK); if (process.platform === 'win32') { exec(`explorer "${setting.recordingFilesPath}"`); } else if (process.platform === 'darwin') { exec(`open "${setting.recordingFilesPath}"`); } } catch (error: any) { if (error.code === 'ENOENT') { message.error('文件夹不存在!') } else { message.error(error) } } }; reader.readAsArrayBuffer(blob); } }; }, [recorder]) const changeAgoraDevice = () => { function moveAdminsAndSpeakersToFront(arr: any[]): any[] { // 创建一个新的数组来存放管理员和主讲人 const adminsAndSpeakers = [] as any; // 创建一个新的数组来存放其他用户 const otherUsers = [] as any; // 遍历原始数组 arr.forEach((item: any) => { if (item.roleId === '1' || item.isRoomManager) { // 如果是管理员或主讲人,添加到 adminsAndSpeakers 数组 adminsAndSpeakers.push(item); } else { // 否则,添加到 otherUsers 数组 otherUsers.push(item); } }); // 将管理员和主讲人放在数组的最前面 return [...adminsAndSpeakers, ...otherUsers]; } setRoomUserList((res: any) => { res.forEach((item: any) => { if (item.uid === userInfo.uid) { const footerListTemplate = [...footerList] footerListTemplate[0][0].title = item.enableMicr ? '静音' : '解除静音' footerListTemplate[0][0].active = !item.enableMicr footerListTemplate[0][1].title = item.enableCamera ? '关闭视频' : '开启视频' footerListTemplate[0][1].active = !item.enableCamera setFooterList(footerListTemplate) agora.muteLocalAudioStream(!item.enableMicr) agora.muteLocalVideoStream(!item.enableCamera) } if (userSearchValue) { if (item.userName.indexOf(userSearchValue) !== -1) { item.isShow = true; } else { item.isShow = false; } } else { item.isShow = true; } }); return moveAdminsAndSpeakersToFront(res) }) } // 替换数据 const setAllUserListData = (key: string, item: any): void => { switch (key) { case 'OperMicr': case 'OperCamera': case 'ManagerRefresh': setRoomUserList((res: any) => { let userItem = res.find((row: any) => row.uid === item.user.uid) if (userItem) { for (const key in item.user) { userItem[key] = item.user[key]; } } setRoomUserList(res) return res }) break; case 'UserJoined': setRoomUserList((res: any) => [...res, item.user]) break; case 'UserLeave': setRoomUserList((res: any) => { let userItemIndex = res.findIndex((row: any) => row.uid === item.uid) res.splice(userItemIndex, 1) return res }) break; case 'OperAllMicr': setRoomUserList((res: any) => { res.forEach((row: any) => { if (row.uid !== item.uid) { row.enableMicr = item.enableMicr } }) setRoomUserList(res) return res }) break; } changeAgoraDevice() } // 网络 const handleNetworkChange = (): void => { if (navigator.onLine) { message.success('网络已恢复。') setTimeout(async () => { await onStart(async () => { await getJoin(!footerList[0][0].active, !footerList[0][1].active) }) }, 1000) } else { message.error('网络已断开!') } } // 渲染视频 const renderVideo = async (uid: string | number): Promise => { setCurrentLookUserStatus(0) setTimeout(() => { if (uid === userInfo.uid || uid === userInfo.screenShareId) { if (String(uid).length === 9) { // 共享屏幕 setCurrentLookUserStatus(2) setTimeout(() => { agora.setupLocalVideo({ uid: Number(uid), view: document.getElementById(`video-source-screen`) as HTMLElement, channelId: state.channelId, sourceType: VideoSourceType.VideoSourceScreen, }) }, 1000); } else { // 摄像头 setCurrentLookUserStatus(1) setTimeout(() => { agora.setupLocalVideo({ uid: Number(uid), view: document.getElementById(`video-source-camera-primary`) as HTMLElement, channelId: state.channelId, sourceType: VideoSourceType.VideoSourceCameraPrimary, }) }, 1000); } } else { if (String(uid).length === 9) { // 摄像头 setCurrentLookUserStatus(3) setTimeout(() => { agora.setupRemoteVideoJoin({ uid: Number(uid), view: document.getElementById(`video-source-remote-camera`) as HTMLElement, channelId: state.channelId, }) }, 1000); } else { // 共享屏幕 setCurrentLookUserStatus(4) setTimeout(() => { agora.setupRemoteVideoJoin({ uid: Number(uid), view: document.getElementById(`video-source-remote-screen`) as HTMLElement, channelId: state.channelId, }) }, 1000); } } }, 500) } // 全员观看 const getShowUser = async (): Promise => { await GetShowUser(state.channelId).then(async (res) => { if (res.code === 200 && res.data) { setCurrentVideoId(res.data) renderVideo(res.data) } }) } // 加入房间时间 const changeCurrentSeconds = (): string => { const duration = dayjs.duration(currentSeconds, 'seconds'); const hours = duration.hours(); // 整数小时 const minutes = duration.minutes(); // 整数分钟 const secondsRemaining = duration.seconds(); // 剩余的秒数 return `${hours > 9 ? hours : '0' + hours}:${minutes > 9 ? minutes : '0' + minutes}:${secondsRemaining > 9 ? secondsRemaining : '0' + secondsRemaining}` } // 操作按钮 const changeStatusList = async (row: any, itemIndex: number, rowIndex: number): Promise => { const footerListTemplate = [...footerList] setFooterListIndex({ itemIndex, rowIndex, }) switch (row.title) { case '成员列表': setStatusList({ userList: statusList.userList ? false : true, userChatList: false, }) storage.setItem('noViewChatList', 0) setNoViewChatList(0) break; case '聊天': setStatusList({ userList: false, userChatList: statusList.userChatList ? false : true, }) storage.setItem('noViewChatList', 0) setNoViewChatList(0) break; case '共享屏幕': if (getUserRoomInfo()) { getDesktopCapturerVideo() setIsSharedScreenModal(true) } else { message.error(msgTips) } break; case '停止共享': if (getUserRoomInfo()) { await agora.leaveChannelEx(userInfo.screenShareId) agora.stopScreenCapture() await allUserLook(userInfo.uid) footerListTemplate[itemIndex][rowIndex].title = '共享屏幕' } else { message.error(msgTips) } break; case '静音': await postOpenMicr(false, user.uid) break; case '解除静音': await postOpenMicr(true, user.uid) break; case '关闭视频': await postOpenCamera(false, user.uid) break; case '开启视频': await postOpenCamera(true, user.uid) break; case '设置': stupWizardRef.current.changeModal() break; case '邀请人员': invitingPersonnelRef.current.changeInvitingPersonnelModal() break; case '录制': window.electron.getSources().then((sources: any) => { const screenId = sources[0].id; navigator.mediaDevices.getUserMedia({ audio: { mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: screenId, } } as any, video: { mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: screenId, } } as any }).then(async (steam) => { const audioTracks = await navigator.mediaDevices .getUserMedia({ audio: true, video: false }) .then(audioStream => audioStream.getAudioTracks()[0]); steam.addTrack(audioTracks); setMediaStream(steam) setRecorder(new MediaRecorder(steam)) }) }) const setting = await JSON.parse(storage.getItem('setting') as string) try { await fs.access(setting.recordingFilesPath, fs.constants.F_OK) footerListTemplate[itemIndex][rowIndex].title = '录制中' footerListTemplate[itemIndex][rowIndex].active = true setFooterList(footerListTemplate) } catch (error: any) { if (error.code === 'ENOENT') { message.error('文件夹不存在!') return } else { message.error(error) } } break; case '录制中': footerListTemplate[itemIndex][rowIndex].title = '录制' footerListTemplate[itemIndex][rowIndex].active = false setFooterList(footerListTemplate) stopRecorderMedia() break; case '共享文件': sharedFilesModelRef.current.getData() break; } } // 停止录制 const stopRecorderMedia = async (): Promise => { if (recorder) { await recorder.stop(); } if (mediaStream) { await mediaStream.getTracks().forEach((track: any) => { track.stop() }); } setRecorder('') setMediaStream('') } // 退出房间 const leaveChannel = async (bool: boolean = true): Promise => { await stopRecorderMedia() if (bool) { await getLeave() } agora.leaveChannel() navigate('/home/index') } // 分享屏幕 const clickSharedScreen = async (): Promise => { let data = sharedScreenList.find((item: any) => item.sourceId === sharedScreenItem.sourceId) if (data) { const footerListTemplate = [...footerList] footerListTemplate[footerListIndex.itemIndex][footerListIndex.rowIndex].title = '停止共享' setIsSharedScreenModal(false) await agora.setDesktopCapturerVideo(sharedScreenItem, isComputerAudio, isFluencyPriority) await allUserLook(user.screenShareId) } else { message.error('请选择应用!') } } // 获取桌面可共享屏幕的引用 const getDesktopCapturerVideo = (): void => { agora.getDesktopCapturerVideo().then((res: any) => { if (sharedScreenList.length !== res.length) { res.forEach((item: any) => { if (item.thumbImage.buffer) { item.thumbnailUrl = thumbImageBufferToBase64(item.thumbImage) } if (item.iconImage.buffer) { item.iconDataUrl = thumbImageBufferToBase64(item.iconImage) } }) setSharedScreenList(res) } }) }; // 设置全员看谁 const allUserLook = async (uid: string): Promise => { await PostShowUser(state.channelId, uid).then(res => { if (res.code === 200) { getShowUser() } }) } // 获取房间用户 const getRoomUser = async (callback?: Function): Promise => { GetRoomUser(state.channelId).then(res => { if (res.code === 200) { res.data.forEach((item: any) => { item.isShow = true; }) setRoomUserList(res.data) callback && callback(res.data) changeAgoraDevice() } }) } const handleCustomStorageChange = async (e: any): Promise => { switch (e.key) { case 'meetingMode': setMeetingMode(e.value) break; case 'reconnect': if (e.value == true) { storage.setItem('reconnect', false) await getJoin(!footerList[0][0].active, !footerList[0][1].active) } break; } }; // 聊天发送 const sendMsg = (): void => { if (textMsg) { onInvoke('sendChannelMsg', { roomNum: state.channelId, msg: textMsg, }) setChatList((newChatList: any) => [...newChatList, { uid: state.uid, userName: user.userName, message: textMsg, }]) setTextMsg('') } else { message.error('请输入内容!') } } // 开关麦克风 const postOpenMicr = async (enableMicr: boolean, uid: string, isAll?: boolean): Promise => { if (getUserRoomInfo()) { postOpenMicrApi(enableMicr, uid, isAll) } else { message.error(msgTips) } } // 开关麦克风 const postOpenMicrApi = async (enableMicr: boolean, uid: string, isAll?: boolean): Promise => { if (isAll) { await PostMuteAll({ roomNum: state.channelId, enableMicr }) } else { let msg = ''; if (uid === user.uid) { await agora.getAudioMediaList().then(res => { if (!res.ecordingList.length) { msg = '未检测到麦克风!' } }) } if (msg) { message.error(msg) return } await PostOpenMicr({ roomNum: state.channelId, uid, enableMicr }) } } // 开关视频 const postOpenCamera = async (enableCamera: boolean, uid: string): Promise => { if (getUserRoomInfo()) { let msg = ''; if (uid === user.uid) { await agora.getVideoDeviceManager().then(res => { if (!res.list.length) { msg = '未检测到摄像头!' } }) } if (msg) { message.error(msg) return } postOpenCameraApi(enableCamera, uid) } else { message.error(msgTips) } } // 开关视频 const postOpenCameraApi = async (enableCamera: boolean, uid: string): Promise => { if (enableCamera) { await agora.startCameraCapture() } else { await agora.stopCameraCapture(); } await PostOpenCamera({ roomNum: state.channelId, uid, enableCamera }) } // 演讲者模式 // const changeSpeakerMode = (): void => { // speakerModeModalRef.current.changeSpeakerMode() // } // 获取当前用户在房间的角色信息 const getUserRoomInfo = (): any => { let userItem = roomUserList.find((item: any) => item.uid === user.uid) if (userItem && (userItem.roleId === '1' || userItem.isRoomManager)) { return userItem } return '' } // 获取当前模式样式 const getMeetingContentBodyLeftModeClass = (): string => { switch (meetingMode) { case 'FreedomMode': return styles.meetingContentBodyLeftFreedomMode case 'StandardMode': return styles.meetingContentBodyLeftStandardMode case 'SpeakerMode': return styles.meetingContentBodyLeftSpeakerMode case 'SingleScreenMode': return styles.meetingContentBodyLeftSingleScreenMode case 'DualScreenMode': return styles.meetingContentBodyLeftDualScreenMode case 'FourScreenMode': return styles.meetingContentBodyLeftFourScreenMode } return '' } // 获取当前模式文字 const getMeetingContentBodyLeftModeText = (): string => { switch (meetingMode) { case 'FreedomMode': return '自由者模式' case 'StandardMode': return '标准模式' case 'SpeakerMode': return '演讲模式' case 'SingleScreenMode': return '单画面模式' case 'DualScreenMode': return '二分屏模式' case 'FourScreenMode': return '四分屏模式' } return '' } // 设置单个视频样式 const setMeetingContentSwiperCardClass = (): string => { switch (meetingMode) { case 'StandardMode': return styles.meetingContentSwiperCardStandardMode case 'SpeakerMode': return styles.meetingContentSwiperCardSpeakerMode } return '' } // 加入房间 const getJoin = async (enableMicr: boolean, enableCamera: boolean): Promise => { await GetJoin({ roomNum: state.channelId, enableMicr, enableCamera }) await getRoomUser() } // 离开房间 const getLeave = async (): Promise => { await GetLeave({ roomNum: state.channelId, }) } // 设置全员观看 const setAllUserLook = (item: any): void => { if (isShare) { allUserLook(String(isShare) === item.screenShareId ? item.screenShareId : item.uid) } else { allUserLook(item.uid) } } return ( <>
{ }}>
{networkIcon(currentEffective)}
{changeCurrentSeconds()}
会议号:{state.channelId} 会议名称:{state.roomName}
{ setModeOpen(false) storage.setItem('meetingMode', 'StandardMode') }}> 标准模式
{ setModeOpen(false) storage.setItem('meetingMode', 'SpeakerMode') }}> 演讲模式
{ setModeOpen(false) }}> 取消
} title="" trigger="click" open={modeOpen} onOpenChange={() => setModeOpen(true)} >
{meetingMode === 'StandardMode' ? : } {getMeetingContentBodyLeftModeText()}
{roomUserList.map((item: any, index: number) => { return
{ setCurrentVideoId(item.uid) if (String(isShare) === item.screenShareId) { renderVideo(item.screenShareId) } else { renderVideo(item.uid) } }} >
{meetingContentUser(item)} {item.enableCamera ? null : meetingContentError(currentVideoId, item)} {String(isShare) === item.screenShareId ?
屏幕分享中
: null} {user.roleId === '1' ? {item.uid !== user.uid ? : null} {item.uid !== user.uid ? : null}
}>
: null}
{item.enableMicr ?
: null}
} )} {currentLookUserStatus === 0 && currentLookUserAccount ?
{
}
{meetingContentUser(currentLookUserAccount)}
: null} {currentLookUserStatus === 1 && currentLookUserAccount ?
{
}
{meetingContentUser(currentLookUserAccount)} {currentLookUserAccount.enableCamera ? null : meetingContentError(currentVideoId, currentLookUserAccount)}
: null} {currentLookUserStatus === 2 && currentLookUserAccount ?
{meetingContentUser(currentLookUserAccount)}
: null} {currentLookUserStatus === 3 && currentLookUserAccount ?
{meetingContentUser(currentLookUserAccount)} {currentLookUserAccount.enableCamera ? null : meetingContentError(currentVideoId, currentLookUserAccount)}
: null} {currentLookUserStatus === 4 && currentLookUserAccount ?
{meetingContentUser(currentLookUserAccount)}
: null}
{ (statusList.userList || statusList.userChatList) ? (
{statusList.userList ?
成员列表 { setStatusList({ userList: false, userChatList: false, }) }} />
} value={userSearchValue} onChange={(e) => { setUserSearchValue(e.target.value) const newRoomUserList = [...roomUserList] newRoomUserList.forEach(row => { if (e.target.value) { if (row.userName.indexOf(e.target.value) !== -1) { row.isShow = true; } else { row.isShow = false; } } else { row.isShow = true; } }); setRoomUserList(newRoomUserList) }} />
{roomUserList.map((item: any, index: number) => { return ( item.isShow ?
{item.userName}{item.uid === user.uid ? '(我)' : ''} {item.roleId === '1' || item.isRoomManager ? {item.roleId === '1' ? '主讲人' : '主讲人'} : null}
{ postOpenMicr(!item.enableMicr, item.uid) }} title={item.enableMicr ? '静音' : '解除声音'} />
{ postOpenCamera(!item.enableCamera, item.uid) }} title={item.enableCamera ? '关闭视频' : '开启视频'} />
{item.uid !== user.uid && user.roleId === '1' ?
}>
: null}
: null ) } )}
invitingPersonnelRef.current.changeInvitingPersonnelModal()}>邀请
postOpenMicr(false, user.id, true)}>全员静音
:
聊天 { setStatusList({ userList: false, userChatList: false, }) }} />
{chatList.map((item: any, index: number) =>
{item.userName}
{item.message}
)}
{ setTextMsg(e.target.value) }}>
}
) : null }
{footerList.map((item, itemIndex) => { return (
{item.map((row, rowIndex) => { return ( row.title === '结束' ? {user.roleId === '1' ? { GetLeaveAll({ roomNum: state.channelId, }) }} onCancel={() => { }} okText="结束" cancelText="取消" >
全员结束会议
: null}
leaveChannel()}>仅自己离开
{ setOpen(false) }}>取消
} title="" trigger="click" open={open} onOpenChange={() => setOpen(true)} >
{row.title}
:
changeStatusList(row, itemIndex, rowIndex)} key={rowIndex}> {row.title} {row.title === '成员列表' ?
{roomUserList.length}
: null} {row.title === '聊天' && noViewChatList > 0 ?
{noViewChatList}
: null}
) })}
) })}
{sharedScreenList.map((item: any, index: number) => { return (
{ setSharedScreenItem(item) }}> {item.iconDataUrl ? : ''}
{item.sourceTitle}
) })}
{ setIsComputerAudio(e.target.checked) }} checked={isComputerAudio}>共享电脑音频 { setIsFluencyPriority(e.target.checked) }} checked={isFluencyPriority}>流畅度优先
{isShare ? { setIsSharePopConfirm(false) await onInvoke('sendOper', { roomNum: state.channelId, type: 4, }) clickSharedScreen() }} onCancel={() => { setIsSharePopConfirm(false) }} okText="是" cancelText="否" > : }
) } const meetingContentUser = (item: any) => { return ( <>
{item.roleId === '1' || item.isRoomManager ?
: null} {!item.enableMicr ? : ''} {item.userName}{item.roleId === '1' || item.isRoomManager ? item.roleId === '1' ? '(管理员)' : '(主讲人)' : ''}
) } const meetingContentError = (currentVideoId: any, item: any) => { return ( <>
) } const networkIcon = (network: number) => { switch (network) { case 0: return case 1: return case 2: return case 3: return case 4: return } } export default Meeting