|
|
@@ -206,7 +206,7 @@ export const useClassroom = ({ user }:{ user : User }) => {
|
|
|
const listenMessageEvents = (): void => {
|
|
|
if (!imMessageManager.current) return;
|
|
|
|
|
|
- imMessageManager.current.on('recvgroupmessage', (msg: AliVCInteraction.ImMessage, groupId: string) => {
|
|
|
+ imMessageManager.current.on('recvgroupmessage', async (msg: AliVCInteraction.ImMessage, groupId: string) => {
|
|
|
if (msg.type === 88889) { // 课堂状态消息
|
|
|
try {
|
|
|
const data = JSON.parse(msg.data);
|
|
|
@@ -216,6 +216,28 @@ export const useClassroom = ({ user }:{ user : User }) => {
|
|
|
} else if (data.action === 'end_class') {
|
|
|
setClassStatus(ClassStatus.ENDED);
|
|
|
showMessage('老师已结束上课');
|
|
|
+
|
|
|
+ // 学生端收到结束课堂消息后,立即自动离开群组
|
|
|
+ if (role === Role.Student) {
|
|
|
+ try {
|
|
|
+ if (imGroupManager.current && classId) {
|
|
|
+ await imGroupManager.current.leaveGroup(classId);
|
|
|
+ showMessage('已自动离开课堂群组');
|
|
|
+ }
|
|
|
+ if (aliRtcEngine.current) {
|
|
|
+ await leaveRtcChannel();
|
|
|
+ }
|
|
|
+ // 清理学生端状态
|
|
|
+ setIsJoinedClass(false);
|
|
|
+ setClassId('');
|
|
|
+ setStudents([]);
|
|
|
+ setHandUpList([]);
|
|
|
+ setQuestions([]);
|
|
|
+ setMessageList([]);
|
|
|
+ } catch (err) {
|
|
|
+ console.error('自动离开群组失败:', err);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
} catch (err) {
|
|
|
console.error('解析课堂状态消息失败', err);
|
|
|
@@ -647,6 +669,7 @@ export const useClassroom = ({ user }:{ user : User }) => {
|
|
|
if (!imMessageManager.current || !classId || role !== Role.Teacher) return;
|
|
|
|
|
|
try {
|
|
|
+ // 1. 发送结束课堂消息
|
|
|
await imMessageManager.current.sendGroupMessage({
|
|
|
groupId: classId,
|
|
|
data: JSON.stringify({ action: 'end_class' }),
|
|
|
@@ -657,11 +680,31 @@ export const useClassroom = ({ user }:{ user : User }) => {
|
|
|
showToast('success', '课堂已结束');
|
|
|
|
|
|
try {
|
|
|
+ // 2. 离开RTC频道
|
|
|
await leaveRtcChannel();
|
|
|
} catch (err: any) {
|
|
|
console.error('离开RTC频道失败:', err);
|
|
|
showToast('error', '离开RTC频道失败');
|
|
|
}
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 3. 关闭群组(删除群组)
|
|
|
+ if (imGroupManager.current) {
|
|
|
+ await imGroupManager.current.closeGroup(classId);
|
|
|
+ showMessage('群组已关闭');
|
|
|
+
|
|
|
+ // 4. 清理状态
|
|
|
+ setIsJoinedClass(false);
|
|
|
+ setClassId('');
|
|
|
+ setStudents([]);
|
|
|
+ setHandUpList([]);
|
|
|
+ setQuestions([]);
|
|
|
+ setMessageList([]);
|
|
|
+ }
|
|
|
+ } catch (err: any) {
|
|
|
+ console.error('关闭群组失败:', err);
|
|
|
+ showToast('error', '关闭群组失败');
|
|
|
+ }
|
|
|
} catch (err: any) {
|
|
|
setErrorMessage(`结束上课失败: ${err.message}`);
|
|
|
}
|