11import { hooks } from 'botframework-webchat-api' ;
22import classNames from 'classnames' ;
3- import React , { forwardRef , Fragment , useCallback , type ChangeEventHandler , type KeyboardEventHandler } from 'react' ;
3+ import React , {
4+ forwardRef ,
5+ Fragment ,
6+ useCallback ,
7+ useRef ,
8+ type FormEventHandler ,
9+ type KeyboardEventHandler
10+ } from 'react' ;
411import useStyleSet from '../../hooks/useStyleSet' ;
512
613const { useUIState } = hooks ;
@@ -21,21 +28,30 @@ const TextArea = forwardRef<
2128 * This ensures the flow of focus did not sent to document body
2229 */
2330 hidden ?: boolean | undefined ;
24- onChange ?: ChangeEventHandler < HTMLTextAreaElement > | undefined ;
31+ onInput ?: FormEventHandler < HTMLTextAreaElement > | undefined ;
2532 placeholder ?: string | undefined ;
2633 startRows ?: number | undefined ;
2734 value ?: string | undefined ;
2835 } >
2936> ( ( props , ref ) => {
3037 const [ uiState ] = useUIState ( ) ;
3138 const [ { feedbackTextArea } ] = useStyleSet ( ) ;
39+ const isInCompositionRef = useRef < boolean > ( false ) ;
3240
3341 const disabled = uiState === 'disabled' ;
3442
43+ const handleCompositionEnd = useCallback ( ( ) => {
44+ isInCompositionRef . current = false ;
45+ } , [ isInCompositionRef ] ) ;
46+
47+ const handleCompositionStart = useCallback ( ( ) => {
48+ isInCompositionRef . current = true ;
49+ } , [ isInCompositionRef ] ) ;
50+
3551 const handleKeyDown = useCallback < KeyboardEventHandler < HTMLTextAreaElement > > ( event => {
3652 // Shift+Enter adds a new line
3753 // Enter requests related form submission
38- if ( ! event . shiftKey && event . key === 'Enter' ) {
54+ if ( ! event . shiftKey && event . key === 'Enter' && ! isInCompositionRef . current ) {
3955 event . preventDefault ( ) ;
4056
4157 if ( 'form' in event . target && event . target . form instanceof HTMLFormElement ) {
@@ -86,7 +102,9 @@ const TextArea = forwardRef<
86102 feedbackTextArea + ''
87103 ) }
88104 data-testid = { props [ 'data-testid' ] }
89- onChange = { props . onChange }
105+ onCompositionEnd = { handleCompositionEnd }
106+ onCompositionStart = { handleCompositionStart }
107+ onInput = { props . onInput }
90108 onKeyDown = { handleKeyDown }
91109 placeholder = { props . placeholder }
92110 readOnly = { disabled }
0 commit comments