message: 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
diff: @@ -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
  