From 6d5e8905d6a676ca966fa32f6823ebc1409caabe Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Wed, 19 Jun 2019 20:11:45 +0300 Subject: Post: user tags --- vnext/src/ui/MessageInput.js | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'vnext/src/ui/MessageInput.js') 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 }) {