mdm-im-v3 2.0.3 → 2.1.0

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 (33) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +69 -0
  3. package/dist/{FilePreview-CqsQCI87.js → FilePreview-dpnc9m3Z.js} +2 -2
  4. package/dist/assets/extracted/bc26358d.woff +0 -0
  5. package/dist/assets/extracted/be398edc.ttf +0 -0
  6. package/dist/assets/extracted/de12ee92.woff2 +0 -0
  7. package/dist/core.es.js +2 -2
  8. package/dist/{index-B3MeQmIL.js → index-CNxeqkio.js} +1362 -3108
  9. package/dist/{index-C4_SSULD.js → index-CsaYx_7b.js} +697 -47
  10. package/dist/{index-D8yaC3ve.js → index-D5S79LNp.js} +3201 -261
  11. package/dist/index.es.js +1 -1
  12. package/dist/style/index.css +1 -1
  13. package/dist-h5/{ChatHistoryH5-Deqlnw3u.js → ChatHistoryH5-BhrGF5WR.js} +2 -2
  14. package/dist-h5/{ChatPageH5-wyLGmPhW.js → ChatPageH5-B3azJu7O.js} +975 -164
  15. package/dist-h5/{ChatSettingsH5-DD3dnI-H.js → ChatSettingsH5-CFr9Bn69.js} +169 -27
  16. package/dist-h5/{CreateGroupH5-3LIujy3_.js → CreateGroupH5-a16jkObH.js} +2 -2
  17. package/dist-h5/{GroupAnnouncementH5-5EpXQs5V.js → GroupAnnouncementH5-B-Qfzoy2.js} +1 -1
  18. package/dist-h5/{GroupInfoDialogH5-fgcrbRyp.js → GroupInfoDialogH5-BHLKs62Z.js} +1 -1
  19. package/dist-h5/{GroupMembersH5-DX2lxrLB.js → GroupMembersH5-D_f1RFjO.js} +1 -1
  20. package/dist-h5/{GroupNoticeH5-DVXrcmP9.js → GroupNoticeH5-46ZjBe92.js} +1 -1
  21. package/dist-h5/{MemberDetailH5-DAVUVr30.js → MemberDetailH5-B7nlr8ZT.js} +2 -2
  22. package/dist-h5/{SearchPageH5-BiGhJF4U.js → SearchPageH5-hYxNItvz.js} +2 -2
  23. package/dist-h5/{SelectMembersH5-DbrSnTg3.js → SelectMembersH5-DQIfX_w4.js} +2 -2
  24. package/dist-h5/assets/extracted/bc26358d.woff +0 -0
  25. package/dist-h5/assets/extracted/be398edc.ttf +0 -0
  26. package/dist-h5/assets/extracted/de12ee92.woff2 +0 -0
  27. package/dist-h5/{imChat-Cz45JFEl.js → imChat-Bfl2JS8Q.js} +1 -1
  28. package/dist-h5/index.es.js +1 -1
  29. package/dist-h5/{indexH5-BZ77bUNH.js → indexH5-CUQe-Ize.js} +97 -69
  30. package/dist-h5/{indexH5-Cx3l8YDq.js → indexH5-DAnvVyZ1.js} +3238 -261
  31. package/dist-h5/{request-rky8JSGo.js → request-CK8gkCRf.js} +1 -1
  32. package/dist-h5/style/index-h5.css +1 -1
  33. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -82,3 +82,11 @@
82
82
  - 发布mdm-im-v3@2.0.3版本
83
83
  1. PC端页面主题背景图未加载问题修复;
84
84
  2. PC端人员选择弹框、消息转发弹框样式优化。
85
+
86
+ ## V2.1.0 2026-10-30
87
+ - 发布mdm-im-v3@2.1.0版本
88
+ 1. 修复从外部指定会话人员时,未定位到对应用户会话的问题;
89
+ 2. 修复切换会话时空会话展示上一个会话的消息问题;
90
+ 3. 组件增加传参 targetUserInfo,用于指定指定的用户会话,内容形式:{ userID: 'xxx', userName: '张三' };
91
+ 4. 新增「阅后即焚」功能(单聊):会话设置抽屉/聊天设置页可开关并设置销毁时长(1–86400 秒,默认 30 秒,PC 提供预设 + 自定义);
92
+ 5. 新增「语音消息」发送能力:H5 支持"按住说话"(上滑取消、最短 1 秒、最长 60 秒、最后 10 秒倒计时、切后台自动取消),PC 支持麦克风录音弹窗(点击开始 / 停止并发送)。
package/README.md CHANGED
@@ -45,6 +45,8 @@ node_modules/mdm-im-v3/
45
45
  | `mdm-im-v3/style/index-h5.css` | `dist-h5/style/index-h5.css` | CSS | H5 端样式文件 |
46
46
 
47
47
  > **核心原则:** `mdm-im-v3/core` 在两端通用,PC 端额外导入 `mdm-im-v3`(组件)和 `mdm-im-v3/style/index.css`(样式),H5 端额外导入 `mdm-im-v3/h5`(组件)和 `mdm-im-v3/style/index-h5.css`(样式)。
48
+ >
49
+ > **图标字体已内置:** 两个样式文件都包含 `@font-face` 与全部 `.mdm-icon-*` 类(字体文件随包输出到 `dist/assets/extracted/`、`dist-h5/assets/extracted/`),消费方**无需**再单独引入 `iconfont.css`,也不依赖宿主是否已有同名图标字体。
48
50
 
49
51
  ## 安装
50
52
 
@@ -485,6 +487,7 @@ const { initIMSDK, clearInstance, getUnReadMessageCount, setConversationMsgAsRea
485
487
  | `initIMSDK()` | 初始化 SDK → 绑定所有 OpenIM 事件 → 登录。需先在 store 中设置 userID、imToken、apiUrl 等。返回 `Promise<void>`。 |
486
488
  | `clearInstance(bool)` | 解绑事件 → 登出 → 清除 SDK 实例。传入 `true` 时同时清空会话列表和 `window.imInstance`。 |
487
489
  | `getUnReadMessageCount(fromServer?)` | 获取未读消息总数。`fromServer=true` 从服务端获取,默认从本地会话列表累计。 |
490
+ | `waitForSyncFinish(timeout?)` | 等待登录后的服务端同步(`OnSyncServerFinish`)完成,返回 `Promise<boolean>`。同步完成前 SDK 本地会话缓存为空,此时拉取会话列表只会得到空数组,因此拉取会话列表前应先等待该方法;默认超时 8000ms,超时返回 `false`,按兜底流程继续。 |
488
491
  | `setConversationMsgAsRead(conversationID?)` | 将指定会话的消息标记为已读,不传则使用当前会话。窗口失焦时自动跳过。 |
489
492
  | `mittBus` | 全局事件总线实例,用于监听 IM 自定义事件(见下方事件列表) |
490
493
 
@@ -546,6 +549,7 @@ const chatStore = useChatStore()
546
549
  | `rejectSLRemote` | 远程桌面被拒绝 |
547
550
  | `LOGOUT_NOTICE` | 账号在其他设备登录,被强制下线 |
548
551
  | `IM_LOGOUT` | IM 已登出 |
552
+ | `IM_SYNC_SERVER_FINISH` | 登录后的服务端同步结束(参数 `true`-成功,`false`-失败)。此时会话/消息缓存才就绪,可用于登录后补拉会话列表 |
549
553
  | `OnGroupInfoChanged` | 群信息变更(名称、头像、公告等) |
550
554
  | `OnJoinedGroupAdded` | 被拉入新群 |
551
555
  | `OnJoinedGroupDeleted` | 退出或被踢出群 |
@@ -563,6 +567,71 @@ mittBus.on('LOGOUT_NOTICE', () => {
563
567
  })
564
568
  ```
565
569
 
570
+ ## 阅后即焚(Burn After Reading)
571
+
572
+ 单聊会话支持「阅后即焚」:**谁开启,谁发送的消息才会在被对方阅读后倒计时并销毁**;对方未开启时,其发送的消息不受影响。
573
+
574
+ ### 使用入口
575
+
576
+ - **PC**:聊天窗口右上角「设置」抽屉 → 单聊会话 → 「阅后即焚」开关 + 「阅后即焚时间」;
577
+ - **H5**:聊天设置页(`/chat-settings`)→ 单聊会话 → 「阅后即焚」开关 + 时间选择。
578
+
579
+ 群聊不提供该入口(OpenIM 的 `isPrivateChat` 语义按私密会话设计,本期仅支持单聊)。
580
+
581
+ ### 规则
582
+
583
+ | 项 | 说明 |
584
+ |---|---|
585
+ | 按用户持久化 | 开关、时长、开启人、目标人写入**自己会话的 `ex.burn`**:`{ enabled, duration, fromUserID, toUserID, updatedAt }`;`ex` 由服务端按用户存储,换设备/清缓存后可恢复,且不会改动对方设置 |
586
+ | ex 兼容 | 写入 `burn` 时自动 merge,保留 `isHidden` / `isDeleted` / `isRead` 等业务标记;这些业务写 ex 时也会用 `preserveBurnInEx()` 保留 `burn` |
587
+ | 会话标识 | 开启后自己的会话列表对应会话显示 🔥(按 `ex.burn.fromUserID === 当前用户` 判断,对方列表不会显示) |
588
+ | 消息快照 | 开启方发送消息时在消息 `ex` 写入 `{ burnBySender, burnDuration, burnFromUserID, burnToUserID }`;未开启方发送的消息不带该标记,因此不会被焚毁 |
589
+ | 时长范围 | 1–86400 秒,默认 30 秒;PC 提供预设(10s/30s/1min/5min/30min/1h)+ 自定义 |
590
+ | 提交方式 | 开关、时长与 `ex.burn` 一次性提交 `setConversation()`,避免"开关开了但时长为 0、消息不销毁" |
591
+ | 关闭 | 删除 `ex.burn`,后续发送的消息不再带焚毁快照;已进入倒计时的消息按原快照走完 |
592
+ | 展示 | 带焚毁快照的消息在消息列表显示 🔥 与剩余秒数(通知类消息不展示、不参与焚毁) |
593
+ | 通知文案 | 1701 通知带上操作人:`张三 开启了阅后即焚` / `张三 关闭了阅后即焚`(自己操作显示"你") |
594
+ | 销毁触发 | 接收方打开会话、未读转已读后开始倒计时;发送方在收到已读回执后开始 |
595
+ | 销毁执行 | 倒计时结束:消息列表移除 + IndexedDB 缓存回写 + `deleteMessage` 删除;已切换走的会话也会在后台到点删除 |
596
+
597
+ ### 服务端能力与限制
598
+
599
+ - 设置依赖服务端对会话 `ex` 的持久化(本项目已用于隐藏/标记未读,属于既有能力);
600
+ - 阅后即焚的「到期真删」属于 OpenIM 服务端能力,落地前需确认当前部署版本支持;即使服务端不支持,组件仍会按本地倒计时把消息从界面与缓存中移除(弱一致);
601
+ - 服务端会话上的 `isPrivateChat` / `burnDuration` 仍会随设置同步(用于 1701 通知与 SDK 私密快照),但组件不再据此决定是否焚毁。
602
+
603
+ > 相关字段:会话 `ex.burn`(设置,按用户);消息 `ex.burnBySender` / `burnDuration` / `burnFromUserID` / `burnToUserID`(发送方快照,组件焚毁依据);`attachedInfoElem` 仅作兼容展示。
604
+
605
+ ## 语音消息(Voice Message)
606
+
607
+ 支持在 PC / H5 端录制并发送 OpenIM 语音消息(`contentType = 103`,`soundElem`),消息列表复用已有语音气泡(时长 + 声波 + 播放)。
608
+
609
+ ### 使用入口
610
+
611
+ - **H5**:输入区左侧「语音/键盘」切换按钮 → 按住「按住 说话」开始录音,松开发送;上滑超过 80px 松开取消;
612
+ - **PC**:编辑器工具栏麦克风图标 → 录音弹窗 → 点击麦克风开始,点击「停止并发送」结束并发送;
613
+ - 另:PC 选择/拖拽音频文件、H5 选择音频文件,都会按语音消息发送(不再显示成文件卡片)。
614
+
615
+ ### 录音与发送规格
616
+
617
+ | 项 | 说明 |
618
+ |---|---|
619
+ | 录音格式 | WAV(PCM),16kHz / 16bit / 单声道,全平台可播放 |
620
+ | 时长 | 最短 1 秒(太短提示"录音时间太短"),最长 60 秒(最后 10 秒倒计时,到点自动发送) |
621
+ | 发送链路 | 先上传业务文件服务(`/api/v1/common/uploadFiles`)→ `createSoundMessageByURL` → 乐观插入 → `sendMessageNotOss` |
622
+ | 时长取值 | 优先读音频元数据(`getMediaDuration`),其次录音器计时,最后按实际耗时兜底;存储为整秒且 ≥1 |
623
+ | 失败处理 | 上传失败不产生消息;发送失败气泡标记 `status=3`(红色感叹号) |
624
+ | 播放 | 复用 `useAudioPlayer`,录音开始会暂停正在播放的语音,避免外放混入 |
625
+ | 后台切换 | 录音中切到后台/隐藏页面自动取消,避免后台持续录音 |
626
+
627
+ ### 依赖与权限
628
+
629
+ - 录音依赖 `js-audio-recorder`(已加入 `dependencies`),产物为 WAV,iOS / 微信浏览器 / Electron 均可播放;
630
+ - 浏览器录音要求 **HTTPS 或 localhost**,首次使用需授权麦克风;拒绝授权、无麦克风、浏览器不支持时均有 Toast 提示;
631
+ - PC Electron 需在系统层允许麦克风权限。
632
+
633
+ > 相关字段:`soundElem.duration`(秒,必填)、`sourceUrl` / `soundPath`(播放地址,组件会补 `baseUrl` 并把 `/api/v1/common/reviewFile/` 重写为 `/api/v1/auth/reviewFile/`)、`dataSize`、`soundType`(如 `wav`)。
634
+
566
635
  ## 主题
567
636
 
568
637
  支持深色(`dark`)和浅色(`light`)两套主题,通过 CSS 变量驱动:
@@ -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-D8yaC3ve.js";
3
+ import { u as useChatStore } from "./index-D5S79LNp.js";
4
4
  import axios from "axios";
5
- import { _ as _export_sfc } from "./index-B3MeQmIL.js";
5
+ import { _ as _export_sfc } from "./index-CNxeqkio.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, B } from "./index-D8yaC3ve.js";
2
+ import { u, Q } from "./index-D5S79LNp.js";
3
3
  export {
4
4
  u as useChatStore,
5
- B as useMessage
5
+ Q as useMessage
6
6
  };