From c49afe4d720598377d35117380651bc3423796a4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 8 Apr 2019 16:23:00 -0600 Subject: [PATCH 1/4] Use dedicated permalink creators in search results with multiple rooms Fixes https://github.com/vector-im/riot-web/issues/9376 This also would have happened in "All Rooms" searches. --- src/components/structures/RoomView.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 4f20b354d3..a60f19b35e 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -1161,6 +1161,10 @@ module.exports = React.createClass({ } }; + // We cache the permalink creators to avoid creating a ton of them in popular searches + const permalinkCreators = {}; // [roomId] => creator + permalinkCreators[this.state.room.roomId] = this.state.permalinkCreator; + let lastRoomId; for (let i = this.state.searchResults.results.length - 1; i >= 0; i--) { @@ -1168,6 +1172,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 @@ -1177,7 +1182,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 @@ -1194,11 +1198,17 @@ module.exports = React.createClass({ const resultLink = "#/room/"+roomId+"/"+mxEv.getId(); + let permalinkCreator = permalinkCreators[roomId]; + if (!permalinkCreator) { + permalinkCreator = permalinkCreators[roomId] = new RoomPermalinkCreator(room); + permalinkCreator.stop(); // We're not interested in monitoring for updates here. + } + ret.push(); } return ret; From e4a9d4f5c889699525e27d8297601de1625cf301 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 9 Apr 2019 12:01:09 -0600 Subject: [PATCH 2/4] Cache permalink creators out of the component's state --- src/components/structures/RoomView.js | 42 +++++++++++++-------------- src/matrix-to.js | 7 +++++ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index a60f19b35e..3f9d93c9b1 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -272,6 +272,20 @@ 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]; + + return this._permalinkCreators[room.roomId] = new RoomPermalinkCreator(room); + }, + + _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 +450,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 @@ -650,11 +662,9 @@ 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}); - } + + let creator = this._getPermalinkCreatorForRoom(room); + if (!creator.isStarted()) creator.start(); }, _calculateRecommendedVersion: async function(room) { @@ -1161,10 +1171,6 @@ module.exports = React.createClass({ } }; - // We cache the permalink creators to avoid creating a ton of them in popular searches - const permalinkCreators = {}; // [roomId] => creator - permalinkCreators[this.state.room.roomId] = this.state.permalinkCreator; - let lastRoomId; for (let i = this.state.searchResults.results.length - 1; i >= 0; i--) { @@ -1198,17 +1204,11 @@ module.exports = React.createClass({ const resultLink = "#/room/"+roomId+"/"+mxEv.getId(); - let permalinkCreator = permalinkCreators[roomId]; - if (!permalinkCreator) { - permalinkCreator = permalinkCreators[roomId] = new RoomPermalinkCreator(room); - permalinkCreator.stop(); // We're not interested in monitoring for updates here. - } - ret.push(); } return ret; @@ -1733,7 +1733,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)} />; } @@ -1835,7 +1835,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) { From ccf292f05368f63dc4f0f5fd01135224d38f5b97 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 11 Apr 2019 10:59:00 -0600 Subject: [PATCH 3/4] Load permalink creators to get proper state of the room --- src/components/structures/RoomView.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 3f9d93c9b1..1bcbec4845 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -276,7 +276,9 @@ module.exports = React.createClass({ if (!this._permalinkCreators) this._permalinkCreators = {}; if (this._permalinkCreators[room.roomId]) return this._permalinkCreators[room.roomId]; - return this._permalinkCreators[room.roomId] = new RoomPermalinkCreator(room); + this._permalinkCreators[room.roomId] = new RoomPermalinkCreator(room); + this._permalinkCreators[room.roomId].load(); + return this._permalinkCreators[room.roomId]; }, _stopAllPermalinkCreators: function() { From 0479901daa288bd87a645d8827b6530db92b2190 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 12 Apr 2019 10:38:39 -0600 Subject: [PATCH 4/4] Load data for permalink creators once --- src/components/structures/RoomView.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 1bcbec4845..acece9271c 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -277,7 +277,13 @@ module.exports = React.createClass({ if (this._permalinkCreators[room.roomId]) return this._permalinkCreators[room.roomId]; this._permalinkCreators[room.roomId] = new RoomPermalinkCreator(room); - this._permalinkCreators[room.roomId].load(); + 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]; }, @@ -664,9 +670,6 @@ module.exports = React.createClass({ this._loadMembersIfJoined(room); this._calculateRecommendedVersion(room); this._updateE2EStatus(room); - - let creator = this._getPermalinkCreatorForRoom(room); - if (!creator.isStarted()) creator.start(); }, _calculateRecommendedVersion: async function(room) {