@@ -3,13 +3,37 @@ import PropTypes from 'prop-types'
3
3
import { updateRefHeight } from '../../utils'
4
4
import { useTranslation } from 'react-i18next'
5
5
6
- export function InputBox ( { onSubmit, enabled, port } ) {
6
+ export function InputBox ( { onSubmit, enabled, port, reverseResizeDir } ) {
7
7
const { t } = useTranslation ( )
8
8
const [ value , setValue ] = useState ( '' )
9
+ const reverseDivRef = useRef ( null )
9
10
const inputRef = useRef ( null )
11
+ const resizedRef = useRef ( false )
12
+
13
+ const virtualInputRef = reverseResizeDir ? reverseDivRef : inputRef
10
14
11
15
useEffect ( ( ) => {
12
- updateRefHeight ( inputRef )
16
+ const onResizeY = ( ) => {
17
+ if ( virtualInputRef . current . h !== virtualInputRef . current . offsetHeight ) {
18
+ virtualInputRef . current . h = virtualInputRef . current . offsetHeight
19
+ if ( ! resizedRef . current ) {
20
+ resizedRef . current = true
21
+ virtualInputRef . current . style . maxHeight = ''
22
+ }
23
+ }
24
+ }
25
+ virtualInputRef . current . h = virtualInputRef . current . offsetHeight
26
+ virtualInputRef . current . addEventListener ( 'mousemove' , onResizeY )
27
+ } , [ ] )
28
+
29
+ useEffect ( ( ) => {
30
+ if ( ! resizedRef . current ) {
31
+ if ( ! reverseResizeDir ) {
32
+ updateRefHeight ( inputRef )
33
+ virtualInputRef . current . h = virtualInputRef . current . offsetHeight
34
+ virtualInputRef . current . style . maxHeight = '160px'
35
+ }
36
+ }
13
37
} )
14
38
15
39
useEffect ( ( ) => {
@@ -33,20 +57,37 @@ export function InputBox({ onSubmit, enabled, port }) {
33
57
34
58
return (
35
59
< div className = "input-box" >
36
- < textarea
37
- dir = "auto"
38
- ref = { inputRef }
39
- disabled = { false }
40
- className = "interact-input"
41
- placeholder = {
42
- enabled
43
- ? t ( 'Type your question here\nEnter to send\nShift + enter to break line' )
44
- : t ( 'Type your question here\nEnter to stop generating\nShift + enter to break line' )
60
+ < div
61
+ ref = { reverseDivRef }
62
+ style = {
63
+ reverseResizeDir && {
64
+ transform : 'rotateX(180deg)' ,
65
+ resize : 'vertical' ,
66
+ overflow : 'hidden' ,
67
+ minHeight : '160px' ,
68
+ }
45
69
}
46
- value = { value }
47
- onChange = { ( e ) => setValue ( e . target . value ) }
48
- onKeyDown = { handleKeyDownOrClick }
49
- />
70
+ >
71
+ < textarea
72
+ dir = "auto"
73
+ ref = { inputRef }
74
+ disabled = { false }
75
+ className = "interact-input"
76
+ style = {
77
+ reverseResizeDir
78
+ ? { transform : 'rotateX(180deg)' , resize : 'none' }
79
+ : { resize : 'vertical' , minHeight : '70px' }
80
+ }
81
+ placeholder = {
82
+ enabled
83
+ ? t ( 'Type your question here\nEnter to send\nShift + enter to break line' )
84
+ : t ( 'Type your question here\nEnter to stop generating\nShift + enter to break line' )
85
+ }
86
+ value = { value }
87
+ onChange = { ( e ) => setValue ( e . target . value ) }
88
+ onKeyDown = { handleKeyDownOrClick }
89
+ />
90
+ </ div >
50
91
< button
51
92
className = "submit-button"
52
93
style = { {
@@ -62,8 +103,9 @@ export function InputBox({ onSubmit, enabled, port }) {
62
103
63
104
InputBox . propTypes = {
64
105
onSubmit : PropTypes . func . isRequired ,
65
- enabled : PropTypes . bool ,
66
- port : PropTypes . func . isRequired ,
106
+ enabled : PropTypes . bool . isRequired ,
107
+ reverseResizeDir : PropTypes . bool ,
108
+ port : PropTypes . object . isRequired ,
67
109
}
68
110
69
111
export default InputBox
0 commit comments