diff options
Diffstat (limited to 'vnext/src/ui/MessageInput.js')
-rw-r--r-- | vnext/src/ui/MessageInput.js | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/vnext/src/ui/MessageInput.js b/vnext/src/ui/MessageInput.js index a746ba08..63c2ee79 100644 --- a/vnext/src/ui/MessageInput.js +++ b/vnext/src/ui/MessageInput.js @@ -1,8 +1,6 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; -import { useFormState } from 'react-use-form-state'; - import { MessageType } from './Types'; import Icon from './Icon'; @@ -10,6 +8,19 @@ import Button from './Button'; import UploadButton from './UploadButton'; + +// StackOverflow-driven development: https://stackoverflow.com/a/10158364/1097384 +function moveCaretToEnd(el) { + if (typeof el.selectionStart == 'number') { + el.selectionStart = el.selectionEnd = el.value.length; + } else if (typeof el.createTextRange != 'undefined') { + el.focus(); + var range = el.createTextRange(); + range.collapse(false); + range.select(); + } +} + export default function MessageInput({ text, data, rows, children, onSend }) { let textareaRef = useRef(); let fileinput = useRef(); @@ -18,28 +29,33 @@ export default function MessageInput({ text, data, rows, children, onSend }) { const isDesktop = window.matchMedia('(min-width: 62.5rem)'); if (isDesktop.matches) { textareaRef.current.focus(); + moveCaretToEnd(textareaRef.current); } }; useEffect(() => { - textChanged(); + textChanged({ + target: { + value: text + } + }); updateFocus(); - }, []); + }, [text]); + + let [body, setBody] = useState(text); let handleCtrlEnter = (event) => { if (event.ctrlKey && (event.charCode == 10 || event.charCode == 13)) { onSubmit({}); } }; - let textChanged = (event) => { + const textChanged = (event) => { + setBody(event.target.value); const el = textareaRef.current; const offset = el.offsetHeight - el.clientHeight; const height = el.scrollHeight + offset; el.style.height = `${height + offset}px`; }; const [attach, setAttach] = useState(''); - const [formState, { textarea }] = useFormState({ - body: text - }); let uploadValueChanged = (attach) => { setAttach(attach); }; @@ -51,12 +67,12 @@ export default function MessageInput({ text, data, rows, children, onSend }) { onSend({ mid: data.mid, rid: data.rid || 0, - body: formState.values.body, + body: body, attach: attach ? input.files[0] : '', to: data.to || {} }); setAttach(''); - formState.clearField('body'); + setBody(''); textareaRef.current.style.height = ''; updateFocus(); }; @@ -65,7 +81,7 @@ export default function MessageInput({ text, data, rows, children, onSend }) { <div style={commentStyle}> <textarea onChange={textChanged} onKeyPress={handleCtrlEnter} ref={textareaRef} style={textInputStyle} - rows={rows || '1'} placeholder={children} {...textarea('body')} /> + rows={rows || '1'} placeholder={children} value={body} /> <div style={inputBarStyle}> <UploadButton inputRef={fileinput} value={attach} onChange={uploadValueChanged} /> <Button onClick={onSubmit}><Icon name="ei-envelope" size="s" />Send</Button> @@ -78,7 +94,6 @@ export default function MessageInput({ text, data, rows, children, onSend }) { const commentStyle = { display: 'flex', flexDirection: 'column', - borderTop: '1px #eee solid', width: '100%', marginTop: '10px' }; |