Fix emoji replacement in composer
* Re-scan the slate document tree on each emoji replacement since doing a replacement will invalidate all the offsets we have. * Reset the emoji regex each time we use it. Fixes https://github.com/vector-im/riot-web/issues/7550
This commit is contained in:
parent
4c3c8a6285
commit
78d8d22457
1 changed files with 35 additions and 21 deletions
|
@ -573,9 +573,13 @@ export default class MessageComposerInput extends React.Component {
|
|||
}
|
||||
|
||||
// emojioneify any emoji
|
||||
editorState.document.getTexts().forEach(node => {
|
||||
while (true) {
|
||||
let foundEmoji = false;
|
||||
|
||||
for (const node of editorState.document.getTexts()) {
|
||||
if (node.text !== '' && HtmlUtils.containsEmoji(node.text)) {
|
||||
let match;
|
||||
EMOJI_REGEX.lastIndex = 0;
|
||||
while ((match = EMOJI_REGEX.exec(node.text)) !== null) {
|
||||
const range = Range.create({
|
||||
anchor: {
|
||||
|
@ -593,9 +597,19 @@ export default class MessageComposerInput extends React.Component {
|
|||
});
|
||||
change = change.insertInlineAtRange(range, inline);
|
||||
editorState = change.value;
|
||||
|
||||
// if we replaced an emoji, start again looking for more
|
||||
// emoji in the new editor state since doing the replacement
|
||||
// will change the node structure & offsets so we can't compute
|
||||
// insertion ranges from node.key / match.index anymore.
|
||||
foundEmoji = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!foundEmoji) break;
|
||||
}
|
||||
|
||||
// work around weird bug where inserting emoji via the macOS
|
||||
// emoji picker can leave the selection stuck in the emoji's
|
||||
|
|
Loading…
Reference in a new issue