diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index ab937c07ac..7b1855b678 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -523,6 +523,9 @@ module.exports = React.createClass({
payload.releaseNotes,
);
break;
+ case 'send_event':
+ this.onSendEvent(payload.room_id, payload.event);
+ break;
}
},
@@ -1267,6 +1270,27 @@ module.exports = React.createClass({
});
},
+ onSendEvent: function(roomId, event) {
+ const cli = MatrixClientPeg.get();
+ if (!cli) {
+ dis.dispatch({action: 'message_send_failed'});
+ return;
+ }
+
+ cli.sendEvent(roomId, event.getType(), event.getContent()).done(() => {
+ dis.dispatch({action: 'message_sent'});
+ }, (err) => {
+ if (err.name === 'UnknownDeviceError') {
+ dis.dispatch({
+ action: 'unknown_device_error',
+ err: err,
+ room: cli.getRoom(roomId),
+ });
+ }
+ dis.dispatch({action: 'message_send_failed'});
+ });
+ },
+
updateStatusIndicator: function(state, prevState) {
let notifCount = 0;
diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js
index 9306008e71..542b7a3e50 100644
--- a/src/components/structures/RoomView.js
+++ b/src/components/structures/RoomView.js
@@ -168,6 +168,7 @@ module.exports = React.createClass({
initialEventId: RoomViewStore.getInitialEventId(),
initialEventPixelOffset: RoomViewStore.getInitialEventPixelOffset(),
isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(),
+ forwardingEvent: RoomViewStore.getForwardingEvent(),
};
// Temporary logging to diagnose https://github.com/vector-im/riot-web/issues/4307
@@ -452,11 +453,6 @@ module.exports = React.createClass({
callState: callState
});
- break;
- case 'forward_event':
- this.setState({
- forwardingEvent: payload.content,
- });
break;
}
},
@@ -1164,8 +1160,13 @@ module.exports = React.createClass({
this.updateTint();
this.setState({
editingRoomSettings: false,
- forwardingEvent: null,
});
+ if (this.state.forwardingEvent) {
+ dis.dispatch({
+ action: 'forward_event',
+ event: null,
+ });
+ }
dis.dispatch({action: 'focus_composer'});
},
@@ -1576,7 +1577,7 @@ module.exports = React.createClass({
} else if (this.state.uploadingRoomSettings) {
aux = ;
} else if (this.state.forwardingEvent !== null) {
- aux = ;
+ aux = ;
} else if (this.state.searching) {
hideCancel = true; // has own cancel
aux = ;
diff --git a/src/components/views/rooms/ForwardMessage.js b/src/components/views/rooms/ForwardMessage.js
index 33df201d7c..3c97128a02 100644
--- a/src/components/views/rooms/ForwardMessage.js
+++ b/src/components/views/rooms/ForwardMessage.js
@@ -17,7 +17,6 @@
import React from 'react';
import { _t } from '../../../languageHandler';
-import MatrixClientPeg from '../../../MatrixClientPeg';
import dis from '../../../dispatcher';
import KeyCode from '../../../KeyCode';
@@ -26,11 +25,6 @@ module.exports = React.createClass({
displayName: 'ForwardMessage',
propTypes: {
- currentRoomId: React.PropTypes.string.isRequired,
-
- /* the MatrixEvent to be forwarded */
- mxEvent: React.PropTypes.object.isRequired,
-
onCancelClick: React.PropTypes.func.isRequired,
},
@@ -44,7 +38,6 @@ module.exports = React.createClass({
},
componentDidMount: function() {
- this.dispatcherRef = dis.register(this.onAction);
document.addEventListener('keydown', this._onKeyDown);
},
@@ -54,30 +47,9 @@ module.exports = React.createClass({
sideOpacity: 1.0,
middleOpacity: 1.0,
});
- dis.unregister(this.dispatcherRef);
document.removeEventListener('keydown', this._onKeyDown);
},
- onAction: function(payload) {
- if (payload.action === 'view_room') {
- const event = this.props.mxEvent;
- const Client = MatrixClientPeg.get();
- Client.sendEvent(payload.room_id, event.getType(), event.getContent()).done(() => {
- dis.dispatch({action: 'message_sent'});
- }, (err) => {
- if (err.name === "UnknownDeviceError") {
- dis.dispatch({
- action: 'unknown_device_error',
- err: err,
- room: Client.getRoom(payload.room_id),
- });
- }
- dis.dispatch({action: 'message_send_failed'});
- });
- if (this.props.currentRoomId === payload.room_id) this.props.onCancelClick();
- }
- },
-
_onKeyDown: function(ev) {
switch (ev.keyCode) {
case KeyCode.ESCAPE:
diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js
index ac06d41e81..d68373f0d5 100644
--- a/src/stores/RoomViewStore.js
+++ b/src/stores/RoomViewStore.js
@@ -55,6 +55,8 @@ const INITIAL_STATE = {
// pixelOffset: the number of pixels the window is scrolled down
// from the focussedEvent.
scrollStateMap: {},
+
+ forwardingEvent: null,
};
/**
@@ -116,6 +118,11 @@ class RoomViewStore extends Store {
case 'update_scroll_state':
this._updateScrollState(payload);
break;
+ case 'forward_event':
+ this._setState({
+ forwardingEvent: payload.event,
+ });
+ break;
}
}
@@ -127,6 +134,7 @@ class RoomViewStore extends Store {
initialEventId: payload.event_id,
initialEventPixelOffset: undefined,
isInitialEventHighlighted: payload.highlighted,
+ forwardingEvent: null,
roomLoading: false,
roomLoadError: null,
};
@@ -141,6 +149,14 @@ class RoomViewStore extends Store {
}
}
+ if (this._state.forwardingEvent) {
+ dis.dispatch({
+ action: 'send_event',
+ room_id: newState.roomId,
+ event: this._state.forwardingEvent,
+ });
+ }
+
this._setState(newState);
} else if (payload.room_alias) {
// Resolve the alias and then do a second dispatch with the room ID acquired
@@ -276,6 +292,11 @@ class RoomViewStore extends Store {
getJoinError() {
return this._state.joinError;
}
+
+ // The mxEvent if one is about to be forwarded
+ getForwardingEvent() {
+ return this._state.forwardingEvent;
+ }
}
let singletonRoomViewStore = null;