From a491795aa7edb945ed3757408f7c7f1530afd535 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 Jun 2023 17:08:16 +0100 Subject: [PATCH] Fix RoomView ignoring alias lookup errors due to them not knowing the roomId (#11099) --- src/components/structures/RoomView.tsx | 7 +++-- test/components/structures/RoomView-test.tsx | 23 +++++++++++++-- .../__snapshots__/RoomView-test.tsx.snap | 29 +++++++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 8cb2912620..4ffa336aae 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -519,7 +519,7 @@ export class RoomView extends React.Component { /** * Removes the Jitsi widget from the current user if * - Multiple Jitsi widgets have been added within {@link PREVENT_MULTIPLE_JITSI_WITHIN} - * - The last (server timestamp) of these widgets is from the currrent user + * - The last (server timestamp) of these widgets is from the current user * This solves the issue if some people decide to start a conference and click the call button at the same time. */ private doMaybeRemoveOwnJitsiWidget(): void { @@ -592,7 +592,8 @@ export class RoomView extends React.Component { return; } - if (!initial && this.state.roomId !== this.context.roomViewStore.getRoomId()) { + const roomLoadError = this.context.roomViewStore.getRoomLoadError() ?? undefined; + if (!initial && !roomLoadError && this.state.roomId !== this.context.roomViewStore.getRoomId()) { // RoomView explicitly does not support changing what room // is being viewed: instead it should just be re-mounted when // switching rooms. Therefore, if the room ID changes, we @@ -614,7 +615,7 @@ export class RoomView extends React.Component { roomId: roomId ?? undefined, roomAlias: this.context.roomViewStore.getRoomAlias() ?? undefined, roomLoading: this.context.roomViewStore.isRoomLoading(), - roomLoadError: this.context.roomViewStore.getRoomLoadError() ?? undefined, + roomLoadError, joining: this.context.roomViewStore.isJoining(), replyToEvent: this.context.roomViewStore.getQuotingEvent() ?? undefined, // we should only peek once we have a ready client diff --git a/test/components/structures/RoomView-test.tsx b/test/components/structures/RoomView-test.tsx index 61b987585b..1f3b0b955e 100644 --- a/test/components/structures/RoomView-test.tsx +++ b/test/components/structures/RoomView-test.tsx @@ -19,7 +19,7 @@ import { mocked, MockedObject } from "jest-mock"; import { ClientEvent, MatrixClient } from "matrix-js-sdk/src/client"; import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { EventType, RoomStateEvent } from "matrix-js-sdk/src/matrix"; +import { EventType, MatrixError, RoomStateEvent } from "matrix-js-sdk/src/matrix"; import { MEGOLM_ALGORITHM } from "matrix-js-sdk/src/crypto/olmlib"; import { fireEvent, render, screen, RenderResult } from "@testing-library/react"; @@ -34,6 +34,7 @@ import { filterConsole, mkRoomMemberJoinEvent, mkThirdPartyInviteEvent, + emitPromise, } from "../../test-utils"; import { MatrixClientPeg } from "../../../src/MatrixClientPeg"; import { Action } from "../../../src/dispatcher/actions"; @@ -55,6 +56,7 @@ import VoipUserMapper from "../../../src/VoipUserMapper"; import WidgetUtils from "../../../src/utils/WidgetUtils"; import { WidgetType } from "../../../src/widgets/WidgetType"; import WidgetStore from "../../../src/stores/WidgetStore"; +import { ViewRoomErrorPayload } from "../../../src/dispatcher/payloads/ViewRoomErrorPayload"; // Fake random strings to give a predictable snapshot for IDs jest.mock("matrix-js-sdk/src/randomstring", () => ({ @@ -138,8 +140,8 @@ describe("RoomView", () => { return roomView; }; - const renderRoomView = async (): Promise> => { - if (stores.roomViewStore.getRoomId() !== room.roomId) { + const renderRoomView = async (switchRoom = true): Promise> => { + if (switchRoom && stores.roomViewStore.getRoomId() !== room.roomId) { const switchedRoom = new Promise((resolve) => { const subFn = () => { if (stores.roomViewStore.getRoomId()) { @@ -498,4 +500,19 @@ describe("RoomView", () => { }); }); }); + + it("should show error view if failed to look up room alias", async () => { + const { asFragment, findByText } = await renderRoomView(false); + + defaultDispatcher.dispatch({ + action: Action.ViewRoomError, + room_alias: "#addy:server", + room_id: null, + err: new MatrixError({ errcode: "M_NOT_FOUND" }), + }); + await emitPromise(stores.roomViewStore, UPDATE_EVENT); + + await findByText("Are you sure you're at the right place?"); + expect(asFragment()).toMatchSnapshot(); + }); }); diff --git a/test/components/structures/__snapshots__/RoomView-test.tsx.snap b/test/components/structures/__snapshots__/RoomView-test.tsx.snap index 251a3841b4..81ce09dc72 100644 --- a/test/components/structures/__snapshots__/RoomView-test.tsx.snap +++ b/test/components/structures/__snapshots__/RoomView-test.tsx.snap @@ -809,3 +809,32 @@ exports[`RoomView for a local room in state NEW that is encrypted should match t `; + +exports[`RoomView should show error view if failed to look up room alias 1`] = ` + +
+
+
+

+ #addy:server does not exist. +

+

+ Are you sure you're at the right place? +

+
+
+ +
+ +`;