Instantiate Thread objects when running fetchRoomThreads (#2262)

This commit is contained in:
Michael Telatynski
2022-03-29 15:28:08 +01:00
committed by GitHub
parent 85b8d4f83a
commit 26cbe02a7f
+27 -27
View File
@@ -1448,14 +1448,6 @@ export class Room extends TypedEventEmitter<EmittedEvents, RoomEventHandlerMap>
pendingEvents: false,
},
);
// An empty pagination token allows to paginate from the very bottom of
// the timeline set.
// Right now we completely by-pass the pagination to be able to order
// the events by last reply to a thread
// Once the server can help us with that, we should uncomment the line
// below
// timelineSet.getLiveTimeline().setPaginationToken("", EventTimeline.BACKWARDS);
} else {
timelineSet = new EventTimelineSet(this, {
pendingEvents: false,
@@ -1493,7 +1485,10 @@ export class Room extends TypedEventEmitter<EmittedEvents, RoomEventHandlerMap>
allThreadsFilter,
);
const orderedByLastReplyEvents = events
if (!events.length) return;
// Sorted by last_reply origin_server_ts
const threadRoots = events
.map(this.client.getEventMapper())
.sort((eventA, eventB) => {
/**
@@ -1509,32 +1504,37 @@ export class Room extends TypedEventEmitter<EmittedEvents, RoomEventHandlerMap>
return threadAMetadata.latest_event.origin_server_ts - threadBMetadata.latest_event.origin_server_ts;
});
const myThreads = orderedByLastReplyEvents.filter(event => {
const threadRelationship = event
.getServerAggregatedRelation<IThreadBundledRelationship>(RelationType.Thread);
return threadRelationship.current_user_participated;
});
let latestMyThreadsRootEvent: MatrixEvent;
const roomState = this.getLiveTimeline().getState(EventTimeline.FORWARDS);
for (const event of orderedByLastReplyEvents) {
for (const rootEvent of threadRoots) {
this.threadsTimelineSets[0].addLiveEvent(
event,
DuplicateStrategy.Ignore,
false,
roomState,
);
}
for (const event of myThreads) {
this.threadsTimelineSets[1].addLiveEvent(
event,
rootEvent,
DuplicateStrategy.Ignore,
false,
roomState,
);
const threadRelationship = rootEvent
.getServerAggregatedRelation<IThreadBundledRelationship>(RelationType.Thread);
if (threadRelationship.current_user_participated) {
this.threadsTimelineSets[1].addLiveEvent(
rootEvent,
DuplicateStrategy.Ignore,
false,
roomState,
);
latestMyThreadsRootEvent = rootEvent;
}
if (!this.getThread(rootEvent.getId())) {
this.createThread(rootEvent, [], true);
}
}
this.client.decryptEventIfNeeded(orderedByLastReplyEvents[orderedByLastReplyEvents.length -1]);
this.client.decryptEventIfNeeded(myThreads[myThreads.length -1]);
this.client.decryptEventIfNeeded(threadRoots[threadRoots.length -1]);
if (latestMyThreadsRootEvent) {
this.client.decryptEventIfNeeded(latestMyThreadsRootEvent);
}
this.threadsReady = true;