From f8a610687f93508edea6b65e113b1d49bbe46f67 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 10 Oct 2019 16:40:03 +0200 Subject: [PATCH] don't persist caret when selection is missing so caret will be put back at end of editor when remounting --- src/components/views/rooms/EditMessageComposer.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/EditMessageComposer.js b/src/components/views/rooms/EditMessageComposer.js index fce30e6081..00d2e447af 100644 --- a/src/components/views/rooms/EditMessageComposer.js +++ b/src/components/views/rooms/EditMessageComposer.js @@ -210,9 +210,18 @@ export default class EditMessageComposer extends React.Component { } componentWillUnmount() { + // store caret and serialized parts in the + // editorstate so it can be restored when the remote echo event tile gets rendered + // in case we're currently editing a pending event const sel = document.getSelection(); - const {caret} = getCaretOffsetAndText(this._editorRef, sel); + let caret; + if (sel.focusNode) { + caret = getCaretOffsetAndText(this._editorRef, sel).caret; + } const parts = this.model.serializeParts(); + // if caret is undefined because for some reason there isn't a valid selection, + // then when mounting the editor again with the same editor state, + // it will set the cursor at the end. this.props.editState.setEditorState(caret, parts); } @@ -239,7 +248,7 @@ export default class EditMessageComposer extends React.Component { _getInitialCaretPosition() { const {editState} = this.props; let caretPosition; - if (editState.hasEditorState()) { + if (editState.hasEditorState() && editState.getCaret()) { // if restoring state from a previous editor, // restore caret position from the state const caret = editState.getCaret();