跳到主要内容

消息转发页面

消息转发页面用于从聊天页面选择一个目标会话,并将当前选中的消息转发到该会话。当前源码实现的是单条消息转发,且不会在页面路由中传递消息内容,而是通过 messageStore 暂存选中的消息。

效果预览

选择消息转发目标会话

配置页面路由

页面入口为 RCUIKit/pages/chat/forward-message.vue。在应用的 pages.json 中注册以下路由:

JSON
{
"path": "RCUIKit/pages/chat/forward-message",
"style": {
"navigationStyle": "custom"
}
}

Demo 源码还通过条件编译为抖音小程序使用原生导航栏,标题为“转发”;其他平台由页面内的 nav-bar.vue 展示“选择一个聊天”。如需保持相同的平台适配,请沿用 Demo pages.json 中的条件编译配置。

页面触发流程

消息转发的完整调用链如下:

  1. message/message-item-common.vue 在发送中或发送失败以外的消息长按菜单中显示“转发”。
  2. 用户选择“转发”后,组件调用 messageStore.setSelectedMessages([message]) 暂存当前消息。
  3. 组件通过 uni.navigateTo 打开 /RCUIKit/pages/chat/forward-message
  4. 页面挂载时调用 messageStore.getSelectedMessages() 读取消息,并从 conversationStore.conversations 复制目标会话列表;系统会话会被过滤。
  5. 用户点击目标会话后,页面调用 messageStore.forwardMessage(conversation.key, selectedMessages[0]) 完成转发,然后返回聊天页面。

当前页面每次显示 15 个会话,滚动到底部后继续从内存会话列表中加载。当前实现点击会话后直接发送;源码中保留了确认弹层结构,但入口未启用。

Store 和 API 依赖

依赖用途
conversationStore.conversations提供可选择的目标会话,页面排除 ConversationType.SYSTEM
messageStore.setSelectedMessages()跳转前暂存待转发消息
messageStore.getSelectedMessages()转发页面读取待转发消息的副本
messageStore.forwardMessage()将目标会话 key 解码后,把消息加入消息发送队列
ErrorCode.SUCCESS判断转发请求是否成功

forwardMessage() 位于 packages/kit-store/store/RCKitMessageStore.ts,内部复用消息发送队列发送原消息。页面当前只取 selectedMessages[0],如需支持多条逐条转发或合并转发,需要同时扩展页面交互和 Store 层发送逻辑。

修改页面

修改目标源码位置
页面标题、会话列表、分页数量、点击后的发送与提示逻辑RCUIKit/pages/chat/forward-message.vue
目标会话头像和名称布局RCUIKit/pages/chat/message/select-member-item.vue
消息长按菜单中的“转发”入口和跳转逻辑RCUIKit/pages/chat/message/message-item-common.vue
转发消息的暂存与发送行为packages/kit-store/store/RCKitMessageStore.ts
导航栏、图标、弹层基础样式RCUIKit/components/nav-bar.vuerc-icon.vueuni-components/uni-popup/
页面颜色和字号RCUIKit/styles/_variables.scss
注意

转发页面依赖 messageStore 中的内存状态。请通过消息长按菜单进入页面,不要直接打开路由;如果没有先调用 setSelectedMessages(),页面将没有可转发的消息。替换 RCUIKit 源码目录进行版本升级时,也会覆盖以上 UI 修改,请提前保留差异。