diff --git a/skins/base/css/molecules/MessageTile.css b/skins/base/css/molecules/MessageTile.css
index 9b548c5e9d..45882de6dc 100644
--- a/skins/base/css/molecules/MessageTile.css
+++ b/skins/base/css/molecules/MessageTile.css
@@ -74,3 +74,7 @@ limitations under the License.
.mx_MessageTile_highlight {
color: #00f;
}
+
+.mx_MessageTile_msgOption {
+ float: right;
+}
diff --git a/skins/base/views/molecules/MessageTile.js b/skins/base/views/molecules/MessageTile.js
index 7eca203056..572ee0d524 100644
--- a/skins/base/views/molecules/MessageTile.js
+++ b/skins/base/views/molecules/MessageTile.js
@@ -57,8 +57,7 @@ module.exports = React.createClass({
mx_MessageTile_continuation: this.props.continuation,
});
var timestamp = this.props.last ? : null;
- var avatar;
- var sender;
+ var avatar, sender, resend;
if (!this.props.continuation) {
avatar = (
@@ -67,10 +66,16 @@ module.exports = React.createClass({
);
sender =
;
}
+ if (this.props.mxEvent.status === "not_sent" && !this.state.resending) {
+ resend =
;
+ }
return (
{ avatar }
{ timestamp }
+ { resend }
{ sender }
diff --git a/src/controllers/molecules/MessageComposer.js b/src/controllers/molecules/MessageComposer.js
index 2ece5636ad..c73e9f25cf 100644
--- a/src/controllers/molecules/MessageComposer.js
+++ b/src/controllers/molecules/MessageComposer.js
@@ -232,6 +232,10 @@ module.exports = {
dis.dispatch({
action: 'message_sent'
});
+ }, function() {
+ dis.dispatch({
+ action: 'message_send_failed'
+ });
});
this.refs.textarea.getDOMNode().value = '';
ev.preventDefault();
diff --git a/src/controllers/molecules/MessageTile.js b/src/controllers/molecules/MessageTile.js
index 953e33b516..47b616e724 100644
--- a/src/controllers/molecules/MessageTile.js
+++ b/src/controllers/molecules/MessageTile.js
@@ -23,6 +23,28 @@ module.exports = {
var actions = MatrixClientPeg.get().getPushActionsForEvent(this.props.mxEvent);
if (!actions || !actions.tweaks) { return false; }
return actions.tweaks.highlight;
+ },
+
+ getInitialState: function() {
+ return {
+ resending: false
+ };
+ },
+
+ onResend: function() {
+ var self = this;
+ self.setState({
+ resending: true
+ });
+ MatrixClientPeg.get().resendEvent(
+ this.props.mxEvent, MatrixClientPeg.get().getRoom(
+ this.props.mxEvent.getRoomId()
+ )
+ ).finally(function() {
+ self.setState({
+ resending: false
+ });
+ })
}
};
diff --git a/src/controllers/organisms/RoomView.js b/src/controllers/organisms/RoomView.js
index 8465b2ce89..332572a5a1 100644
--- a/src/controllers/organisms/RoomView.js
+++ b/src/controllers/organisms/RoomView.js
@@ -79,10 +79,12 @@ module.exports = {
onAction: function(payload) {
switch (payload.action) {
+ case 'message_send_failed':
case 'message_sent':
this.setState({
room: MatrixClientPeg.get().getRoom(this.props.roomId)
});
+ this.forceUpdate();
break;
case'notifier_enabled':
this.forceUpdate();