AskaEth
eacc65acc9
fix(chat): 四件可见修复 —— 回退正文不再丢 / 错误横幅可关 / 分享不自杀 / 清两处死码
1) stream_chunk 不再被静默丢掉(整段正文丢失风险)
- ChatViewModel.onEvent 新增 WsEvent.StreamChunk 分支,把 delta 照 MessageDelta 的同一形态喂进
流式解析器。
- 依据:后端契约写明「未映射/无法确定的事件仍走 stream_chunk + stream_end(非流式回退路径)」
(Cyrene_v2/Docs/api-client.md §3.1)。原先它落到 onEvent 末尾的 else -> Unit 被静默吞掉 ——
服务端一旦走进回退路径,整段回复正文一个字都不显示,而且没有任何信号说明正文丢了。
- stream_chunk 不带 index(那是 message.start 的字段),所以不读 index;解析器与 MessageDelta
一样按需创建,按「同一个当前流」处理。
- 未改 WsEvent 的解析形状,只加消费分支。
2) 错误横幅可以关掉了(两个 dismissError 不再是死方法)
- ChatViewModel.dismissError / SessionsViewModel.dismissError 原本全仓零调用方,现各接上关闭
入口,并各补 KDoc 写明边界:清掉的是本端已经显示的那条错误,不代表服务端那边没事;不做自动
消失。
- ChatScreen.kt 的 private Banner 增加可选 onDismiss,有它时右侧挂 MiuixIcons.Basic.Close
(带 contentDescription);只有 state.error 那条传 viewModel::dismissError,分享 / 附件 /
定位那几条如实告知保持原样(它们自己会收走)。
- SessionDrawerContent.kt 的错误行改成行内布局 + 右侧关闭按钮,样式随它已有的行(footnote2、
同一水平内边距、同款 IconButton 灰度);新增参数 onDismissError,由 ChatHomeScreen 接
sessionsViewModel::dismissError。
- 错误内容本身、错误出现的时机、是否自动消失,一概未动。
3) 多图分享不再互相打断
- 根因:W25 把「她正忙时按发送」接到发送路径后,deliver 每次投递前都会发一条 interrupt 帧
(scope=current);而分享 N 张图 = N 次投递,第 2 条起就把前一条刚起的回合取消掉了,
最后只有最后一张被回答。
- 改法:emitAndDeliver 增加 allowInterrupt: Boolean = true(默认值保持现状),deliver 按它决定
是否调 interruptRunningTurn();sendShared 的两条投递都传 false。
- 只有一张图也传 false:分享是「一次把东西倒进去」的批量动作,自己打断自己一定是错的;
「分享从不打断」是一句话,「超过一张才不打断」得先解释那个分界。
- 单条发送(send)的口径一字未动。
4) 两处死代码
- 删掉 ChatViewModel.clearDraftDocuments()(复核为全仓零调用方)。没选「在输入栏加清空全部入口」:
附件芯片本来就每枚带叉、上限只有 5 枚,逐个移除已经覆盖全部场景;输入栏里再加一枚清空按钮是
噪音,而留着一个没人接的公开方法只会让人误以为它是活的。
- 删掉 ChatScreen 的 onLogout 参数(函数体内一次都没用到)与 ChatHomeScreen 的对应传参。
真正的登出路径(CyreneApp -> ChatHomeScreen -> SettingsScreen)原样可用。
验证:assembleDebug 与 testDebugUnitTest 均 BUILD SUCCESSFUL;单测 892 条、0 失败 0 错误、0 跳过
(本次未新增测试:① 的判定是 when 的一个分支、抽不出自然的纯函数,不为测试把架构拧弯)。