This commit is contained in:
yj 2025-10-16 09:34:40 +08:00
parent 3a042e92fe
commit 1f192ea288
1 changed files with 78 additions and 50 deletions

View File

@ -184,6 +184,7 @@ const Meeting: React.FC = () => {
const [isClickLock, setIsClickLock] = useState(false)
const [open, setOpen] = useState(false)
const [modeOpen, setModeOpen] = useState(false)
const [showCaret, setShowCaret] = useState(false)
const [meetingMode, setMeetingMode] = useState('FreedomMode')
const [userSearchValue, setUserSearchValue] = useState('')
const [noViewChatList, setNoViewChatList] = useState(0)
@ -489,7 +490,7 @@ const Meeting: React.FC = () => {
title: '录制'
}, 1, 3)
} else {
message.error('当前不在会议室!')
handleMessage().error('当前不在会议室!')
}
showSingIn()
},
@ -747,7 +748,7 @@ const Meeting: React.FC = () => {
try {
const temp = JSON.parse(item.contentString)
if (temp.type === 'mode') {
temp.msg ? message.success(`管理员已将会议室显示模式更新为${getMeetingContentBodyLeftModeText(temp.mode)}`) : null;
temp.msg ? handleMessage().success(`管理员已将会议室显示模式更新为${getMeetingContentBodyLeftModeText(temp.mode)}`) : null;
setIsScreenCapture(isScreenCaptureValue => {
setMeetingMode(isScreenCaptureValue ? 'SpeakerMode' : temp.mode)
return isScreenCaptureValue
@ -759,12 +760,12 @@ const Meeting: React.FC = () => {
break;
// 全员离开房间
case 'AllLeave':
message.success('管理员已结束会议!')
handleMessage().success('管理员已结束会议!')
leaveChannel(false)
break;
// 移出会议
case 'ForceExitRoom':
message.success('管理员已将你移出会议!')
handleMessage().success('管理员已将你移出会议!')
leaveChannel()
break;
// 更新视图模式
@ -776,9 +777,9 @@ const Meeting: React.FC = () => {
if (item.operUid && item.operUserName) {
if (item.operUid !== userInfo.uid) {
if (item.uid === userInfo.uid) {
message.success(`${item.operUserName}设置全员看你`)
handleMessage().success(`${item.operUserName}设置全员看你`)
} else {
message.success(`${item.operUserName}设置全员看${item.uname}`)
handleMessage().success(`${item.operUserName}设置全员看${item.uname}`)
}
}
}
@ -800,7 +801,7 @@ const Meeting: React.FC = () => {
case 'OperMicr':
if (item.operUid !== userInfo.uid) {
if (item.user.uid === userInfo.uid) {
message.success(item.user.enableMicr ? '管理员已取消你的静音' : '你已被管理员静音')
handleMessage().success(item.user.enableMicr ? '管理员已取消你的静音' : '你已被管理员静音')
}
}
setAllUserListData('OperMicr', item)
@ -809,7 +810,7 @@ const Meeting: React.FC = () => {
case 'OperCamera':
if (item.operUid !== userInfo.uid) {
if (item.user.uid === userInfo.uid) {
message.success(item.user.enableCamera ? '管理员已开启你的摄像头' : '管理员已关闭你摄像头')
handleMessage().success(item.user.enableCamera ? '管理员已开启你的摄像头' : '管理员已关闭你摄像头')
}
}
setAllUserListData('OperCamera', item)
@ -828,20 +829,20 @@ const Meeting: React.FC = () => {
if (item.user.uid === item.uid) {
if (item.user.uid === userInfo.uid) {
await agora.allLeaveChannelEx()
message.success(`操作成功`)
handleMessage().success(`操作成功`)
await agora.updateChannelMediaOptions(item.user.isRoomManager)
await postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false)
await postOpenCameraApi(false, userInfo.uid) // 不管身份如何改变都关闭摄像头
await stopScreenCapture()
} else {
message.success(`${item.user.userName}已结束发言`)
handleMessage().success(`${item.user.userName}已结束发言`)
}
} else {
if (item.user.uid === userInfo.uid) {
if (item.user.isRoomManager) {
await agora.allLeaveChannelEx()
}
message.success(`管理员${item.user.isRoomManager ? '设置' : '取消'}您为发言人`)
handleMessage().success(`管理员${item.user.isRoomManager ? '设置' : '取消'}您为发言人`)
await agora.updateChannelMediaOptions(item.user.isRoomManager)
setCurrentRequestSpeakType(res => {
if (res === 'video') {
@ -856,7 +857,7 @@ const Meeting: React.FC = () => {
})
await stopScreenCapture()
} else {
message.success(`管理员${item.user.isRoomManager ? '设置' : '取消'}${item.user.userName}为发言人`)
handleMessage().success(`管理员${item.user.isRoomManager ? '设置' : '取消'}${item.user.userName}为发言人`)
}
}
})
@ -1046,7 +1047,7 @@ const Meeting: React.FC = () => {
if (recorder) {
recorder.start()
recorder.onstart = async () => {
message.success('开始录制')
handleMessage().success('开始录制')
}
recorder.onerror = async () => {
setRecorder('')
@ -1055,7 +1056,7 @@ const Meeting: React.FC = () => {
changeStatusList({
title: '录制中'
}, 1, 3)
message.error('录制失败,请重新录制!')
handleMessage().error('录制失败,请重新录制!')
}
recorder.onstop = async () => {
@ -1213,7 +1214,7 @@ const Meeting: React.FC = () => {
// GetApplySpeak(state.channelId).then(res => {
// if (res.code === 200) {
// setIsClicked(true);
// message.success('申请发言成功')
// handleMessage().success('申请发言成功')
// }
// })
// },
@ -1257,7 +1258,7 @@ const Meeting: React.FC = () => {
} else {
item.status--
if (item.status <= 0) {
message.error(`设置${user.userName}发言人失败!`)
handleMessage().error(`设置${user.userName}发言人失败!`)
newApplyUserList.splice(index, 1)
}
}
@ -1483,7 +1484,7 @@ const Meeting: React.FC = () => {
return bool
})
} else if (reason === 3 || reason === 4) {
message.error({
handleMessage().error({
content: <div><span style={{ color: '#606fc7', cursor: 'pointer' }} onClick={() => {
stupWizardRef.current.changeModal(1);
}}></span></div>,
@ -1497,7 +1498,7 @@ const Meeting: React.FC = () => {
uid: userInfo.uid,
enableCamera: false
})
message.error({
handleMessage().error({
content: <div><span style={{ color: '#606fc7', cursor: 'pointer' }} onClick={() => {
stupWizardRef.current.changeModal(1);
}}></span></div>,
@ -1840,7 +1841,7 @@ const Meeting: React.FC = () => {
GetApplySpeak(state.channelId).then(res => {
if (res.code === 200) {
setIsClicked(true);
message.success('申请发言成功')
handleMessage().success('申请发言成功')
}
})
},
@ -1884,7 +1885,7 @@ const Meeting: React.FC = () => {
}
})
} else {
message.error(msgTips)
handleMessage().error(msgTips)
}
})
break;
@ -1894,7 +1895,7 @@ const Meeting: React.FC = () => {
if (res) {
await stopScreenCapture()
} else {
message.error(msgTips)
handleMessage().error(msgTips)
}
})
if (row.title === '停止共享') {
@ -1913,7 +1914,7 @@ const Meeting: React.FC = () => {
setCurrentRequestSpeakType('audio')
requestSpeak()
} else {
message.error('申请太频繁了,请稍后重试!');
handleMessage().error('申请太频繁了,请稍后重试!');
}
}
})
@ -1930,7 +1931,7 @@ const Meeting: React.FC = () => {
setCurrentRequestSpeakType('video')
requestSpeak()
} else {
message.error('申请太频繁了,请稍后重试!');
handleMessage().error('申请太频繁了,请稍后重试!');
}
}
})
@ -1945,7 +1946,7 @@ const Meeting: React.FC = () => {
if (res) {
invitingPersonnelRef.current.changeInvitingPersonnelModal()
} else {
message.error(msgTips)
handleMessage().error(msgTips)
}
})
break;
@ -2001,25 +2002,25 @@ const Meeting: React.FC = () => {
setRecorder(mediaRecorder);
});
} else {
message.error('录制太频繁了,请稍后重试!');
handleMessage().error('录制太频繁了,请稍后重试!');
}
} catch (error: any) {
if (error.code === 'ENOENT') {
message.error({
handleMessage().error({
content: <div> <span style={{ color: '#606fc7', cursor: 'pointer' }} onClick={() => {
stupWizardRef.current.changeModal(3);
}}></span></div>
});
return;
} else {
message.error(error);
handleMessage().error(error);
}
}
break;
case '录制中':
if (isClickedMediaSteam) {
message.error('录制时长不足3秒请稍后重试');
handleMessage().error('录制时长不足3秒请稍后重试');
} else {
footerListTemplate[itemIndex][rowIndex].title = '录制'
footerListTemplate[itemIndex][rowIndex].active = false
@ -2034,7 +2035,7 @@ const Meeting: React.FC = () => {
if (!isClicked) {
requestSpeak()
} else {
message.error('申请太频繁了,请稍后重试!');
handleMessage().error('申请太频繁了,请稍后重试!');
}
break;
case '会议监控':
@ -2183,7 +2184,7 @@ const Meeting: React.FC = () => {
// 设置发言人
const postRoomManager = async (data: any): Promise<void> => {
if (isAdmin >= 20) {
message.error('设置失败已达最大发言人20个')
handleMessage().error('设置失败已达最大发言人20个')
} else {
await PostRoomManager({
roomId: data.roomId,
@ -2282,7 +2283,7 @@ const Meeting: React.FC = () => {
break;
case 'reconnect':
if (e.value == true) {
message.success('网络已连接。')
handleMessage().success('网络已连接。')
meetingDisconnectedRef.current.changeModal(false)
setIsAgoraDisconnected(false)
async function setUserStatus(res: any) {
@ -2348,7 +2349,7 @@ const Meeting: React.FC = () => {
return res
})
} else {
message.error('请输入内容!')
handleMessage().error('请输入内容!')
}
}
// 聊天框滚动到底部
@ -2378,19 +2379,20 @@ const Meeting: React.FC = () => {
})
}
if (msg) {
message.error(msg)
handleMessage().error(msg)
return
}
}
if (enableMicr) {
const enableMicrLenght = roomUserList.filter((item: any) => item.enableMicr).length
if (enableMicrLenght >= 20) {
return message.error('房间内最多20个开启麦克风')
handleMessage().error('房间内最多20个开启麦克风')
return
}
}
await postOpenMicrApi(enableMicr, uid, isAll, true)
} else {
message.error(msgTips)
handleMessage().error(msgTips)
}
})
}
@ -2418,7 +2420,7 @@ const Meeting: React.FC = () => {
// })
}
if (isMessage) {
// message.success('操作成功')
// handleMessage().success('操作成功')
}
}
// 开关视频
@ -2434,18 +2436,19 @@ const Meeting: React.FC = () => {
})
}
if (msg) {
message.error(msg)
handleMessage().error(msg)
return
}
if (enableCamera) {
const enableCameraLenght = roomUserList.filter((item: any) => item.enableCamera).length
if (enableCameraLenght >= 20) {
return message.error('房间内最多20个开启摄像头')
handleMessage().error('房间内最多20个开启摄像头')
return
}
}
await postOpenCameraApi(enableCamera, uid, true)
} else {
message.error(msgTips)
handleMessage().error(msgTips)
}
})
}
@ -2471,7 +2474,7 @@ const Meeting: React.FC = () => {
// enableCamera
// })
if (isMessage) {
// message.success('操作成功')
// handleMessage().success('操作成功')
}
}
// 演讲者模式
@ -2637,21 +2640,24 @@ const Meeting: React.FC = () => {
} else {
await allUserLook(item.uid, item.userName)
}
message.success('操作成功')
handleMessage().success('操作成功')
}
// 设置模式
const setSyncView = (mode: string) => {
if (meetingMode === mode) {
setModeOpen(false)
return message.error(`${getMeetingContentBodyLeftModeText(mode)}已开启,请勿重复操作!`)
handleMessage().error(`${getMeetingContentBodyLeftModeText(mode)}已开启,请勿重复操作!`)
return
}
if (isAdmin > 6 && mode === 'FreedomMode') {
setModeOpen(false)
return message.error('发言人数超过6人,无法使用宫格模式!')
handleMessage().error('发言人数超过6人,无法使用宫格模式!')
return
}
if (isShare && mode === 'FreedomMode') {
setModeOpen(false)
return message.error('共享中,无法切换模式')
handleMessage().error('共享中,无法切换模式')
return
}
window.electron.onInvoke('sendOper', {
roomNum: state.channelId,
@ -2683,12 +2689,30 @@ const Meeting: React.FC = () => {
cancelText: '取消',
async onOk() {
await GetRoomKickout(channelId, uid)
message.success('操作成功')
handleMessage().success('操作成功')
},
onCancel() {
},
});
}
const handleMessage = () => {
const displayMessage = (
fn: (msg: any) => void,
msg: any
) => {
setIsScreenCapture(bool => {
if (!bool) {
fn(msg);
}
return bool;
});
};
return {
error: (msg: any) => displayMessage(message.error, msg),
success: (msg: any) => displayMessage(message.success, msg)
};
};
return (
<>
<div className={styles.meeting} onClick={() => {
@ -2703,7 +2727,7 @@ const Meeting: React.FC = () => {
<div style={{ bottom: '0px', borderRadius: '0 0 10px 10px' }} className={`${styles.meetingAbsoluteText}`} onClick={() => {
setIsExpand(!isExpand)
window.electron.setChildWindow({
height: !isExpand ? 160 * 4 : 200,
height: !isExpand ? 160 * 4 + 20 : 200,
width: 250,
key: 'main'
})
@ -2911,7 +2935,11 @@ const Meeting: React.FC = () => {
</div>}
<div className={styles.meetingContent}>
<div className={styles.meetingContentBody}>
<div className={`${styles.meetingContentBodyLeft} drag`} style={{ marginTop: isScreenCapture ? '20px' : '0' }}>
<div className={`${styles.meetingContentBodyLeft} drag`} style={{
marginTop: isScreenCapture ? '20px' : '0',
paddingBottom: isScreenCapture ? '40px' : '0'
}} onMouseEnter={() => setShowCaret(true)}
onMouseLeave={() => setShowCaret(false)}>
{isAdmin && currentLookUserAccount && !isScreenCapture ? getSettingIcon() : null}
<div className={getMeetingContentBodyLeftModeClass(isAdmin)} id='videoView' style={meetingMode === 'SpeakerMode' && isVideoFullScreen ? { width: '0' } : {}}>
{roomUserList.map((item: any, index: number) => {
@ -3050,13 +3078,13 @@ const Meeting: React.FC = () => {
</div>
</div>
</div> */}
{meetingMode !== "FreedomMode" && hasScrollbar() ? <div>
{meetingMode !== "FreedomMode" && hasScrollbar() && showCaret ? <div>
{meetingMode === "StandardMode" ? <div className={`${styles.meetingContentSwiperCaret}`} style={{ left: '20px', top: '66px' }} onClick={() => {
const container = document.getElementById('videoView') as HTMLElement;
container.scrollLeft -= 100
}}>
<CaretLeftOutlined />
</div> : <div className={`${styles.meetingContentSwiperCaret}`} style={{ left: isScreenCapture ? '120px' : '115px', top: '20px' }} onClick={() => {
</div> : <div className={`${styles.meetingContentSwiperCaret}`} style={{ left: '115px', top: '20px' }} onClick={() => {
const container = document.getElementById('videoView') as HTMLElement;
container.scrollTop -= 100
}}>
@ -3067,7 +3095,7 @@ const Meeting: React.FC = () => {
container.scrollLeft += 100
}}>
<CaretRightOutlined />
</div> : <div className={`${styles.meetingContentSwiperCaret}`} style={{ left: isScreenCapture ? '120px' : '115px', bottom: '20px' }} onClick={() => {
</div> : <div className={`${styles.meetingContentSwiperCaret}`} style={{ left: '115px', bottom: isScreenCapture ? '50px' : '20px' }} onClick={() => {
const container = document.getElementById('videoView') as HTMLElement;
container.scrollTop += 100
}}>