From e80cf8a1336a2df20bcae25bbf5b17331432c2bf Mon Sep 17 00:00:00 2001
From: Kegan Dougal <kegan@matrix.org>
Date: Wed, 22 Jul 2015 11:12:45 +0100
Subject: [PATCH 1/3] Bugfix: Scroll to the bottom more reliably on new
 incoming messages.

Added some padding to the calculation which means the scrollbar can
be scrolled up a bit and still get bumped down. Scroll a lot though
and it will not keep bumping you down (parity with Angular)
---
 src/controllers/organisms/RoomView.js | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/controllers/organisms/RoomView.js b/src/controllers/organisms/RoomView.js
index c6a0735b..7c3a3d0a 100644
--- a/src/controllers/organisms/RoomView.js
+++ b/src/controllers/organisms/RoomView.js
@@ -114,7 +114,10 @@ module.exports = {
 
         if (this.refs.messageWrapper) {
             var messageWrapper = this.refs.messageWrapper.getDOMNode();
-            this.atBottom = messageWrapper.scrollHeight - messageWrapper.scrollTop <= messageWrapper.clientHeight;
+            this.atBottom = (
+                messageWrapper.scrollHeight - messageWrapper.scrollTop <= 
+                (messageWrapper.clientHeight + 150)
+            );
         }
         this.setState({
             room: MatrixClientPeg.get().getRoom(this.props.roomId)

From 7e420729522f0f09651d107ff988210918a39195 Mon Sep 17 00:00:00 2001
From: Kegan Dougal <kegan@matrix.org>
Date: Wed, 22 Jul 2015 13:04:18 +0100
Subject: [PATCH 2/3] Scroll to bottom when there are live call updates.

This keeps the latest messages visible when you place or receive a call.
---
 src/controllers/organisms/RoomView.js | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/controllers/organisms/RoomView.js b/src/controllers/organisms/RoomView.js
index 7c3a3d0a..dca3881c 100644
--- a/src/controllers/organisms/RoomView.js
+++ b/src/controllers/organisms/RoomView.js
@@ -89,6 +89,17 @@ module.exports = {
             case 'notifier_enabled':
                 this.forceUpdate();
                 break;
+            case 'call_state':
+                if (this.props.roomId !== payload.room_id) {
+                    break;
+                }
+                // scroll to bottom
+                var messageWrapper = this.refs.messageWrapper;
+                if (messageWrapper) {
+                    messageWrapper = messageWrapper.getDOMNode();
+                    messageWrapper.scrollTop = messageWrapper.scrollHeight;
+                }
+                break;
         }
     },
 

From d4147c1315517c54cef3c6fceb093f100863b40d Mon Sep 17 00:00:00 2001
From: Kegan Dougal <kegan@matrix.org>
Date: Wed, 22 Jul 2015 13:15:12 +0100
Subject: [PATCH 3/3] Don't allow blank messages to be sent.

---
 src/controllers/molecules/MessageComposer.js | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/controllers/molecules/MessageComposer.js b/src/controllers/molecules/MessageComposer.js
index c73e9f25..74e47fcd 100644
--- a/src/controllers/molecules/MessageComposer.js
+++ b/src/controllers/molecules/MessageComposer.js
@@ -153,7 +153,12 @@ module.exports = {
 
     onKeyDown: function (ev) {
         if (ev.keyCode === KeyCode.ENTER) {
-            this.sentHistory.push(this.refs.textarea.getDOMNode().value);
+            var input = this.refs.textarea.getDOMNode().value;
+            if (input.length === 0) {
+                ev.preventDefault();
+                return;
+            }
+            this.sentHistory.push(input);
             this.onEnter(ev);
         }
         else if (ev.keyCode === KeyCode.TAB) {