实现合并转发(第4章 4.20):后端已支持 bundle 模式,补上前后两端
后端把 POST /v1/im/messages/forward 的 mode="bundle" 实现了(此前直接返回 501,前端因此
只做了逐条转发)。这次把前端两侧都补上。
接收侧(新增 widgets/forward-bundle.jsx)
- 服务端生成的这条消息 head 带 x-im-type:"forward_bundle",content 是
{bundle_id, title, item_count, preview, items, source_refs, comment},不是 Drafty。
前端全仓搜这个类型零命中,收到会落到 chat-message 的 "invalid content" 兜底
(⚠ + 灰字)。本端自己发不出 bundle,但别的端发过来就会踩到。
- 渲染成一张"聊天记录"卡片:标题 + 摘要行 + 展开/收起。items[] 里已经带了每条被转发消息的
完整快照,所以"查看完整记录"是就地展开,不额外发请求。
- 快照里的 from 是不带 usr 前缀的裸 uid(与收藏快照一致),补前缀后查本地会话缓存拿显示名;
查不到就不显示发送者,宁可少一行也不要把一串 uid 摆在摘要前面。
- 没有正文的媒体消息用 [图片]/[视频]/[语音]/[文件]/[链接] 标签兜底。
发送侧(batch-forward-dialog.jsx)
- 转发模式改为按"用哪种方式选的目标"推导,这是参考图给的规则:
转发—逐条转发.png 是单选一个目标、占位写 [逐条转发]共2条消息;
转发—合并转发—多选状态.png 是多选目标、占位写 [合并转发]共16条消息。
原来 mode 硬编码 'separate'、占位也写死 [逐条转发]。
样式(base.css)
- 新增 .forward-bundle 一组规则,避免又造一批零样式类。
验证
- 用后端 buildForwardBundle 的真实产出结构,注入真实会话的消息缓存,由真正的 ChatMessage
渲染:卡片正常显示、未落到 invalid content;展开显示全部 5 条、收起回到 3 条;截图确认视觉正常。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c709abbfa4
commit
5bc3fee20b
+5
-2
@@ -22356,6 +22356,9 @@ class BatchForwardDialog extends (react__WEBPACK_IMPORTED_MODULE_0___default().C
|
||||
});
|
||||
}
|
||||
}
|
||||
forwardMode() {
|
||||
return this.state.multiSelect ? 'bundle' : 'separate';
|
||||
}
|
||||
handleCancelConfirm() {
|
||||
this.setState({
|
||||
confirmTargets: null,
|
||||
@@ -22382,7 +22385,7 @@ class BatchForwardDialog extends (react__WEBPACK_IMPORTED_MODULE_0___default().C
|
||||
sending: true,
|
||||
error: null
|
||||
});
|
||||
(0,_lib_im_api_js__WEBPACK_IMPORTED_MODULE_4__.forwardMessages)('separate', sources, this.state.confirmTargets, this.state.comment.trim()).then(result => {
|
||||
(0,_lib_im_api_js__WEBPACK_IMPORTED_MODULE_4__.forwardMessages)(this.forwardMode(), sources, this.state.confirmTargets, this.state.comment.trim()).then(result => {
|
||||
const failed = result && result.failed || [];
|
||||
if (failed.length) {
|
||||
this.setState({
|
||||
@@ -22429,7 +22432,7 @@ class BatchForwardDialog extends (react__WEBPACK_IMPORTED_MODULE_0___default().C
|
||||
value: this.state.comment,
|
||||
onChange: this.handleCommentChange,
|
||||
disabled: this.state.sending,
|
||||
placeholder: '[逐条转发]共' + this.props.seqs.length + '条消息'
|
||||
placeholder: (this.forwardMode() === 'bundle' ? '[合并转发]共' : '[逐条转发]共') + this.props.seqs.length + '条消息'
|
||||
}, void 0, false), this.state.error ? (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxDEV)("div", {
|
||||
className: "auth-field-error",
|
||||
children: this.state.error
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user