Skip to content

feat(chat): arrow-key send history in MessageInput#7

Open
Jasion-han wants to merge 6 commits intoxintaofei:mainfrom
Jasion-han:feat/chat-input-send-history-only
Open

feat(chat): arrow-key send history in MessageInput#7
Jasion-han wants to merge 6 commits intoxintaofei:mainfrom
Jasion-han:feat/chat-input-send-history-only

Conversation

@Jasion-han
Copy link
Contributor

Support navigating previously sent user messages with ArrowUp/ArrowDown in the message input, Codex-style (edit breaks navigation). History is scoped by draft key and seeded from existing conversation turns.

@Jasion-han Jasion-han force-pushed the feat/chat-input-send-history-only branch from 9df2127 to 3edcb79 Compare March 13, 2026 04:26
@xintaofei
Copy link
Owner

佬可以先从一个小点试试啊,感谢佬提的pr

@Jasion-han Jasion-han force-pushed the feat/chat-input-send-history-only branch from 3edcb79 to c1f52b2 Compare March 14, 2026 05:21
@xintaofei
Copy link
Owner

PR Review: Send History Navigation

这个 PR 为消息输入框添加了类似终端的发送历史导航功能(Up/Down 箭头键回溯已发送消息)。整体实现思路清晰,但有几个问题需要关注:

需要修复的问题

  1. IME 箭头键处理可能破坏输入法 (中等严重)

message-input.tsx:1116-1122 — 原代码对 Process / keyCode 229(IME 合成状态)一律 early return。新代码在 IME 状态下放行了箭头键。但某些输入法(如日文、中文候选框)使用上下箭头在候选列表中导航,拦截这些键会导致输入法功能异常。

typescript

// 当前代码:IME 状态下放行箭头键 — 可能破坏 IME 候选导航
if (
(e.key === "Process" || e.keyCode === 229) &&
!isArrowUp &&
!isArrowDown
) {
return
}
建议恢复原逻辑,在 IME 活跃时始终 early return。

  1. 多行历史条目无法用箭头键内部导航 (中等)

message-input.tsx:1181-1201 — 当 sendHistoryIndex !== null 且 value === current 时,Up/Down 直接切换历史条目。如果回溯到一条多行消息,用户无法用 Up 键在文本内移动光标,而是会跳到上一条历史记录。应该检查光标是否在第一行/最后一行,只有到达边界时才触发历史导航。

  1. 草稿文本在历史导航中丢失 (中等)

用户正在输入文本 → 按 Up 进入历史 → 按 Down 返回 → 文本变为空字符串。用户的草稿丢了。应该在首次进入历史导航时保存当前草稿,Down 到底部时恢复。

typescript

// line 1192-1194: 到达末尾时应恢复草稿而非设为空
if (isLast) {
applyHistoryValue("", null) // ← 应恢复保存的草稿
return
}
4. 编辑历史条目后导航卡住 (低)

message-input.tsx:1183 — 如果用户回溯到一条历史消息后编辑了内容,value === current 为 false,后续 Up/Down 不再生效。用户被困在一个既不能导航历史、又不认为是新输入的状态。

代码风格问题

  1. 缺少空行 — message-input.tsx:415-416,useEffect 闭合后紧跟 const dragActiveRef 缺少空行分隔。

总结

核心功能逻辑是对的,localStorage 持久化、会话历史 seed、去重都处理得不错。但问题 1(IME) 在 CJK 用户群中会造成实际的输入问题,问题 2-3 会影响多行消息场景的用户体验。建议修复 1-3 后再合并。

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.

2 participants