Kaynağa Gözat

✨ feat(im): 升级IM SDK并扩展功能

- 升级alivc-im SDK版本至1.8.0以获取新特性
- 添加ImAreaCode枚举支持多地区选择
- 新增ImEngine.isInitialized()方法检查初始化状态
- 扩展ImGroupInfo接口增加isBigGroup属性标识超级大群
- 优化ImMessageLevel枚举,新增MEDIUM级别

🐛 fix(classroom): 修复课堂成员列表过滤问题

- 注释掉排除老师自己的成员列表过滤逻辑,显示完整成员列表

🔧 chore(im): 完善IM操作错误处理

- 在全体禁言和取消禁言操作中添加错误抛出机制,便于上层处理
yourname 5 ay önce
ebeveyn
işleme
e36d87b363

+ 35 - 1
src/client/mobile/components/Classroom/alivc-im.iife.d.ts

@@ -307,6 +307,21 @@ namespace EventEmitter {
     const EventEmitter: EventEmitterStatic;
 }
 
+enum ImAreaCode {
+    /**
+     * 中国
+     */
+    DEFAULT = 0,
+    /**
+     * 中国
+     */
+    CN = 1,
+    /**
+     * 海外
+     */
+    SEA = 2
+}
+
 interface ImAttachmentProgress {
     progress: number;
     totalSize: number;
@@ -453,6 +468,7 @@ class ImEngine_2 extends EventEmitter<ImSdkListener> {
     private supportsWebRtc;
     private supportWASM;
     private initFlag;
+    private initStatus;
     constructor();
     static engine: ImEngine_2;
     /**
@@ -476,6 +492,11 @@ class ImEngine_2 extends EventEmitter<ImSdkListener> {
      * @param config SDK配置信息
      */
     init(config: ImSdkConfig): Promise<0 | ImErrors.ERROR_CLIENT_REPEATED_INIT>;
+    /**
+     *
+     * @returns SDK是否已初始化
+     */
+    static isInitialized(): boolean;
     /**
      * 添加 Engine 事件监听
      */
@@ -765,6 +786,14 @@ interface ImGroupInfo {
      * @param muteStatus 群禁言信息
      */
     muteStatus: ImGroupMuteStatus;
+    /**
+     * 是否是超级大群,即群人数是否超过一定人数(默认是2000)
+     *
+     * 注意:
+     * 1、若是大群,则群成员变化会控制通知频率,不会实时通知,进退群的成员列表信息也不全
+     * 2、若是大群,则不支持查询群用户列表(查询会返回420错误)
+     */
+    isBigGroup: boolean;
 }
 
 interface ImGroupInfoStatus {
@@ -1172,7 +1201,8 @@ interface ImMessage {
 
 enum ImMessageLevel {
     NORMAL = 0,
-    HIGH = 1
+    MEDIUM = 1,
+    HIGH = 2
 }
 
 interface ImMessageListener {
@@ -1308,6 +1338,10 @@ interface ImSdkConfig {
     extra?: {
         [key: string]: string;
     };
+    /**
+     * @param areaCode 地区
+     */
+    areaCode?: ImAreaCode;
     /**
      * @param uploader 附件上传器参数
      */

+ 4 - 2
src/client/mobile/components/Classroom/useClassroom.ts

@@ -750,7 +750,7 @@ export const useClassroom = ({ user }:{ user : User }) => {
       let hasPermission = true; // 权限检查标志
       try {
         groupInfo = await gm!.queryGroup(classId);
-        
+
         // 检查闭门课堂权限
         if (groupInfo && groupInfo.groupMeta) {
           try {
@@ -828,7 +828,7 @@ export const useClassroom = ({ user }:{ user : User }) => {
           const membersResponse = await gm!.listRecentGroupUser(classId);
           if (membersResponse && membersResponse.userList) {
             const existingMembers = membersResponse.userList
-              .filter(member => member.userId !== userId) // 排除老师自己
+              // .filter(member => member.userId !== userId) // 排除老师自己
               .map(member => {
                 try {
                   const userExtension = member.userExtension ? JSON.parse(member.userExtension) : {};
@@ -1432,6 +1432,7 @@ export const useClassroom = ({ user }:{ user : User }) => {
     } catch (err: any) {
       // setErrorMessage(`全体IM禁言失败: ${err.message}`);
       showToast('error', `全体IM禁言失败: ${err.message}`);
+      throw err;
     }
   };
 
@@ -1447,6 +1448,7 @@ export const useClassroom = ({ user }:{ user : User }) => {
     } catch (err: any) {
       // setErrorMessage(`取消全体IM禁言失败: ${err.message}`);
       showToast('error', `取消全体IM禁言失败: ${err.message}`);
+      throw err;
     }
   };
 

+ 1 - 1
src/server/index.tsx

@@ -8,7 +8,7 @@ import {
 export function render(_url: string, options?: RenderToPipeableStreamOptions) {
   return renderToPipeableStream(
     <StrictMode>
-      {!_url.startsWith('/admin') && <script src="https://g.alicdn.com/apsara-media-box/imp-interaction/1.6.1/alivc-im.iife.js"></script>}
+      {!_url.startsWith('/admin') && <script src="https://g.alicdn.com/apsara-media-box/imp-interaction/1.8.0/alivc-im.iife.js"></script>}
       {/* <App /> */}
     </StrictMode>,
     options,