You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-09 10:22:46 +03:00
Tweak thread creation & event adding to fix bugs around relations (#2369)
* Remove legacy code which caused threads to begin life with too many events * Update tests & behaviour
This commit is contained in:
committed by
GitHub
parent
3e4f02b41e
commit
ba1f6ffc84
@@ -1937,6 +1937,15 @@ describe("Room", function() {
|
|||||||
expect(() => room.createThread(rootEvent.getId(), rootEvent, [])).not.toThrow();
|
expect(() => room.createThread(rootEvent.getId(), rootEvent, [])).not.toThrow();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("creating thread from edited event should not conflate old versions of the event", () => {
|
||||||
|
const message = mkMessage();
|
||||||
|
const edit = mkEdit(message);
|
||||||
|
message.makeReplaced(edit);
|
||||||
|
|
||||||
|
const thread = room.createThread("$000", message, [], true);
|
||||||
|
expect(thread).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
it("Edits update the lastReply event", async () => {
|
it("Edits update the lastReply event", async () => {
|
||||||
room.client.supportsExperimentalThreads = () => true;
|
room.client.supportsExperimentalThreads = () => true;
|
||||||
|
|
||||||
@@ -2036,17 +2045,15 @@ describe("Room", function() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
let prom = emitPromise(room, ThreadEvent.New);
|
const prom = emitPromise(room, ThreadEvent.New);
|
||||||
room.addLiveEvents([threadRoot, threadResponse1, threadResponse2, threadResponse2Reaction]);
|
room.addLiveEvents([threadRoot, threadResponse1, threadResponse2, threadResponse2Reaction]);
|
||||||
const thread = await prom;
|
const thread = await prom;
|
||||||
|
|
||||||
expect(thread).toHaveLength(2);
|
expect(thread).toHaveLength(2);
|
||||||
expect(thread.replyToEvent.getId()).toBe(threadResponse2.getId());
|
expect(thread.replyToEvent.getId()).toBe(threadResponse2.getId());
|
||||||
|
|
||||||
prom = emitPromise(thread, ThreadEvent.Update);
|
|
||||||
const threadResponse2ReactionRedaction = mkRedaction(threadResponse2Reaction);
|
const threadResponse2ReactionRedaction = mkRedaction(threadResponse2Reaction);
|
||||||
room.addLiveEvents([threadResponse2ReactionRedaction]);
|
room.addLiveEvents([threadResponse2ReactionRedaction]);
|
||||||
await prom;
|
|
||||||
expect(thread).toHaveLength(2);
|
expect(thread).toHaveLength(2);
|
||||||
expect(thread.replyToEvent.getId()).toBe(threadResponse2.getId());
|
expect(thread.replyToEvent.getId()).toBe(threadResponse2.getId());
|
||||||
});
|
});
|
||||||
|
@@ -1659,8 +1659,10 @@ export class Room extends TypedEventEmitter<EmittedEvents, RoomEventHandlerMap>
|
|||||||
if (rootEvent) {
|
if (rootEvent) {
|
||||||
const tl = this.getTimelineForEvent(rootEvent.getId());
|
const tl = this.getTimelineForEvent(rootEvent.getId());
|
||||||
const relatedEvents = tl?.getTimelineSet().getAllRelationsEventForEvent(rootEvent.getId());
|
const relatedEvents = tl?.getTimelineSet().getAllRelationsEventForEvent(rootEvent.getId());
|
||||||
if (relatedEvents) {
|
if (relatedEvents?.length) {
|
||||||
events = events.concat(relatedEvents);
|
// Include all relations of the root event, given it'll be visible in both timelines,
|
||||||
|
// except `m.replace` as that will already be applied atop the event using `MatrixEvent::makeReplaced`
|
||||||
|
events = events.concat(relatedEvents.filter(e => !e.isRelation(RelationType.Replace)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -221,9 +221,10 @@ export class Thread extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {
|
|||||||
this._currentUserParticipated = true;
|
this._currentUserParticipated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add all annotations and replace relations to the timeline so that the relations are processed accordingly
|
|
||||||
if ([RelationType.Annotation, RelationType.Replace].includes(event.getRelation()?.rel_type as RelationType)) {
|
if ([RelationType.Annotation, RelationType.Replace].includes(event.getRelation()?.rel_type as RelationType)) {
|
||||||
this.addEventToTimeline(event, toStartOfTimeline);
|
// Apply annotations and replace relations to the relations of the timeline only
|
||||||
|
this.timelineSet.setRelationsTarget(event);
|
||||||
|
this.timelineSet.aggregateRelations(event);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user