fix(chat): retain active IME confirmation

This commit is contained in:
Neil
2026-08-04 10:08:26 -07:00
parent a91a5bfa5b
commit 2bc49cd5e5
2 changed files with 23 additions and 1 deletions
@@ -182,7 +182,7 @@ export function NativeChatComposerField({
onChange={(e) => onDraftChange(e.target.value, e.currentTarget)}
onKeyDown={(event) => {
const ownsCompositionEnter =
event.nativeEvent.isComposing &&
(event.nativeEvent.isComposing || compositionActiveRef.current) &&
((event.key === 'Enter' && (event.keyCode === 13 || event.keyCode === 229)) ||
(event.key === 'Process' && event.keyCode === 229))
if (ownsCompositionEnter) {
@@ -192,6 +192,28 @@ describe('native chat composer composition ownership', () => {
expect(onKeyDown).toHaveBeenCalledOnce()
})
it('retains an active composition when the Process event omits its composing flag', () => {
const onKeyDown = vi.fn()
render(composerField('가', { onKeyDown }))
const textarea = screen.getByRole('textbox') as HTMLTextAreaElement
fireEvent.compositionStart(textarea)
fireEvent.keyDown(textarea, {
key: 'Process',
keyCode: 229,
isComposing: false
})
fireEvent.compositionEnd(textarea, { data: '가' })
const redispatchResult = fireEvent.keyDown(textarea, {
key: 'Enter',
keyCode: 13,
isComposing: false
})
expect(redispatchResult).toBe(false)
expect(onKeyDown).not.toHaveBeenCalled()
})
it('retains the macOS marked Enter/229 gesture through its unmarked redispatch', () => {
const onKeyDown = vi.fn()
let clearPending: FrameRequestCallback | undefined