From 69c4a0cebc6b31e94cf4826860001d3a0854e5fc Mon Sep 17 00:00:00 2001 From: Germain Date: Wed, 15 Dec 2021 12:40:56 +0000 Subject: [PATCH] Fix main timeline pending events bleeding in thread's timeline (#7373) --- src/components/structures/TimelinePanel.tsx | 4 +++- src/components/views/rooms/EventTile.tsx | 2 +- src/stores/notifications/ThreadNotificationState.ts | 5 ++--- src/stores/notifications/ThreadsRoomNotificationState.ts | 9 ++++++++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index ea0492e1fc..f9b5694fa5 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -1222,9 +1222,11 @@ class TimelinePanel extends React.Component { // should use this list, so that they don't advance into pending events. const liveEvents = [...events]; + const thread = events[0]?.getThread(); + // if we're at the end of the live timeline, append the pending events if (!this.timelineWindow.canPaginate(EventTimeline.FORWARDS)) { - events.push(...this.props.timelineSet.getPendingEvents()); + events.push(...this.props.timelineSet.getPendingEvents(thread)); } return { diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 80d5e3bbba..88a2682c90 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -513,7 +513,7 @@ export default class EventTile extends React.Component { const room = this.context.getRoom(this.props.mxEvent.getRoomId()); const notifications = RoomNotificationStateStore.instance.getThreadsRoomState(room); - this.threadState = notifications.threadsState.get(thread); + this.threadState = notifications.getThreadRoomState(thread); this.threadState.on(NotificationStateEvents.Update, this.onThreadStateUpdate); this.onThreadStateUpdate(); diff --git a/src/stores/notifications/ThreadNotificationState.ts b/src/stores/notifications/ThreadNotificationState.ts index aac3153c73..b2f8e26406 100644 --- a/src/stores/notifications/ThreadNotificationState.ts +++ b/src/stores/notifications/ThreadNotificationState.ts @@ -16,7 +16,6 @@ limitations under the License. import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { Thread, ThreadEvent } from "matrix-js-sdk/src/models/thread"; -import { Room } from "matrix-js-sdk/src/models/room"; import { NotificationColor } from "./NotificationColor"; import { IDestroyable } from "../../utils/IDestroyable"; @@ -28,7 +27,7 @@ export class ThreadNotificationState extends NotificationState implements IDestr protected _count = 0; protected _color = NotificationColor.None; - constructor(public readonly room: Room, public readonly thread: Thread) { + constructor(public readonly thread: Thread) { super(); this.thread.on(ThreadEvent.NewReply, this.handleNewThreadReply); this.thread.on(ThreadEvent.ViewThread, this.resetThreadNotification); @@ -46,7 +45,7 @@ export class ThreadNotificationState extends NotificationState implements IDestr const myUserId = client.getUserId(); const isOwn = myUserId === event.getSender(); - const readReceipt = this.room.getReadReceiptForUserId(myUserId); + const readReceipt = this.thread.room.getReadReceiptForUserId(myUserId); if (!isOwn && !readReceipt || event.getTs() >= readReceipt.data.ts) { const actions = client.getPushActionsForEvent(event, true); diff --git a/src/stores/notifications/ThreadsRoomNotificationState.ts b/src/stores/notifications/ThreadsRoomNotificationState.ts index bb3bbad716..9c520873e0 100644 --- a/src/stores/notifications/ThreadsRoomNotificationState.ts +++ b/src/stores/notifications/ThreadsRoomNotificationState.ts @@ -47,8 +47,15 @@ export class ThreadsRoomNotificationState extends NotificationState implements I } } + public getThreadRoomState(thread: Thread): ThreadNotificationState { + if (!this.threadsState.has(thread)) { + this.threadsState.set(thread, new ThreadNotificationState(thread)); + } + return this.threadsState.get(thread); + } + private onNewThread = (thread: Thread): void => { - const notificationState = new ThreadNotificationState(this.room, thread); + const notificationState = new ThreadNotificationState(thread); this.threadsState.set( thread, notificationState,