From e2dfe888ccae21e8eeec83686fa374cc24704967 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 21 Aug 2019 16:22:04 +0200 Subject: [PATCH] only capture Enter when autocompletion list has selection this is the old behaviour and makes sense IMO also close the auto complete when resetting the composer model, in case it was still open --- .../views/rooms/BasicMessageComposer.js | 25 ++++++++++++++----- src/editor/autocomplete.js | 6 ++++- src/editor/model.js | 7 ++++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.js b/src/components/views/rooms/BasicMessageComposer.js index 92abefa117..d4b9cd87c9 100644 --- a/src/components/views/rooms/BasicMessageComposer.js +++ b/src/components/views/rooms/BasicMessageComposer.js @@ -203,19 +203,32 @@ export default class BasicMessageEditor extends React.Component { const autoComplete = model.autoComplete; switch (event.key) { case "Enter": - autoComplete.onEnter(event); break; + // only capture enter when something is selected in the list, + // otherwise don't handle so the contents of the composer gets sent + if (autoComplete.hasSelection()) { + autoComplete.onEnter(event); + handled = true; + } + break; case "ArrowUp": - autoComplete.onUpArrow(event); break; + autoComplete.onUpArrow(event); + handled = true; + break; case "ArrowDown": - autoComplete.onDownArrow(event); break; + autoComplete.onDownArrow(event); + handled = true; + break; case "Tab": - autoComplete.onTab(event); break; + autoComplete.onTab(event); + handled = true; + break; case "Escape": - autoComplete.onEscape(event); break; + autoComplete.onEscape(event); + handled = true; + break; default: return; // don't preventDefault on anything else } - handled = true; } } if (handled) { diff --git a/src/editor/autocomplete.js b/src/editor/autocomplete.js index 2aedf8d7f5..ac662c32d8 100644 --- a/src/editor/autocomplete.js +++ b/src/editor/autocomplete.js @@ -33,6 +33,10 @@ export default class AutocompleteWrapperModel { }); } + hasSelection() { + return this._getAutocompleterComponent().hasSelection(); + } + onEnter() { this._updateCallback({close: true}); } @@ -103,7 +107,7 @@ export default class AutocompleteWrapperModel { } case "#": return this._partCreator.roomPill(completionId); - // also used for emoji completion + // used for emoji and command completion replacement default: return this._partCreator.plain(text); } diff --git a/src/editor/model.js b/src/editor/model.js index 91b724cf9e..2f1e5218d8 100644 --- a/src/editor/model.js +++ b/src/editor/model.js @@ -105,6 +105,13 @@ export default class EditorModel { reset(serializedParts, caret, inputType) { this._parts = serializedParts.map(p => this._partCreator.deserializePart(p)); + // close auto complete if open + // this would happen when clearing the composer after sending + // a message with the autocomplete still open + if (this._autoComplete) { + this._autoComplete = null; + this._autoCompletePartIdx = null; + } this._updateCallback(caret, inputType); }