From 13aa610cd2077dbfcb3179b4289b3fe8cbf2c2a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 11 May 2022 17:03:17 +0200 Subject: [PATCH] Fix room history not being visible even if we have historical keys (#8563) --- src/components/structures/TimelinePanel.tsx | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index 89dc9792603..1eed9059023 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -24,7 +24,7 @@ import { TimelineWindow } from "matrix-js-sdk/src/timeline-window"; import { EventType, RelationType } from 'matrix-js-sdk/src/@types/event'; import { SyncState } from 'matrix-js-sdk/src/sync'; import { RoomMember, RoomMemberEvent } from 'matrix-js-sdk/src/models/room-member'; -import { debounce } from 'lodash'; +import { debounce, throttle } from 'lodash'; import { logger } from "matrix-js-sdk/src/logger"; import { ClientEvent } from "matrix-js-sdk/src/client"; import { Thread } from 'matrix-js-sdk/src/models/thread'; @@ -808,16 +808,20 @@ class TimelinePanel extends React.Component { // Can be null for the notification timeline, etc. if (!this.props.timelineSet.room) return; + if (ev.getRoomId() !== this.props.timelineSet.room.roomId) return; + + if (!this.state.events.includes(ev)) return; + + this.recheckFirstVisibleEventIndex(); + // Need to update as we don't display event tiles for events that // haven't yet been decrypted. The event will have just been updated // in place so we just need to re-render. // TODO: We should restrict this to only events in our timeline, // but possibly the event tile itself should just update when this // happens to save us re-rendering the whole timeline. - if (ev.getRoomId() === this.props.timelineSet.room.roomId) { - this.buildCallEventGroupers(this.state.events); - this.forceUpdate(); - } + this.buildCallEventGroupers(this.state.events); + this.forceUpdate(); }; private onSync = (clientSyncState: SyncState, prevState: SyncState, data: object): void => { @@ -825,6 +829,13 @@ class TimelinePanel extends React.Component { this.setState({ clientSyncState }); }; + private recheckFirstVisibleEventIndex = throttle((): void => { + const firstVisibleEventIndex = this.checkForPreJoinUISI(this.state.events); + if (firstVisibleEventIndex !== this.state.firstVisibleEventIndex) { + this.setState({ firstVisibleEventIndex }); + } + }, 500, { leading: true, trailing: true }); + private readMarkerTimeout(readMarkerPosition: number): number { return readMarkerPosition === 0 ? this.context?.readMarkerInViewThresholdMs ?? this.state.readMarkerInViewThresholdMs :