1- import React , { FormEvent , useCallback } from 'react' ;
1+ import React , { ChangeEvent , FormEvent , KeyboardEvent , useCallback , useRef , useState } from 'react' ;
22import { useDispatch , useSelector } from 'react-redux' ;
33
44import { wsExecuteStdin } from './reducers/output/execute' ;
@@ -10,33 +10,54 @@ const Stdin: React.FC = () => {
1010 const dispatch = useDispatch ( ) ;
1111 const disabled = ! useSelector ( enableStdinSelector ) ;
1212
13+ const [ content , setContent ] = useState ( '' ) ;
14+
15+ const form = useRef < HTMLFormElement > ( null ) ;
16+
17+ const handleKeyDown = useCallback (
18+ ( e : KeyboardEvent < HTMLTextAreaElement > ) => {
19+ if ( e . key === 'Enter' && ! e . shiftKey ) {
20+ e . preventDefault ( ) ;
21+ form . current ?. dispatchEvent ( new Event ( 'submit' , { bubbles : true , cancelable : true } ) ) ;
22+ }
23+ } ,
24+ [ dispatch , form , content ] ,
25+ ) ;
26+
27+ const handleChange = useCallback (
28+ ( e : ChangeEvent < HTMLTextAreaElement > ) => {
29+ setContent ( e . currentTarget . value ) ;
30+ } ,
31+ [ setContent ] ,
32+ ) ;
33+
1334 const handleSubmit = useCallback (
1435 ( e : FormEvent < HTMLFormElement > ) => {
1536 e . preventDefault ( ) ;
1637
17- const form = e . currentTarget ;
18- const formData = new FormData ( form ) ;
19-
20- const content = formData . get ( 'content' ) ?. valueOf ( ) ;
21-
22- if ( content && typeof content === 'string' ) {
23- dispatch ( wsExecuteStdin ( content + '\n' ) ) ;
24- }
38+ dispatch ( wsExecuteStdin ( content + '\n' ) ) ;
2539
26- form . reset ( ) ;
40+ setContent ( '' ) ;
2741 } ,
28- [ dispatch ] ,
42+ [ dispatch , content , setContent ] ,
2943 ) ;
3044
3145 return (
32- < form onSubmit = { handleSubmit } className = { styles . form } data-test-id = "stdin" >
33- < input
34- type = "text"
35- name = "content"
36- autoComplete = "off"
37- className = { styles . text }
38- disabled = { disabled }
39- > </ input >
46+ < form onSubmit = { handleSubmit } className = { styles . form } data-test-id = "stdin" ref = { form } >
47+ < div className = { styles . multiLine } >
48+ < textarea
49+ rows = { 1 }
50+ onKeyDown = { handleKeyDown }
51+ onChange = { handleChange }
52+ name = "content"
53+ autoComplete = "off"
54+ spellCheck = "false"
55+ className = { styles . text }
56+ value = { content }
57+ disabled = { disabled }
58+ > </ textarea >
59+ < p className = { styles . sizer } > { content } </ p >
60+ </ div >
4061 < button type = "submit" disabled = { disabled } >
4162 Send
4263 </ button >
0 commit comments