diff options
Diffstat (limited to 'src/screens/Messages/components')
-rw-r--r-- | src/screens/Messages/components/MessageInput.web.tsx | 28 | ||||
-rw-r--r-- | src/screens/Messages/components/MessagesList.tsx | 2 |
2 files changed, 23 insertions, 7 deletions
diff --git a/src/screens/Messages/components/MessageInput.web.tsx b/src/screens/Messages/components/MessageInput.web.tsx index 72e0382a9..bac163685 100644 --- a/src/screens/Messages/components/MessageInput.web.tsx +++ b/src/screens/Messages/components/MessageInput.web.tsx @@ -3,6 +3,7 @@ import {Pressable, StyleSheet, View} from 'react-native' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import Graphemer from 'graphemer' +import {flushSync} from 'react-dom' import TextareaAutosize from 'react-textarea-autosize' import {isSafari, isTouchDevice} from '#/lib/browser' @@ -106,11 +107,19 @@ export function MessageInput({ const onEmojiInserted = React.useCallback( (emoji: Emoji) => { - const position = textAreaRef.current?.selectionStart ?? 0 - setMessage( - message => - message.slice(0, position) + emoji.native + message.slice(position), - ) + if (!textAreaRef.current) { + return + } + const position = textAreaRef.current.selectionStart ?? 0 + textAreaRef.current.focus() + flushSync(() => { + setMessage( + message => + message.slice(0, position) + emoji.native + message.slice(position), + ) + }) + textAreaRef.current.selectionStart = position + emoji.native.length + textAreaRef.current.selectionEnd = position + emoji.native.length }, [setMessage], ) @@ -148,7 +157,14 @@ export function MessageInput({ <Button onPress={e => { e.currentTarget.measure((_fx, _fy, _width, _height, px, py) => { - openEmojiPicker?.({top: py, left: px, right: px, bottom: py}) + openEmojiPicker?.({ + top: py, + left: px, + right: px, + bottom: py, + nextFocusRef: + textAreaRef as unknown as React.MutableRefObject<HTMLElement>, + }) }) }} style={[ diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index ce189459e..071ce1cd7 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -101,7 +101,7 @@ export function MessagesList({ const [emojiPickerState, setEmojiPickerState] = React.useState<EmojiPickerState>({ isOpen: false, - pos: {top: 0, left: 0, right: 0, bottom: 0}, + pos: {top: 0, left: 0, right: 0, bottom: 0, nextFocusRef: null}, }) // We need to keep track of when the scroll offset is at the bottom of the list to know when to scroll as new items |