From 0419eff230a75620bf1d1287f4abc99bcc71400d Mon Sep 17 00:00:00 2001
From: Luke Barnard <lukeb@openmarket.com>
Date: Thu, 20 Jul 2017 15:46:36 +0100
Subject: [PATCH] Insert pill onClick of timeline profile

When clicking someone in the timeline, insert a user pill instead of the plaintext "displayname:"
---
 src/components/views/messages/TextualBody.js   |  3 +--
 src/components/views/rooms/EventTile.js        |  4 ++--
 .../views/rooms/MessageComposerInput.js        | 18 +++++++++++++-----
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js
index 85cc85be49..d45813cb17 100644
--- a/src/components/views/messages/TextualBody.js
+++ b/src/components/views/messages/TextualBody.js
@@ -297,10 +297,9 @@ module.exports = React.createClass({
 
     onEmoteSenderClick: function(event) {
         const mxEvent = this.props.mxEvent;
-        const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender();
         dis.dispatch({
             action: 'insert_displayname',
-            displayname: name.replace(' (IRC)', ''),
+            user_id: mxEvent.getSender(),
         });
     },
 
diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js
index 68ef3a1f44..32f0739795 100644
--- a/src/components/views/rooms/EventTile.js
+++ b/src/components/views/rooms/EventTile.js
@@ -357,10 +357,10 @@ module.exports = withMatrixClient(React.createClass({
     },
 
     onSenderProfileClick: function(event) {
-        var mxEvent = this.props.mxEvent;
+        const mxEvent = this.props.mxEvent;
         dis.dispatch({
             action: 'insert_displayname',
-            displayname: (mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender()).replace(' (IRC)', ''),
+            user_id: mxEvent.getSender(),
         });
     },
 
diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js
index d5a486bb39..29f627180b 100644
--- a/src/components/views/rooms/MessageComposerInput.js
+++ b/src/components/views/rooms/MessageComposerInput.js
@@ -275,15 +275,23 @@ export default class MessageComposerInput extends React.Component {
             case 'focus_composer':
                 editor.focus();
                 break;
-
-            // TODO change this so we insert a complete user alias
-
             case 'insert_displayname': {
+                const entityKey = Entity.create(
+                    'LINK', 'IMMUTABLE',
+                    { url: `https://matrix.to/#/${payload.user_id}`},
+                );
+                const selection = this.state.editorState.getSelection();
                 contentState = Modifier.replaceText(
                     contentState,
-                    this.state.editorState.getSelection(),
-                    `${payload.displayname}: `,
+                    selection,
+                    `${payload.user_id}`,
+                    null,
+                    entityKey,
                 );
+
+                const suffix = selection.getStartOffset() === 0 ? ': ' : ' ';
+                contentState = Modifier.replaceText(contentState, contentState.getSelectionAfter(), suffix);
+
                 let editorState = EditorState.push(this.state.editorState, contentState, 'insert-characters');
                 editorState = EditorState.forceSelection(editorState, contentState.getSelectionAfter());
                 this.onEditorContentChanged(editorState);