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

Commit 6170403

Browse files
authored
Depile encrypted events to find the most suitable one for preview (#6056)
1 parent a9d0699 commit 6170403

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

src/components/views/rooms/RoomTile.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
100100
hasUnsentEvents: this.countUnsentEvents() > 0,
101101

102102
// generatePreview() will return nothing if the user has previews disabled
103-
messagePreview: this.generatePreview(),
103+
messagePreview: "",
104104
};
105+
this.generatePreview();
106+
105107
this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room);
106108
this.roomProps = EchoChamber.forRoom(this.props.room);
107109
if (this.props.resizeNotifier) {
@@ -123,7 +125,7 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
123125

124126
private onResize = () => {
125127
if (this.showMessagePreview && !this.state.messagePreview) {
126-
this.setState({messagePreview: this.generatePreview()});
128+
this.generatePreview();
127129
}
128130
};
129131

@@ -147,7 +149,7 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
147149

148150
public componentDidUpdate(prevProps: Readonly<IProps>, prevState: Readonly<IState>) {
149151
if (prevProps.showMessagePreview !== this.props.showMessagePreview && this.showMessagePreview) {
150-
this.setState({messagePreview: this.generatePreview()});
152+
this.generatePreview();
151153
}
152154
if (prevProps.room?.roomId !== this.props.room?.roomId) {
153155
MessagePreviewStore.instance.off(
@@ -236,17 +238,17 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
236238

237239
private onRoomPreviewChanged = (room: Room) => {
238240
if (this.props.room && room.roomId === this.props.room.roomId) {
239-
// generatePreview() will return nothing if the user has previews disabled
240-
this.setState({messagePreview: this.generatePreview()});
241+
this.generatePreview();
241242
}
242243
};
243244

244-
private generatePreview(): string | null {
245+
private async generatePreview() {
245246
if (!this.showMessagePreview) {
246247
return null;
247248
}
248249

249-
return MessagePreviewStore.instance.getPreviewForRoom(this.props.room, this.props.tag);
250+
const messagePreview = await MessagePreviewStore.instance.getPreviewForRoom(this.props.room, this.props.tag);
251+
this.setState({ messagePreview });
250252
}
251253

252254
private scrollIntoView = () => {

src/stores/room-list/MessagePreviewStore.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,10 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
9494
* @param inTagId The tag ID in which the room resides
9595
* @returns The preview, or null if none present.
9696
*/
97-
public getPreviewForRoom(room: Room, inTagId: TagID): string {
97+
public async getPreviewForRoom(room: Room, inTagId: TagID): Promise<string> {
9898
if (!room) return null; // invalid room, just return nothing
9999

100-
if (!this.previews.has(room.roomId)) this.generatePreview(room, inTagId);
100+
if (!this.previews.has(room.roomId)) await this.generatePreview(room, inTagId);
101101

102102
const previews = this.previews.get(room.roomId);
103103
if (!previews) return null;
@@ -108,7 +108,7 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
108108
return previews.get(inTagId);
109109
}
110110

111-
private generatePreview(room: Room, tagId?: TagID) {
111+
private async generatePreview(room: Room, tagId?: TagID) {
112112
const events = room.timeline;
113113
if (!events) return; // should only happen in tests
114114

@@ -130,6 +130,9 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
130130
}
131131

132132
const event = events[i];
133+
134+
await this.matrixClient.decryptEventIfNeeded(event);
135+
133136
const previewDef = PREVIEWS[event.getType()];
134137
if (!previewDef) continue;
135138
if (previewDef.isState && isNullOrUndefined(event.getStateKey())) continue;
@@ -174,7 +177,7 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
174177
if (payload.action === 'MatrixActions.Room.timeline' || payload.action === 'MatrixActions.Event.decrypted') {
175178
const event = payload.event; // TODO: Type out the dispatcher
176179
if (!this.previews.has(event.getRoomId())) return; // not important
177-
this.generatePreview(this.matrixClient.getRoom(event.getRoomId()), TAG_ANY);
180+
await this.generatePreview(this.matrixClient.getRoom(event.getRoomId()), TAG_ANY);
178181
}
179182
}
180183
}

0 commit comments

Comments
 (0)