Depile encrypted events to find the most suitable one for preview (#6056)

pull/21833/head
Germain 2021-05-19 13:25:52 +01:00 committed by GitHub
parent a9d0699488
commit 6170403c10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 11 deletions

View File

@ -100,8 +100,10 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
hasUnsentEvents: this.countUnsentEvents() > 0, hasUnsentEvents: this.countUnsentEvents() > 0,
// generatePreview() will return nothing if the user has previews disabled // generatePreview() will return nothing if the user has previews disabled
messagePreview: this.generatePreview(), messagePreview: "",
}; };
this.generatePreview();
this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room); this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room);
this.roomProps = EchoChamber.forRoom(this.props.room); this.roomProps = EchoChamber.forRoom(this.props.room);
if (this.props.resizeNotifier) { if (this.props.resizeNotifier) {
@ -123,7 +125,7 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
private onResize = () => { private onResize = () => {
if (this.showMessagePreview && !this.state.messagePreview) { if (this.showMessagePreview && !this.state.messagePreview) {
this.setState({messagePreview: this.generatePreview()}); this.generatePreview();
} }
}; };
@ -147,7 +149,7 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
public componentDidUpdate(prevProps: Readonly<IProps>, prevState: Readonly<IState>) { public componentDidUpdate(prevProps: Readonly<IProps>, prevState: Readonly<IState>) {
if (prevProps.showMessagePreview !== this.props.showMessagePreview && this.showMessagePreview) { if (prevProps.showMessagePreview !== this.props.showMessagePreview && this.showMessagePreview) {
this.setState({messagePreview: this.generatePreview()}); this.generatePreview();
} }
if (prevProps.room?.roomId !== this.props.room?.roomId) { if (prevProps.room?.roomId !== this.props.room?.roomId) {
MessagePreviewStore.instance.off( MessagePreviewStore.instance.off(
@ -236,17 +238,17 @@ export default class RoomTile extends React.PureComponent<IProps, IState> {
private onRoomPreviewChanged = (room: Room) => { private onRoomPreviewChanged = (room: Room) => {
if (this.props.room && room.roomId === this.props.room.roomId) { if (this.props.room && room.roomId === this.props.room.roomId) {
// generatePreview() will return nothing if the user has previews disabled this.generatePreview();
this.setState({messagePreview: this.generatePreview()});
} }
}; };
private generatePreview(): string | null { private async generatePreview() {
if (!this.showMessagePreview) { if (!this.showMessagePreview) {
return null; return null;
} }
return MessagePreviewStore.instance.getPreviewForRoom(this.props.room, this.props.tag); const messagePreview = await MessagePreviewStore.instance.getPreviewForRoom(this.props.room, this.props.tag);
this.setState({ messagePreview });
} }
private scrollIntoView = () => { private scrollIntoView = () => {

View File

@ -94,10 +94,10 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
* @param inTagId The tag ID in which the room resides * @param inTagId The tag ID in which the room resides
* @returns The preview, or null if none present. * @returns The preview, or null if none present.
*/ */
public getPreviewForRoom(room: Room, inTagId: TagID): string { public async getPreviewForRoom(room: Room, inTagId: TagID): Promise<string> {
if (!room) return null; // invalid room, just return nothing if (!room) return null; // invalid room, just return nothing
if (!this.previews.has(room.roomId)) this.generatePreview(room, inTagId); if (!this.previews.has(room.roomId)) await this.generatePreview(room, inTagId);
const previews = this.previews.get(room.roomId); const previews = this.previews.get(room.roomId);
if (!previews) return null; if (!previews) return null;
@ -108,7 +108,7 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
return previews.get(inTagId); return previews.get(inTagId);
} }
private generatePreview(room: Room, tagId?: TagID) { private async generatePreview(room: Room, tagId?: TagID) {
const events = room.timeline; const events = room.timeline;
if (!events) return; // should only happen in tests if (!events) return; // should only happen in tests
@ -130,6 +130,9 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
} }
const event = events[i]; const event = events[i];
await this.matrixClient.decryptEventIfNeeded(event);
const previewDef = PREVIEWS[event.getType()]; const previewDef = PREVIEWS[event.getType()];
if (!previewDef) continue; if (!previewDef) continue;
if (previewDef.isState && isNullOrUndefined(event.getStateKey())) continue; if (previewDef.isState && isNullOrUndefined(event.getStateKey())) continue;
@ -174,7 +177,7 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> {
if (payload.action === 'MatrixActions.Room.timeline' || payload.action === 'MatrixActions.Event.decrypted') { if (payload.action === 'MatrixActions.Room.timeline' || payload.action === 'MatrixActions.Event.decrypted') {
const event = payload.event; // TODO: Type out the dispatcher const event = payload.event; // TODO: Type out the dispatcher
if (!this.previews.has(event.getRoomId())) return; // not important if (!this.previews.has(event.getRoomId())) return; // not important
this.generatePreview(this.matrixClient.getRoom(event.getRoomId()), TAG_ANY); await this.generatePreview(this.matrixClient.getRoom(event.getRoomId()), TAG_ANY);
} }
} }
} }