1
- import React , { FormEvent , useCallback } from 'react' ;
1
+ import React , { ChangeEvent , FormEvent , KeyboardEvent , useCallback , useRef , useState } from 'react' ;
2
2
import { useDispatch , useSelector } from 'react-redux' ;
3
3
4
4
import { wsExecuteStdin } from './reducers/output/execute' ;
@@ -10,33 +10,54 @@ const Stdin: React.FC = () => {
10
10
const dispatch = useDispatch ( ) ;
11
11
const disabled = ! useSelector ( enableStdinSelector ) ;
12
12
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
+
13
34
const handleSubmit = useCallback (
14
35
( e : FormEvent < HTMLFormElement > ) => {
15
36
e . preventDefault ( ) ;
16
37
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' ) ) ;
25
39
26
- form . reset ( ) ;
40
+ setContent ( '' ) ;
27
41
} ,
28
- [ dispatch ] ,
42
+ [ dispatch , content , setContent ] ,
29
43
) ;
30
44
31
45
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 >
40
61
< button type = "submit" disabled = { disabled } >
41
62
Send
42
63
</ button >
0 commit comments