diff --git a/src/components/views/messages/RoomCreate.js b/src/components/views/messages/RoomCreate.js
index f9dc3df2dc..95254323fa 100644
--- a/src/components/views/messages/RoomCreate.js
+++ b/src/components/views/messages/RoomCreate.js
@@ -49,7 +49,7 @@ module.exports = React.createClass({
return
; // We should never have been instaniated in this case
}
const prevRoom = MatrixClientPeg.get().getRoom(predecessor['room_id']);
- const permalinkCreator = new RoomPermalinkCreator(prevRoom);
+ const permalinkCreator = new RoomPermalinkCreator(prevRoom, predecessor['room_id']);
permalinkCreator.load();
const predecessorPermalink = permalinkCreator.forEvent(predecessor['event_id']);
return
diff --git a/src/matrix-to.js b/src/matrix-to.js
index a198bb422e..14467cb4c5 100644
--- a/src/matrix-to.js
+++ b/src/matrix-to.js
@@ -70,8 +70,12 @@ const MAX_SERVER_CANDIDATES = 3;
// the list and magically have the link work.
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._roomId = room ? room.roomId : roomId;
this._highestPlUserId = null;
this._populationMap = null;
this._bannedHostsRegexps = null;
@@ -79,6 +83,10 @@ export class RoomPermalinkCreator {
this._serverCandidates = null;
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.onRoomState = this.onRoomState.bind(this);
}
@@ -116,13 +124,13 @@ export class RoomPermalinkCreator {
}
forEvent(eventId) {
- const roomId = this._room.roomId;
+ const roomId = this._roomId;
const permalinkBase = `${baseUrl}/#/${roomId}/${eventId}`;
return `${permalinkBase}${encodeServerCandidates(this._serverCandidates)}`;
}
forRoom() {
- const roomId = this._room.roomId;
+ const roomId = this._roomId;
const permalinkBase = `${baseUrl}/#/${roomId}`;
return `${permalinkBase}${encodeServerCandidates(this._serverCandidates)}`;
}
@@ -246,7 +254,6 @@ export class RoomPermalinkCreator {
}
}
-
export function makeUserPermalink(userId) {
return `${baseUrl}/#/${userId}`;
}