Răsfoiți Sursa

✨ feat(classroom): 实现课堂结束自动清理功能

- 学生端收到结束课堂消息后自动离开群组并清理状态
  - 离开课堂群组并显示提示消息
  - 离开RTC频道并重置课堂相关状态
- 教师端结束课堂流程优化
  - 增加关闭群组步骤并清理本地状态
  - 优化结束课堂操作的错误处理和用户反馈
yourname 6 luni în urmă
părinte
comite
1a4351de2b
1 a modificat fișierele cu 44 adăugiri și 1 ștergeri
  1. 44 1
      src/client/mobile/components/Classroom/useClassroom.ts

+ 44 - 1
src/client/mobile/components/Classroom/useClassroom.ts

@@ -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}`);
     }