Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 54a6ce5

Browse files
authored
Fix wrongly grouping 3pid invites into a single repeated transition (#10087)
1 parent 35d222b commit 54a6ce5

File tree

2 files changed

+70
-20
lines changed

2 files changed

+70
-20
lines changed

src/components/views/elements/EventListSummary.tsx

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -507,39 +507,36 @@ export default class EventListSummary extends React.Component<IProps> {
507507
eventsToRender.forEach((e, index) => {
508508
const type = e.getType();
509509

510-
let userId = e.getSender();
511-
if (type === EventType.RoomMember) {
512-
userId = e.getStateKey();
510+
let userKey = e.getSender()!;
511+
if (type === EventType.RoomThirdPartyInvite) {
512+
userKey = e.getContent().display_name;
513+
} else if (type === EventType.RoomMember) {
514+
userKey = e.getStateKey();
513515
} else if (e.isRedacted()) {
514-
userId = e.getUnsigned()?.redacted_because?.sender;
516+
userKey = e.getUnsigned()?.redacted_because?.sender;
515517
}
516518

517519
// Initialise a user's events
518-
if (!userEvents[userId]) {
519-
userEvents[userId] = [];
520+
if (!userEvents[userKey]) {
521+
userEvents[userKey] = [];
520522
}
521523

522-
let displayName = userId;
523-
if (type === EventType.RoomThirdPartyInvite) {
524-
displayName = e.getContent().display_name;
525-
if (e.sender) {
526-
latestUserAvatarMember.set(userId, e.sender);
527-
}
528-
} else if (e.isRedacted()) {
529-
const sender = this.context?.room.getMember(userId);
524+
let displayName = userKey;
525+
if (e.isRedacted()) {
526+
const sender = this.context?.room?.getMember(userKey);
530527
if (sender) {
531528
displayName = sender.name;
532-
latestUserAvatarMember.set(userId, sender);
529+
latestUserAvatarMember.set(userKey, sender);
533530
}
534531
} else if (e.target && TARGET_AS_DISPLAY_NAME_EVENTS.includes(type as EventType)) {
535532
displayName = e.target.name;
536-
latestUserAvatarMember.set(userId, e.target);
537-
} else if (e.sender) {
533+
latestUserAvatarMember.set(userKey, e.target);
534+
} else if (e.sender && type !== EventType.RoomThirdPartyInvite) {
538535
displayName = e.sender.name;
539-
latestUserAvatarMember.set(userId, e.sender);
536+
latestUserAvatarMember.set(userKey, e.sender);
540537
}
541538

542-
userEvents[userId].push({
539+
userEvents[userKey].push({
543540
mxEvent: e,
544541
displayName,
545542
index: index,

test/components/views/elements/EventListSummary-test.tsx

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { MatrixEvent, RoomMember } from "matrix-js-sdk/src/matrix";
2121

2222
import {
2323
getMockClientWithEventEmitter,
24+
mkEvent,
2425
mkMembership,
2526
mockClientMethodsUser,
2627
unmockClientPeg,
@@ -100,7 +101,7 @@ describe("EventListSummary", function () {
100101
// is created by replacing the first "$" in userIdTemplate with `i` for
101102
// `i = 0 .. n`.
102103
const generateEventsForUsers = (userIdTemplate, n, events) => {
103-
let eventsForUsers = [];
104+
let eventsForUsers: MatrixEvent[] = [];
104105
let userId = "";
105106
for (let i = 0; i < n; i++) {
106107
userId = userIdTemplate.replace("$", i);
@@ -656,4 +657,56 @@ describe("EventListSummary", function () {
656657

657658
expect(summaryText).toBe("user_0, user_1 and 18 others joined");
658659
});
660+
661+
it("should not blindly group 3pid invites and treat them as distinct users instead", () => {
662+
const events = [
663+
mkEvent({
664+
event: true,
665+
skey: "randomstring1",
666+
user: "@user1:server",
667+
type: "m.room.third_party_invite",
668+
content: {
669+
display_name: "n...@d...",
670+
key_validity_url: "https://blah",
671+
public_key: "public_key",
672+
},
673+
}),
674+
mkEvent({
675+
event: true,
676+
skey: "randomstring2",
677+
user: "@user1:server",
678+
type: "m.room.third_party_invite",
679+
content: {
680+
display_name: "n...@d...",
681+
key_validity_url: "https://blah",
682+
public_key: "public_key",
683+
},
684+
}),
685+
mkEvent({
686+
event: true,
687+
skey: "randomstring3",
688+
user: "@user1:server",
689+
type: "m.room.third_party_invite",
690+
content: {
691+
display_name: "d...@w...",
692+
key_validity_url: "https://blah",
693+
public_key: "public_key",
694+
},
695+
}),
696+
];
697+
698+
const props = {
699+
events: events,
700+
children: generateTiles(events),
701+
summaryLength: 2,
702+
avatarsMaxLength: 5,
703+
threshold: 3,
704+
};
705+
706+
const wrapper = renderComponent(props);
707+
const summary = wrapper.find(".mx_GenericEventListSummary_summary");
708+
const summaryText = summary.text();
709+
710+
expect(summaryText).toBe("n...@d... was invited 2 times, d...@w... was invited");
711+
});
659712
});

0 commit comments

Comments
 (0)