diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 543b35eaf8..195e4130a6 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -586,7 +586,6 @@ module.exports = createReactClass({ return ContentMessages.sharedInstance().sendContentListToRoom( [payload.file], this.state.room.roomId, MatrixClientPeg.get(), ); - break; case 'notifier_enabled': case 'upload_started': case 'upload_finished': @@ -624,6 +623,11 @@ module.exports = createReactClass({ showApps: payload.show, }); break; + case 'reply_to_event': + if (this.state.searchResults && payload.event.getRoomId() === this.state.roomId && !this.unmounted) { + this.onCancelSearchClick(); + } + break; } }, diff --git a/src/components/views/rooms/ReplyPreview.js b/src/components/views/rooms/ReplyPreview.js index 3b7874a875..58e7237801 100644 --- a/src/components/views/rooms/ReplyPreview.js +++ b/src/components/views/rooms/ReplyPreview.js @@ -37,18 +37,19 @@ export default class ReplyPreview extends React.Component { constructor(props, context) { super(props, context); + this.unmounted = false; this.state = { - event: null, + event: RoomViewStore.getQuotingEvent(), }; this._onRoomViewStoreUpdate = this._onRoomViewStoreUpdate.bind(this); - this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate); - this._onRoomViewStoreUpdate(); } componentWillUnmount() { + this.unmounted = true; + // Remove RoomStore listener if (this._roomStoreToken) { this._roomStoreToken.remove(); @@ -56,6 +57,8 @@ export default class ReplyPreview extends React.Component { } _onRoomViewStoreUpdate() { + if (this.unmounted) return; + const event = RoomViewStore.getQuotingEvent(); if (this.state.event !== event) { this.setState({ event }); diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js index 166833325e..7e1b06c0bf 100644 --- a/src/stores/RoomViewStore.js +++ b/src/stores/RoomViewStore.js @@ -113,9 +113,19 @@ class RoomViewStore extends Store { }); break; case 'reply_to_event': - this._setState({ - replyingToEvent: payload.event, - }); + // If currently viewed room does not match the room in which we wish to reply then change rooms + // this can happen when performing a search across all rooms + if (payload.event && payload.event.getRoomId() !== this._state.roomId) { + dis.dispatch({ + action: 'view_room', + room_id: payload.event.getRoomId(), + replyingToEvent: payload.event, + }); + } else { + this._setState({ + replyingToEvent: payload.event, + }); + } break; case 'open_room_settings': { const RoomSettingsDialog = sdk.getComponent("dialogs.RoomSettingsDialog"); @@ -147,6 +157,11 @@ class RoomViewStore extends Store { isEditingSettings: false, }; + // Allow being given an event to be replied to when switching rooms but sanity check its for this room + if (payload.replyingToEvent && payload.replyingToEvent.getRoomId() === payload.room_id) { + newState.replyingToEvent = payload.replyingToEvent; + } + if (this._state.forwardingEvent) { dis.dispatch({ action: 'send_event',