From 53c97dfa50ab5bb82828212f03c3fae4a670907b Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 11 Feb 2025 20:34:32 +0000 Subject: [PATCH] Don't reload roomview on offline connectivity check (#29243) * Don't reload roomview on offline connectivity check Doesn't look like this was a regression as far as I can see, but you did have to switch rooms while offline for it to start happening. There's no use reloading the room until we're online again. Fixes https://github.com/element-hq/element-web/issues/29072 * Add regression test * Move it down the file to avoid changing the snapshots --- src/components/structures/RoomView.tsx | 5 ++-- .../components/structures/RoomView-test.tsx | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index a64b118c2c..ed54161b35 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -1151,13 +1151,14 @@ export class RoomView extends React.Component { break; case "MatrixActions.sync": if (!this.state.matrixClientIsReady) { + const isReadyNow = Boolean(this.context.client?.isInitialSyncComplete()); this.setState( { - matrixClientIsReady: !!this.context.client?.isInitialSyncComplete(), + matrixClientIsReady: isReadyNow, }, () => { // send another "initial" RVS update to trigger peeking if needed - this.onRoomViewStoreUpdate(true); + if (isReadyNow) this.onRoomViewStoreUpdate(true); }, ); } diff --git a/test/unit-tests/components/structures/RoomView-test.tsx b/test/unit-tests/components/structures/RoomView-test.tsx index 3f60e3564f..70febb2c1b 100644 --- a/test/unit-tests/components/structures/RoomView-test.tsx +++ b/test/unit-tests/components/structures/RoomView-test.tsx @@ -693,6 +693,31 @@ describe("RoomView", () => { expect(defaultDispatcher.dispatch).toHaveBeenCalledWith({ action: Action.RoomLoaded }); }); + // Regression test for https://github.com/element-hq/element-web/issues/29072 + it("does not force a reload on sync unless the client is coming back online", async () => { + cli.isInitialSyncComplete.mockReturnValue(false); + + const instance = await getRoomViewInstance(); + const onRoomViewUpdateMock = jest.fn(); + (instance as any).onRoomViewStoreUpdate = onRoomViewUpdateMock; + + act(() => { + // As if a connectivity check happened (we are still offline) + defaultDispatcher.dispatch({ action: "MatrixActions.sync" }, true); + // ...so it still should not force a reload + expect(onRoomViewUpdateMock).not.toHaveBeenCalledWith(true); + }); + + act(() => { + // set us to online again + cli.isInitialSyncComplete.mockReturnValue(true); + defaultDispatcher.dispatch({ action: "MatrixActions.sync" }, true); + }); + + // It should now force a reload + expect(onRoomViewUpdateMock).toHaveBeenCalledWith(true); + }); + describe("when there is a RoomView", () => { const widget1Id = "widget1"; const widget2Id = "widget2";