mdm-im-v3 2.1.0 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +50 -1
  3. package/dist/{FilePreview-dpnc9m3Z.js → FilePreview-CJdqlDs0.js} +2 -2
  4. package/dist/core.es.js +2 -2
  5. package/dist/{index-D5S79LNp.js → index-BLdSVjT-.js} +682 -332
  6. package/dist/{index-CsaYx_7b.js → index-CrMTFmHU.js} +2 -2
  7. package/dist/{index-CNxeqkio.js → index-VIcWin6Y.js} +68 -54
  8. package/dist/index.es.js +1 -1
  9. package/dist/style/index.css +1 -1
  10. package/dist-h5/{ChatHistoryH5-BhrGF5WR.js → ChatHistoryH5-BeCSVzKZ.js} +2 -2
  11. package/dist-h5/{ChatPageH5-B3azJu7O.js → ChatPageH5-GUblGkKv.js} +12 -7
  12. package/dist-h5/{ChatSettingsH5-CFr9Bn69.js → ChatSettingsH5-wyQ01zjO.js} +3 -2
  13. package/dist-h5/{CreateGroupH5-a16jkObH.js → CreateGroupH5-CCtTCnLG.js} +2 -2
  14. package/dist-h5/{GroupAnnouncementH5-B-Qfzoy2.js → GroupAnnouncementH5-BYN-HzX0.js} +1 -1
  15. package/dist-h5/{GroupInfoDialogH5-BHLKs62Z.js → GroupInfoDialogH5-DDjYHm7i.js} +1 -1
  16. package/dist-h5/{GroupMembersH5-D_f1RFjO.js → GroupMembersH5-DUWs89a3.js} +1 -1
  17. package/dist-h5/{GroupNoticeH5-46ZjBe92.js → GroupNoticeH5-C6hNtZzy.js} +1 -1
  18. package/dist-h5/{MemberDetailH5-B7nlr8ZT.js → MemberDetailH5-BZlExAgj.js} +16 -3
  19. package/dist-h5/{SearchPageH5-hYxNItvz.js → SearchPageH5-CjBq_40x.js} +2 -2
  20. package/dist-h5/{SelectMembersH5-DQIfX_w4.js → SelectMembersH5-BSLarLGK.js} +2 -2
  21. package/dist-h5/{imChat-Bfl2JS8Q.js → imChat-CdmqPGQ6.js} +40 -7
  22. package/dist-h5/index.es.js +2 -2
  23. package/dist-h5/{indexH5-CUQe-Ize.js → indexH5-CCseQmQb.js} +9 -4
  24. package/dist-h5/{indexH5-DAnvVyZ1.js → indexH5-DikfbMIK.js} +524 -166
  25. package/dist-h5/style/index-h5.css +1 -1
  26. package/package.json +72 -71
  27. package/dist-h5/request-CK8gkCRf.js +0 -44
package/CHANGELOG.md CHANGED
@@ -90,3 +90,24 @@
90
90
  3. 组件增加传参 targetUserInfo,用于指定指定的用户会话,内容形式:{ userID: 'xxx', userName: '张三' };
91
91
  4. 新增「阅后即焚」功能(单聊):会话设置抽屉/聊天设置页可开关并设置销毁时长(1–86400 秒,默认 30 秒,PC 提供预设 + 自定义);
92
92
  5. 新增「语音消息」发送能力:H5 支持"按住说话"(上滑取消、最短 1 秒、最长 60 秒、最后 10 秒倒计时、切后台自动取消),PC 支持麦克风录音弹窗(点击开始 / 停止并发送)。
93
+
94
+ ## V2.1.1 2026-11-03
95
+ - 发布mdm-im-v3@2.1.1版本
96
+ 1. 支持租户独立 IM 身份:新增 imIdentityVersion(1/2)、imUserID、businessUserID、loginCode 字段,v2 使用后端映射的 mdm2u_ 身份登录,旧宿主不传 imIdentityVersion 时保持 v1 登录方式;
97
+ 2. 会话、消息、联系人缓存按 API 地址、WS 地址、租户、身份版本、IM 用户、平台分区隔离,切换租户/身份时自动清空并重载,避免多租户数据串用;
98
+ 3. SDK 初始化与退出改为串行队列执行,退出失败可重试,避免未退出时创建新登录;阅后即焚等定时任务在退出或切换身份时统一取消;
99
+ 4. 通讯录、用户搜索等接口适配租户身份,私有通讯录结果自动转换为 IM 身份;v2 建群改为调用租户建群接口;
100
+ 5. 远控(sunlogin)通知按后端代理下发的 tenantID、sendIMUserID、recvIMUserID 判断归属,v2 不再以客户端 LOGIN_NOTICE 作为互踢依据;
101
+ 6. 消息发送、建群、邀请入群增加目标身份格式校验(用户 mdm2u_、群组 mdm2g_);
102
+ 7. 新增 test:tenant 测试脚本,覆盖身份校验、缓存分区、会话切换及初始化/退出并发顺序。
103
+
104
+ ## V2.1.2 2026-11-03
105
+ - 发布mdm-im-v3@2.1.2版本
106
+ 1. 2.1.1版本作废。
107
+
108
+ ## V2.1.3 2026-11-04
109
+ - 发布mdm-im-v3@2.1.3版本
110
+ 1. 新增 `unread-change` 事件(PC/H5 均支持):IM 初始化加载完成、收到新消息及未读总数变化时向宿主抛出,参数 `{ count, reason, time, conversationID? }`;组件未渲染时宿主可通过 `useMessage().mittBus` 监听未读变化,登录同步完成后自动上报 SDK 未读总数;
111
+ 2. 修复宿主未渲染 IM 页面时未读角标「先显示后消失」的问题:会话列表未加载完成时不再用残缺列表汇总覆盖 SDK 未读总数,SDK 未读总数获取失败时也不再用 0 清零;
112
+ 3. 增加未读数量计算/写入/广播日志(前缀 `[IM][unread]`),便于排查角标跳变;
113
+ 4. 后台通知会话(对方 userID 以 `agent_` 开头):点击通知机器人头像不再打开个人详情、不调用用户详情接口;消息转发弹窗(PC/H5)过滤通知类型会话,禁止转发给通知机器人。
package/README.md CHANGED
@@ -113,6 +113,8 @@ const handleLogin = () => {
113
113
 
114
114
  适用于**先登录 IM 获取未读数 → 再切换到 IM 页面展示内容**的场景:
115
115
 
116
+ > 完整说明与可运行示例见 [获取即时消息组件mdm-im-v3的未读消息数量的调用方式.md](获取即时消息组件mdm-im-v3的未读消息数量的调用方式.md)。
117
+
116
118
  1. 入口处调用 `useMessage(config)` 初始化 IM,获取未读数量
117
119
  2. 用户切换到 IM 菜单时再渲染 `<mdm-im-v3>` 组件
118
120
  3. 组件自动读取 store 中的已登录状态和 `window.imInstance`,无需重复初始化
@@ -342,6 +344,8 @@ h5Ref.value.autoLogin({
342
344
  h5Ref.value.checkLogin()
343
345
  ```
344
346
 
347
+ H5 组件同样支持 `unread-change` 事件(参数与 PC 端一致,见 [组件 Events](#组件-events)),宿主可通过 `@unread-change` 监听未读消息数变化。
348
+
345
349
  ### H5 端与 PC 端差异
346
350
 
347
351
  | 维度 | PC | H5 |
@@ -386,10 +390,53 @@ h5Ref.value.checkLogin()
386
390
 
387
391
  ## 组件 Events
388
392
 
393
+ PC 与 H5 组件支持相同的事件:
394
+
389
395
  | 事件名 | 参数 | 说明 |
390
396
  |--------|------|------|
391
397
  | `send-chat-text` | `{ list, isReply, atUserList }` | `onKeywordCheck` 为 `true` 时,文本发送前触发,用于外部敏感词过滤。过滤后调用 `chatRef.sendCheckedText()` 发送 |
392
398
  | `invite-member` | `memberIds: string[]` | `outsideHandleUser` 为 `true` 时,需要邀请成员时触发,由外部处理人员选择 |
399
+ | `unread-change` | `{ count, reason, time, conversationID? }` | IM 未读消息总数变化时触发,可用于同步宿主的消息红点/角标,见下方说明 |
400
+
401
+ ### `unread-change`(未读消息数)
402
+
403
+ 组件在以下时机向上抛出该事件:
404
+
405
+ | `reason` | 触发时机 |
406
+ |----------|----------|
407
+ | `'init'` | IM 初始化加载完成(登录后会话列表拉取/缓存渲染结束),每次初始化触发一次 |
408
+ | `'receive'` | 收到新消息(SDK 每批推送触发一次,即使未读总数没变) |
409
+ | `'update'` | 未读总数发生变化,如标记已读、其他端已读、新会话等 |
410
+
411
+ 事件载荷:
412
+
413
+ ```ts
414
+ {
415
+ count: number // 当前未读消息总数
416
+ reason: 'init' | 'receive' | 'update'
417
+ time: number // 触发时间戳(毫秒)
418
+ conversationID?: string // 仅 reason='receive':最新消息所属会话 ID
419
+ }
420
+ ```
421
+
422
+ PC / H5 用法一致:
423
+
424
+ ```vue
425
+ <template>
426
+ <mdm-im-v3 ref="chatRef" @unread-change="handleUnreadChange" />
427
+ <!-- H5:<mdm-im-v3-h5 ref="chatRef" @unread-change="handleUnreadChange" /> -->
428
+ </template>
429
+
430
+ <script setup>
431
+ const handleUnreadChange = ({ count, reason, conversationID }) => {
432
+ // 同步宿主菜单/标签页的红点数量
433
+ badgeRef.value = count
434
+ console.log('[IM] 未读数:', count, reason, conversationID)
435
+ }
436
+ </script>
437
+ ```
438
+
439
+ > 未读总数同时保存在 store 的 `unReadCount` 中,可通过 `useChatStore().getUnReadCount` 读取;`unread-change` 事件适用于不便订阅 store 的宿主(如非 Vue 渲染的菜单/角标)。
393
440
 
394
441
  ## 组件暴露的方法
395
442
 
@@ -486,7 +533,8 @@ const { initIMSDK, clearInstance, getUnReadMessageCount, setConversationMsgAsRea
486
533
  | `loginStatus` | IM 登录状态的 `computed` 引用,便于外部 `watch` 监控。值:1-未登录,2-登录中,3-已登录 |
487
534
  | `initIMSDK()` | 初始化 SDK → 绑定所有 OpenIM 事件 → 登录。需先在 store 中设置 userID、imToken、apiUrl 等。返回 `Promise<void>`。 |
488
535
  | `clearInstance(bool)` | 解绑事件 → 登出 → 清除 SDK 实例。传入 `true` 时同时清空会话列表和 `window.imInstance`。 |
489
- | `getUnReadMessageCount(fromServer?)` | 获取未读消息总数。`fromServer=true` 从服务端获取,默认从本地会话列表累计。 |
536
+ | `getUnReadMessageCount(fromServer?)` | 获取未读消息总数。`fromServer=true` 从服务端获取,默认从本地会话列表累计。总数变化时会广播 `IM_UNREAD_COUNT_CHANGED`(组件转发为 `unread-change` 事件)。 |
537
+ | `publishUnreadCount(reason?, extra?)` | 主动向宿主广播一次未读总数,通过 `IM_UNREAD_COUNT_CHANGED` 发给组件并转发为 `unread-change` 事件。`reason` 默认 `'update'`,组件初始化完成时内部使用 `'init'`。 |
490
538
  | `waitForSyncFinish(timeout?)` | 等待登录后的服务端同步(`OnSyncServerFinish`)完成,返回 `Promise<boolean>`。同步完成前 SDK 本地会话缓存为空,此时拉取会话列表只会得到空数组,因此拉取会话列表前应先等待该方法;默认超时 8000ms,超时返回 `false`,按兜底流程继续。 |
491
539
  | `setConversationMsgAsRead(conversationID?)` | 将指定会话的消息标记为已读,不传则使用当前会话。窗口失焦时自动跳过。 |
492
540
  | `mittBus` | 全局事件总线实例,用于监听 IM 自定义事件(见下方事件列表) |
@@ -550,6 +598,7 @@ const chatStore = useChatStore()
550
598
  | `LOGOUT_NOTICE` | 账号在其他设备登录,被强制下线 |
551
599
  | `IM_LOGOUT` | IM 已登出 |
552
600
  | `IM_SYNC_SERVER_FINISH` | 登录后的服务端同步结束(参数 `true`-成功,`false`-失败)。此时会话/消息缓存才就绪,可用于登录后补拉会话列表 |
601
+ | `IM_UNREAD_COUNT_CHANGED` | 未读消息总数变化,参数 `{ count, reason, time, conversationID? }`。组件内部据此转发 `unread-change` 事件,一般无需直接监听 |
553
602
  | `OnGroupInfoChanged` | 群信息变更(名称、头像、公告等) |
554
603
  | `OnJoinedGroupAdded` | 被拉入新群 |
555
604
  | `OnJoinedGroupDeleted` | 退出或被踢出群 |
@@ -1,8 +1,8 @@
1
1
  import { reactive, computed, ref, watch, nextTick, resolveComponent, openBlock, createElementBlock, Fragment, createVNode, withCtx, unref, createElementVNode, withModifiers, toDisplayString, createCommentVNode, normalizeStyle, createBlock, resolveDynamicComponent } from "vue";
2
2
  import { DocumentDelete, ZoomOut, ZoomIn } from "@element-plus/icons-vue";
3
- import { u as useChatStore } from "./index-D5S79LNp.js";
3
+ import { u as useChatStore } from "./index-BLdSVjT-.js";
4
4
  import axios from "axios";
5
- import { _ as _export_sfc } from "./index-CNxeqkio.js";
5
+ import { _ as _export_sfc } from "./index-VIcWin6Y.js";
6
6
  const _hoisted_1 = { class: "file-preview-box" };
7
7
  const _hoisted_2 = {
8
8
  key: 0,
package/dist/core.es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "vue";
2
- import { u, Q } from "./index-D5S79LNp.js";
2
+ import { u, T } from "./index-BLdSVjT-.js";
3
3
  export {
4
4
  u as useChatStore,
5
- Q as useMessage
5
+ T as useMessage
6
6
  };