From 59b9d1e8189b00bde440c30a962d141a1ebfa5a0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 13 May 2022 12:59:50 +0100 Subject: [PATCH] Don't consider threads for breaking continuation until actually created (#8581) * Don't consider threads for breaking continuation until they've actually been created * Update tests * Make hasThreadSummary null thread safe * Apply feedback from pr review --- src/components/structures/MessagePanel.tsx | 3 ++- src/utils/EventUtils.ts | 4 ++++ test/components/structures/MessagePanel-test.js | 10 +++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/structures/MessagePanel.tsx b/src/components/structures/MessagePanel.tsx index 1a403ba506..f0344727b6 100644 --- a/src/components/structures/MessagePanel.tsx +++ b/src/components/structures/MessagePanel.tsx @@ -56,6 +56,7 @@ import { getEventDisplayInfo } from "../../utils/EventRenderingUtils"; import { IReadReceiptInfo } from "../views/rooms/ReadReceiptMarker"; import { haveRendererForEvent } from "../../events/EventTileFactory"; import { editorRoomKey } from "../../Editing"; +import { hasThreadSummary } from "../../utils/EventUtils"; const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes const continuedTypes = [EventType.Sticker, EventType.RoomMessage]; @@ -96,7 +97,7 @@ export function shouldFormContinuation( // Thread summaries in the main timeline should break up a continuation on both sides if (threadsEnabled && - (mxEvent.isThreadRoot || prevEvent.isThreadRoot) && + (hasThreadSummary(mxEvent) || hasThreadSummary(prevEvent)) && timelineRenderingType !== TimelineRenderingType.Thread ) { return false; diff --git a/src/utils/EventUtils.ts b/src/utils/EventUtils.ts index 57df815ca3..34e24340fc 100644 --- a/src/utils/EventUtils.ts +++ b/src/utils/EventUtils.ts @@ -280,3 +280,7 @@ export function canForward(event: MatrixEvent): boolean { M_POLL_START.matches(event.getType()) ); } + +export function hasThreadSummary(event: MatrixEvent): boolean { + return event.isThreadRoot && event.getThread()?.length && !!event.getThread().replyToEvent; +} diff --git a/test/components/structures/MessagePanel-test.js b/test/components/structures/MessagePanel-test.js index 769e90c9bb..c511dd63a6 100644 --- a/test/components/structures/MessagePanel-test.js +++ b/test/components/structures/MessagePanel-test.js @@ -699,7 +699,7 @@ describe('MessagePanel', function() { }); describe("shouldFormContinuation", () => { - it("does not form continuations from thread roots", () => { + it("does not form continuations from thread roots which have summaries", () => { const message1 = TestUtilsMatrix.mkMessage({ event: true, room: "!room:id", @@ -730,6 +730,14 @@ describe("shouldFormContinuation", () => { }); expect(shouldFormContinuation(message1, message2, false, true)).toEqual(true); + expect(shouldFormContinuation(message2, threadRoot, false, true)).toEqual(true); + expect(shouldFormContinuation(threadRoot, message3, false, true)).toEqual(true); + + const thread = { + length: 1, + replyToEvent: {}, + }; + jest.spyOn(threadRoot, "getThread").mockReturnValue(thread); expect(shouldFormContinuation(message2, threadRoot, false, true)).toEqual(false); expect(shouldFormContinuation(threadRoot, message3, false, true)).toEqual(false); });