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();