diff --git a/src/components/structures/ThreadPanel.tsx b/src/components/structures/ThreadPanel.tsx index 245c604c0aff..7d7371e55693 100644 --- a/src/components/structures/ThreadPanel.tsx +++ b/src/components/structures/ThreadPanel.tsx @@ -230,6 +230,7 @@ const ThreadPanel: React.FC = ({ useEffect(() => { if (timelineSet && !Thread.hasServerSideSupport) { + timelineSet.resetLiveTimeline(); timelinePanel.current.refreshTimeline(); } }, [timelineSet, timelinePanel]); diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx index 042b8b3b9246..5b9e28b7b598 100644 --- a/src/components/structures/ThreadView.tsx +++ b/src/components/structures/ThreadView.tsx @@ -20,7 +20,6 @@ import { Room } from 'matrix-js-sdk/src/models/room'; import { IEventRelation, MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { TimelineWindow } from 'matrix-js-sdk/src/timeline-window'; import { Direction } from 'matrix-js-sdk/src/models/event-timeline'; -import { IRelationsRequestOpts } from 'matrix-js-sdk/src/@types/requests'; import { logger } from 'matrix-js-sdk/src/logger'; import classNames from 'classnames'; @@ -195,9 +194,7 @@ export default class ThreadView extends React.Component { thread, }, async () => { thread.emit(ThreadEvent.ViewThread); - await thread.fetchInitialEvents(); - this.nextBatch = thread.liveTimeline.getPaginationToken(Direction.Backward); - this.timelinePanel.current?.refreshTimeline(); + this.timelinePanel.current?.refreshTimeline(this.props.initialEvent?.getId()); }); } }; @@ -242,35 +239,12 @@ export default class ThreadView extends React.Component { } }; - private nextBatch: string; - private onPaginationRequest = async ( timelineWindow: TimelineWindow | null, direction = Direction.Backward, limit = 20, ): Promise => { - if (!Thread.hasServerSideSupport) { - timelineWindow.extend(direction, limit); - return true; - } - - const opts: IRelationsRequestOpts = { - limit, - }; - - if (this.nextBatch) { - opts.from = this.nextBatch; - } - - const { nextBatch } = await this.state.thread.fetchEvents(opts); - - this.nextBatch = nextBatch; - - // Advances the marker on the TimelineWindow to define the correct - // window of events to display on screen - timelineWindow.extend(direction, limit); - - return !!nextBatch; + return timelineWindow.paginate(direction, limit); }; private onFileDrop = (dataTransfer: DataTransfer) => { diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index f0b496f0b7e2..b799c79a951c 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -443,12 +443,8 @@ export class StopGapWidgetDriver extends WidgetDriver { eventId, relationType ?? null, eventType ?? null, - { - from, - to, - limit, - direction: dir, - }); + { from, to, limit, dir }, + ); return { originalEvent: originalEvent?.getEffectiveEvent(), diff --git a/src/utils/EventUtils.ts b/src/utils/EventUtils.ts index d8cf66e55736..5d2dcb2af36e 100644 --- a/src/utils/EventUtils.ts +++ b/src/utils/EventUtils.ts @@ -238,8 +238,12 @@ export async function fetchInitialEvent( ) { const threadId = initialEvent.threadRootId; const room = client.getRoom(roomId); + const mapper = client.getEventMapper(); + const rootEvent = room.findEventById(threadId) + ?? mapper(await client.fetchRoomEvent(roomId, threadId)); try { - room.createThread(threadId, room.findEventById(threadId), [initialEvent], true); + const thread = room.createThread(threadId, rootEvent, [initialEvent], true); + initialEvent.setThread(thread); } catch (e) { logger.warn("Could not find root event: " + threadId); } diff --git a/test/components/views/context_menus/MessageContextMenu-test.tsx b/test/components/views/context_menus/MessageContextMenu-test.tsx index 38c646cfe850..c9ee0b310d25 100644 --- a/test/components/views/context_menus/MessageContextMenu-test.tsx +++ b/test/components/views/context_menus/MessageContextMenu-test.tsx @@ -27,7 +27,7 @@ import { EventType, } from 'matrix-js-sdk/src/matrix'; import { ExtensibleEvent, MessageEvent, M_POLL_KIND_DISCLOSED, PollStartEvent } from 'matrix-events-sdk'; -import { Thread } from "matrix-js-sdk/src/models/thread"; +import { FeatureSupport, Thread } from "matrix-js-sdk/src/models/thread"; import { mocked } from "jest-mock"; import { act } from '@testing-library/react'; @@ -469,7 +469,7 @@ describe('MessageContextMenu', () => { const eventContent = MessageEvent.from("hello"); const mxEvent = new MatrixEvent(eventContent.serialize()); - Thread.hasServerSideSupport = true; + Thread.hasServerSideSupport = FeatureSupport.Experimental; const context = { canSendMessages: true, }; diff --git a/test/components/views/messages/MessageActionBar-test.tsx b/test/components/views/messages/MessageActionBar-test.tsx index d4dcb1a2dff9..5d257d0eb312 100644 --- a/test/components/views/messages/MessageActionBar-test.tsx +++ b/test/components/views/messages/MessageActionBar-test.tsx @@ -25,7 +25,7 @@ import { MsgType, Room, } from 'matrix-js-sdk/src/matrix'; -import { Thread } from 'matrix-js-sdk/src/models/thread'; +import { FeatureSupport, Thread } from 'matrix-js-sdk/src/models/thread'; import MessageActionBar from '../../../../src/components/views/messages/MessageActionBar'; import { @@ -388,13 +388,13 @@ describe('', () => { describe('thread button', () => { beforeEach(() => { - Thread.setServerSideSupport(true, false); + Thread.setServerSideSupport(FeatureSupport.Experimental); }); describe('when threads feature is not enabled', () => { it('does not render thread button when threads does not have server support', () => { jest.spyOn(SettingsStore, 'getValue').mockReturnValue(false); - Thread.setServerSideSupport(false, false); + Thread.setServerSideSupport(FeatureSupport.None); const { queryByLabelText } = getComponent({ mxEvent: alicesMessageEvent }); expect(queryByLabelText('Reply in thread')).toBeFalsy(); });