diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 92775f75b3..fdfc6acf9b 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -272,6 +272,28 @@ module.exports = React.createClass({ return this.state.room ? this.state.room.roomId : this.state.roomId; }, + _getPermalinkCreatorForRoom: function(room) { + if (!this._permalinkCreators) this._permalinkCreators = {}; + if (this._permalinkCreators[room.roomId]) return this._permalinkCreators[room.roomId]; + + this._permalinkCreators[room.roomId] = new RoomPermalinkCreator(room); + if (this.state.room && room.roomId === this.state.room.roomId) { + // We want to watch for changes in the creator for the primary room in the view, but + // don't need to do so for search results. + this._permalinkCreators[room.roomId].start(); + } else { + this._permalinkCreators[room.roomId].load(); + } + return this._permalinkCreators[room.roomId]; + }, + + _stopAllPermalinkCreators: function() { + if (!this._permalinkCreators) return; + for (const roomId of Object.keys(this._permalinkCreators)) { + this._permalinkCreators[roomId].stop(); + } + }, + _onWidgetEchoStoreUpdate: function() { this.setState({ showApps: this._shouldShowApps(this.state.room), @@ -436,9 +458,7 @@ module.exports = React.createClass({ } // stop tracking room changes to format permalinks - if (this.state.permalinkCreator) { - this.state.permalinkCreator.stop(); - } + this._stopAllPermalinkCreators(); if (this.refs.roomView) { // disconnect the D&D event listeners from the room view. This @@ -651,11 +671,6 @@ module.exports = React.createClass({ this._loadMembersIfJoined(room); this._calculateRecommendedVersion(room); this._updateE2EStatus(room); - if (!this.state.permalinkCreator) { - const permalinkCreator = new RoomPermalinkCreator(room); - permalinkCreator.start(); - this.setState({permalinkCreator}); - } }, _calculateRecommendedVersion: async function(room) { @@ -1169,6 +1184,7 @@ module.exports = React.createClass({ const mxEv = result.context.getEvent(); const roomId = mxEv.getRoomId(); + const room = cli.getRoom(roomId); if (!EventTile.haveTileForEvent(mxEv)) { // XXX: can this ever happen? It will make the result count @@ -1178,7 +1194,6 @@ module.exports = React.createClass({ if (this.state.searchScope === 'All') { if (roomId != lastRoomId) { - const room = cli.getRoom(roomId); // XXX: if we've left the room, we might not know about // it. We should tell the js sdk to go and find out about @@ -1199,7 +1214,7 @@ module.exports = React.createClass({ searchResult={result} searchHighlights={this.state.searchHighlights} resultLink={resultLink} - permalinkCreator={this.state.permalinkCreator} + permalinkCreator={this._getPermalinkCreatorForRoom(room)} onHeightChanged={onHeightChanged} />); } return ret; @@ -1724,7 +1739,7 @@ module.exports = React.createClass({ disabled={this.props.disabled} showApps={this.state.showApps} e2eStatus={this.state.e2eStatus} - permalinkCreator={this.state.permalinkCreator} + permalinkCreator={this._getPermalinkCreatorForRoom(this.state.room)} />; } @@ -1826,7 +1841,7 @@ module.exports = React.createClass({ showUrlPreview = {this.state.showUrlPreview} className="mx_RoomView_messagePanel" membersLoaded={this.state.membersLoaded} - permalinkCreator={this.state.permalinkCreator} + permalinkCreator={this._getPermalinkCreatorForRoom(this.state.room)} resizeNotifier={this.props.resizeNotifier} />); diff --git a/src/matrix-to.js b/src/matrix-to.js index bb7ddfbd94..a198bb422e 100644 --- a/src/matrix-to.js +++ b/src/matrix-to.js @@ -77,6 +77,7 @@ export class RoomPermalinkCreator { this._bannedHostsRegexps = null; this._allowedHostsRegexps = null; this._serverCandidates = null; + this._started = false; this.onMembership = this.onMembership.bind(this); this.onRoomState = this.onRoomState.bind(this); @@ -101,11 +102,17 @@ export class RoomPermalinkCreator { this.load(); this._room.on("RoomMember.membership", this.onMembership); this._room.on("RoomState.events", this.onRoomState); + this._started = true; } stop() { this._room.removeListener("RoomMember.membership", this.onMembership); this._room.removeListener("RoomState.events", this.onRoomState); + this._started = false; + } + + isStarted() { + return this._started; } forEvent(eventId) {