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

Commit 0cf15d2

Browse files
authored
Fix edge cases around event list summaries with hidden events and redactions (#7797)
1 parent 76fb2ab commit 0cf15d2

File tree

3 files changed

+38
-28
lines changed

3 files changed

+38
-28
lines changed

src/components/structures/MessagePanel.tsx

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -681,15 +681,7 @@ export default class MessagePanel extends React.Component<IProps, IState> {
681681

682682
for (const Grouper of groupers) {
683683
if (Grouper.canStartGroup(this, mxEv) && !this.props.disableGrouping) {
684-
grouper = new Grouper(
685-
this,
686-
mxEv,
687-
prevEvent,
688-
lastShownEvent,
689-
this.props.layout,
690-
nextEvent,
691-
nextTile,
692-
);
684+
grouper = new Grouper(this, mxEv, prevEvent, lastShownEvent, nextEvent, nextTile);
693685
}
694686
}
695687
if (!grouper) {
@@ -1056,7 +1048,6 @@ abstract class BaseGrouper {
10561048
public readonly event: MatrixEvent,
10571049
public readonly prevEvent: MatrixEvent,
10581050
public readonly lastShownEvent: MatrixEvent,
1059-
protected readonly layout: Layout,
10601051
public readonly nextEvent?: MatrixEvent,
10611052
public readonly nextEventTile?: MatrixEvent,
10621053
) {
@@ -1183,7 +1174,7 @@ class CreationGrouper extends BaseGrouper {
11831174
onToggle={panel.onHeightChanged} // Update scroll state
11841175
summaryMembers={[ev.sender]}
11851176
summaryText={summaryText}
1186-
layout={this.layout}
1177+
layout={this.panel.props.layout}
11871178
>
11881179
{ eventTiles }
11891180
</GenericEventListSummary>,
@@ -1226,11 +1217,10 @@ class MainGrouper extends BaseGrouper {
12261217
public readonly event: MatrixEvent,
12271218
public readonly prevEvent: MatrixEvent,
12281219
public readonly lastShownEvent: MatrixEvent,
1229-
protected readonly layout: Layout,
12301220
nextEvent: MatrixEvent,
12311221
nextEventTile: MatrixEvent,
12321222
) {
1233-
super(panel, event, prevEvent, lastShownEvent, layout, nextEvent, nextEventTile);
1223+
super(panel, event, prevEvent, lastShownEvent, nextEvent, nextEventTile);
12341224
this.events = [event];
12351225
}
12361226

@@ -1296,15 +1286,18 @@ class MainGrouper extends BaseGrouper {
12961286
const key = "eventlistsummary-" + (this.prevEvent ? this.events[0].getId() : "initial");
12971287

12981288
let highlightInSummary = false;
1299-
let eventTiles = this.events.map((e) => {
1289+
let eventTiles = this.events.map((e, i) => {
13001290
if (e.getId() === panel.props.highlightedEventId) {
13011291
highlightInSummary = true;
13021292
}
1303-
// In order to prevent DateSeparators from appearing in the expanded form
1304-
// of EventListSummary, render each member event as if the previous
1305-
// one was itself. This way, the timestamp of the previous event === the
1306-
// timestamp of the current event, and no DateSeparator is inserted.
1307-
return panel.getTilesForEvent(e, e, e === lastShownEvent, isGrouped, this.nextEvent, this.nextEventTile);
1293+
return panel.getTilesForEvent(
1294+
i === 0 ? this.prevEvent : this.events[i - 1],
1295+
e,
1296+
e === lastShownEvent,
1297+
isGrouped,
1298+
this.nextEvent,
1299+
this.nextEventTile,
1300+
);
13081301
}).reduce((a, b) => a.concat(b), []);
13091302

13101303
if (eventTiles.length === 0) {
@@ -1323,7 +1316,7 @@ class MainGrouper extends BaseGrouper {
13231316
events={this.events}
13241317
onToggle={panel.onHeightChanged} // Update scroll state
13251318
startExpanded={highlightInSummary}
1326-
layout={this.layout}
1319+
layout={this.panel.props.layout}
13271320
>
13281321
{ eventTiles }
13291322
</EventListSummary>,
@@ -1337,7 +1330,7 @@ class MainGrouper extends BaseGrouper {
13371330
}
13381331

13391332
public getNewPrevEvent(): MatrixEvent {
1340-
return this.events[0];
1333+
return this.events[this.events.length - 1];
13411334
}
13421335
}
13431336

src/components/views/elements/EventListSummary.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { jsxJoin } from '../../../utils/ReactUtils';
3131
import { Layout } from '../../../settings/enums/Layout';
3232
import RightPanelStore from '../../../stores/right-panel/RightPanelStore';
3333
import AccessibleButton from './AccessibleButton';
34+
import RoomContext from "../../../contexts/RoomContext";
3435

3536
const onPinnedMessagesClick = (): void => {
3637
RightPanelStore.instance.setCard({ phase: RightPanelPhases.PinnedMessages }, false);
@@ -80,6 +81,9 @@ const SEP = ",";
8081

8182
@replaceableComponent("views.elements.EventListSummary")
8283
export default class EventListSummary extends React.Component<IProps> {
84+
static contextType = RoomContext;
85+
public context!: React.ContextType<typeof RoomContext>;
86+
8387
static defaultProps = {
8488
summaryLength: 1,
8589
threshold: 3,
@@ -477,25 +481,37 @@ export default class EventListSummary extends React.Component<IProps> {
477481
const userEvents: Record<string, IUserEvents[]> = {};
478482
eventsToRender.forEach((e, index) => {
479483
const type = e.getType();
480-
const userId = type === EventType.RoomServerAcl ? e.getSender() : e.getStateKey();
484+
485+
let userId = e.getSender();
486+
if (type === EventType.RoomMember) {
487+
userId = e.getStateKey();
488+
} else if (e.isRedacted()) {
489+
userId = e.getUnsigned()?.redacted_because?.sender;
490+
}
491+
481492
// Initialise a user's events
482493
if (!userEvents[userId]) {
483494
userEvents[userId] = [];
484495
}
485496

486-
if (e.target && TARGET_AS_DISPLAY_NAME_EVENTS.includes(type as EventType)) {
487-
latestUserAvatarMember.set(userId, e.target);
488-
} else if (e.sender) {
489-
latestUserAvatarMember.set(userId, e.sender);
490-
}
491-
492497
let displayName = userId;
493498
if (type === EventType.RoomThirdPartyInvite) {
494499
displayName = e.getContent().display_name;
500+
if (e.sender) {
501+
latestUserAvatarMember.set(userId, e.sender);
502+
}
503+
} else if (e.isRedacted()) {
504+
const sender = this.context?.room.getMember(userId);
505+
if (sender) {
506+
displayName = sender.name;
507+
latestUserAvatarMember.set(userId, sender);
508+
}
495509
} else if (e.target && TARGET_AS_DISPLAY_NAME_EVENTS.includes(type as EventType)) {
496510
displayName = e.target.name;
511+
latestUserAvatarMember.set(userId, e.target);
497512
} else if (e.sender) {
498513
displayName = e.sender.name;
514+
latestUserAvatarMember.set(userId, e.sender);
499515
}
500516

501517
userEvents[userId].push({

src/utils/EventUtils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ export function getEventDisplayInfo(mxEvent: MatrixEvent, hideEvent?: boolean):
226226
!isBubbleMessage &&
227227
!isLeftAlignedBubbleMessage &&
228228
eventType !== EventType.RoomMessage &&
229+
eventType !== EventType.RoomMessageEncrypted &&
229230
eventType !== EventType.Sticker &&
230231
eventType !== EventType.RoomCreate &&
231232
!M_POLL_START.matches(eventType)

0 commit comments

Comments
 (0)