Support a backup room ID in PermalinkCreator

In the case of room upgrades, it is possible the client is trying to render the room create event, but the user has never been in the old room. This results in an error because the PermalinkCreator cannot possibly figure out a room ID. 

Instead, we'll feed the creator an alternate room ID to try if the room object can't be provided.

Fixes https://github.com/vector-im/riot-web/issues/9636
This commit is contained in:
Travis Ralston 2019-05-13 14:12:58 -06:00
parent 201fef8b11
commit 1584ab42c2
2 changed files with 12 additions and 5 deletions

View file

@ -49,7 +49,7 @@ module.exports = React.createClass({
return <div />; // We should never have been instaniated in this case return <div />; // We should never have been instaniated in this case
} }
const prevRoom = MatrixClientPeg.get().getRoom(predecessor['room_id']); const prevRoom = MatrixClientPeg.get().getRoom(predecessor['room_id']);
const permalinkCreator = new RoomPermalinkCreator(prevRoom); const permalinkCreator = new RoomPermalinkCreator(prevRoom, predecessor['room_id']);
permalinkCreator.load(); permalinkCreator.load();
const predecessorPermalink = permalinkCreator.forEvent(predecessor['event_id']); const predecessorPermalink = permalinkCreator.forEvent(predecessor['event_id']);
return <div className="mx_CreateEvent"> return <div className="mx_CreateEvent">

View file

@ -70,8 +70,12 @@ const MAX_SERVER_CANDIDATES = 3;
// the list and magically have the link work. // the list and magically have the link work.
export class RoomPermalinkCreator { export class RoomPermalinkCreator {
constructor(room) { // We support being given a roomId as a fallback in the event the `room` object
// doesn't exist or is not healthy for us to rely on. For example, loading a
// permalink to a room which the MatrixClient doesn't know about.
constructor(room, roomId=null) {
this._room = room; this._room = room;
this._roomId = room ? room.roomId : roomId;
this._highestPlUserId = null; this._highestPlUserId = null;
this._populationMap = null; this._populationMap = null;
this._bannedHostsRegexps = null; this._bannedHostsRegexps = null;
@ -79,6 +83,10 @@ export class RoomPermalinkCreator {
this._serverCandidates = null; this._serverCandidates = null;
this._started = false; this._started = false;
if (!this._roomId) {
throw new Error("Failed to resolve a roomId for the permalink creator to use");
}
this.onMembership = this.onMembership.bind(this); this.onMembership = this.onMembership.bind(this);
this.onRoomState = this.onRoomState.bind(this); this.onRoomState = this.onRoomState.bind(this);
} }
@ -116,13 +124,13 @@ export class RoomPermalinkCreator {
} }
forEvent(eventId) { forEvent(eventId) {
const roomId = this._room.roomId; const roomId = this._roomId;
const permalinkBase = `${baseUrl}/#/${roomId}/${eventId}`; const permalinkBase = `${baseUrl}/#/${roomId}/${eventId}`;
return `${permalinkBase}${encodeServerCandidates(this._serverCandidates)}`; return `${permalinkBase}${encodeServerCandidates(this._serverCandidates)}`;
} }
forRoom() { forRoom() {
const roomId = this._room.roomId; const roomId = this._roomId;
const permalinkBase = `${baseUrl}/#/${roomId}`; const permalinkBase = `${baseUrl}/#/${roomId}`;
return `${permalinkBase}${encodeServerCandidates(this._serverCandidates)}`; return `${permalinkBase}${encodeServerCandidates(this._serverCandidates)}`;
} }
@ -246,7 +254,6 @@ export class RoomPermalinkCreator {
} }
} }
export function makeUserPermalink(userId) { export function makeUserPermalink(userId) {
return `${baseUrl}/#/${userId}`; return `${baseUrl}/#/${userId}`;
} }