Skip to content

输入框草稿按群分存,改成自增高多行输入框 - #81

Merged
joesmart merged 2 commits into
mainfrom
joesmart/fix-chat-composer
Oct 23, 2026
Merged

joesmart merged 2 commits into
mainfrom
joesmart/fix-chat-composer

Conversation

@joesmart

@joesmart joesmart commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

改了什么

  • 草稿按群分存(输入框草稿不分群,切群后可能发错群 #48):packages/web/src/state/composer-drafts.ts 是一个模块级的 Map 加订阅,组件用 useSyncExternalStore 读,刷新页面就清空。setDraft(groupId, text) 直接写这个模块,所以输入框卸载之后才回来的发送结果也能落地:项目页发送成功后清空原群的草稿,聊天页发送失败后把字写回原群。聊天和项目页都按群读草稿,切到别的群看到的是那个群自己的草稿,经过团队页、项目页再回来草稿还在。
  • 多行输入框(输入框是单行 input,不能换行,中文输入法可能误发 #32):新增共用组件 ComposerTextarea,按 scrollHeight 自增高,最高 8 行。Enter 提交所在的表单,Shift+Enter 换行。输入法组字时(isComposing,或 Safari 组字刚结束那下回车只剩 keyCode 229)回车不发送。聊天和项目页都用它:两边共享同一个群的草稿,项目页如果还是单行 <input>,会把草稿里的换行吞掉。
  • 样式:.composer-textarea 的最小高度取 --control-h-md,和发送钮同高,上下内边距由 (--control-h-md - 1lh) / 2 推出来。项目页的输入框容器改成底部对齐,上下留出 (--control-h-lg - --control-h-md) / 2。

为什么

两个页面的草稿原来都是组件内的 useState。聊天组件换群时不重挂,草稿跟着带进新群,回车就发了过去;经过团队页或项目页时组件卸载,草稿就丢了。

第一版改成每个 hook 实例持有一份快照,再用 effect 回写到模块变量。复核发现组件卸载之后写入会落空,于是改成现在这样直接写模块。

怎么验证

pnpm format:check && pnpm typecheck && pnpm lint      # 通过,lint 0 error
E2E_API_PORT=3421 E2E_WEB_PORT=5421 pnpm --filter @baize/web test
#  Test Files  48 passed (48) / Tests  351 passed (351)
#  461 passed (7.8m)

packages/web/e2e/composer-draft.spec.ts 共 8 条:

  1. 切群草稿隔离,回车不误发
  2. 经过团队页和项目页,草稿还在
  3. 项目页按群分存
  4. 聊天页 Shift+Enter 换行、Enter 发送、自增高
  5. 组字时回车不发送
  6. 项目页发送挂起时进项目群,放行成功后两边输入框都为空
  7. 聊天页发送挂起时去团队页,放行失败后回到原群,草稿还是那句话
  8. 项目页 Shift+Enter 换行,换行带到项目群里还在,Enter 发送

先红的证据:

  • 第 1 到 4 条在 main 上红。
  • 第 6 到 8 条在上一版提交 f8b966a 上红,正好红在已发出的话残留成草稿、失败回写丢失、换行被吞这三处。
  • 第 5 条在 main 上本来就是绿的(原生 <input> 的隐式提交在 Chromium 组字时不触发)。把新代码里的 isComposing/229 判断去掉,它就红。

另外用 mock 加 Vite 真点了一遍聊天和项目页的单行、多行和发送,截图看过,没进仓库。

Mac App(WKWebView)里用真输入法的验证还没做,见 #32 的评论。

Closes #48
Closes #32

🤖 Generated with Claude Code

https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni

@joesmart
joesmart merged commit 6cafca3 into main Oct 23, 2026
1 check passed
@joesmart
joesmart deleted the joesmart/fix-chat-composer branch October 23, 2026 13:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

输入框草稿不分群,切群后可能发错群 输入框是单行 input,不能换行,中文输入法可能误发

1 participant