fix a crash when switching rooms before the messages have loaded

as we were not disposing the timeline view model
(but still not leaking though)
This commit is contained in:
Bruno Windels 2020-10-19 12:57:21 +02:00
parent 3e34ccb7e1
commit cdcdc07c06
2 changed files with 9 additions and 7 deletions

View file

@ -25,7 +25,6 @@ export class RoomViewModel extends ViewModel {
const {room, ownUserId} = options; const {room, ownUserId} = options;
this._room = room; this._room = room;
this._ownUserId = ownUserId; this._ownUserId = ownUserId;
this._timeline = null;
this._timelineVM = null; this._timelineVM = null;
this._onRoomChange = this._onRoomChange.bind(this); this._onRoomChange = this._onRoomChange.bind(this);
this._timelineError = null; this._timelineError = null;
@ -42,13 +41,12 @@ export class RoomViewModel extends ViewModel {
async load() { async load() {
this._room.on("change", this._onRoomChange); this._room.on("change", this._onRoomChange);
try { try {
this._timeline = this.track(this._room.openTimeline()); this._timelineVM = this.track(new TimelineViewModel(this.childOptions({
await this._timeline.load();
this._timelineVM = new TimelineViewModel(this.childOptions({
room: this._room, room: this._room,
timeline: this._timeline, timeline: this._room.openTimeline(),
ownUserId: this._ownUserId, ownUserId: this._ownUserId,
})); })));
await this._timelineVM.load();
this.emitChange("timelineViewModel"); this.emitChange("timelineViewModel");
} catch (err) { } catch (err) {
console.error(`room.openTimeline(): ${err.message}:\n${err.stack}`); console.error(`room.openTimeline(): ${err.message}:\n${err.stack}`);

View file

@ -39,13 +39,17 @@ export class TimelineViewModel extends ViewModel {
constructor(options) { constructor(options) {
super(options); super(options);
const {room, timeline, ownUserId} = options; const {room, timeline, ownUserId} = options;
this._timeline = timeline; this._timeline = this.track(timeline);
// once we support sending messages we could do // once we support sending messages we could do
// timeline.entries.concat(timeline.pendingEvents) // timeline.entries.concat(timeline.pendingEvents)
// for an ObservableList that also contains local echos // for an ObservableList that also contains local echos
this._tiles = new TilesCollection(timeline.entries, tilesCreator({room, ownUserId, clock: this.clock})); this._tiles = new TilesCollection(timeline.entries, tilesCreator({room, ownUserId, clock: this.clock}));
} }
async load() {
await this._timeline.load();
}
/** /**
* @return {bool} startReached if the start of the timeline was reached * @return {bool} startReached if the start of the timeline was reached
*/ */