Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
},
"dependencies": {
"classnames": "^2.2.1",
"@rc-component/input": "~1.0.0",
"@rc-component/input": "~1.1.0",
"@rc-component/resize-observer": "^1.0.0",
"@rc-component/util": "^1.2.0"
},
Expand Down
2 changes: 1 addition & 1 deletion src/TextArea.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ const TextArea = React.forwardRef<TextAreaRef, TextAreaProps>(
};

const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (e.key === 'Enter' && onPressEnter) {
if (e.key === 'Enter' && onPressEnter && !e.nativeEvent.isComposing) {
onPressEnter(e);
}
onKeyDown?.(e);
Expand Down
42 changes: 42 additions & 0 deletions tests/index.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -381,3 +381,45 @@ describe('TextArea', () => {
});
});
});

describe('TextArea IME behavior', () => {
it('should ignore Enter during composition', () => {
const onPressEnter = jest.fn();
const { container } = render(<TextArea onPressEnter={onPressEnter} />);
const textarea = container.querySelector('textarea')!;

fireEvent.compositionStart(textarea);

fireEvent.keyDown(textarea, {
key: 'Enter',
keyCode: 229,
isComposing: true,
nativeEvent: { isComposing: true },
});

fireEvent.compositionUpdate(textarea, { data: '开始' });

expect(onPressEnter).not.toHaveBeenCalled();

fireEvent.compositionEnd(textarea);
fireEvent.keyDown(textarea, {
key: 'Enter',
nativeEvent: { isComposing: false },
});
expect(onPressEnter).toHaveBeenCalledTimes(1);
});

it('should trigger Enter for non-composition (normal) input', () => {
const onPressEnter = jest.fn();
const { container } = render(<TextArea onPressEnter={onPressEnter} />);
const textarea = container.querySelector('textarea')!;

fireEvent.change(textarea, { target: { value: 'test' } });

fireEvent.keyDown(textarea, {
key: 'Enter',
});
expect(onPressEnter).toHaveBeenCalledTimes(1);
expect(textarea.value).toBe('test');
});
});
Loading