Fix crashes in when opening Bridges in room settings (#33137)

* use SDKContext for room settings dialog to avoid crash #33107

* format with prettier

* add SDKContext to RoomSettingsDialog test
This commit is contained in:
adis veletanlic
2026-04-17 11:36:40 +00:00
committed by GitHub
parent 1044a95687
commit 73d4b63ada
3 changed files with 28 additions and 17 deletions
@@ -42,6 +42,7 @@ import { type NonEmptyArray } from "../../../@types/common";
import { PollHistoryTab } from "../settings/tabs/room/PollHistoryTab"; import { PollHistoryTab } from "../settings/tabs/room/PollHistoryTab";
import ErrorBoundary from "../elements/ErrorBoundary"; import ErrorBoundary from "../elements/ErrorBoundary";
import { PeopleRoomSettingsTab } from "../settings/tabs/room/PeopleRoomSettingsTab"; import { PeopleRoomSettingsTab } from "../settings/tabs/room/PeopleRoomSettingsTab";
import { SDKContext, type SdkContextClass } from "../../../contexts/SDKContext";
export const enum RoomSettingsTab { export const enum RoomSettingsTab {
General = "ROOM_GENERAL_TAB", General = "ROOM_GENERAL_TAB",
@@ -59,6 +60,7 @@ interface IProps {
roomId: string; roomId: string;
onFinished: (success?: boolean) => void; onFinished: (success?: boolean) => void;
initialTabId?: RoomSettingsTab; initialTabId?: RoomSettingsTab;
sdkContext: SdkContextClass;
} }
interface IState { interface IState {
@@ -238,21 +240,23 @@ class RoomSettingsDialog extends React.Component<IProps, IState> {
public render(): React.ReactNode { public render(): React.ReactNode {
const roomName = this.state.room.name; const roomName = this.state.room.name;
return ( return (
<BaseDialog <SDKContext.Provider value={this.props.sdkContext}>
className="mx_RoomSettingsDialog" <BaseDialog
hasCancel={true} className="mx_RoomSettingsDialog"
onFinished={this.props.onFinished} hasCancel={true}
title={_t("room_settings|title", { roomName })} onFinished={this.props.onFinished}
> title={_t("room_settings|title", { roomName })}
<div className="mx_SettingsDialog_content"> >
<TabbedView <div className="mx_SettingsDialog_content">
tabs={this.getTabs()} <TabbedView
activeTabId={this.state.activeTabId} tabs={this.getTabs()}
screenName="RoomSettings" activeTabId={this.state.activeTabId}
onChange={this.onTabChange} screenName="RoomSettings"
/> onChange={this.onTabChange}
</div> />
</BaseDialog> </div>
</BaseDialog>
</SDKContext.Provider>
); );
} }
} }
+1
View File
@@ -57,6 +57,7 @@ export class DialogOpener {
{ {
roomId: payload.room_id || SdkContextClass.instance.roomViewStore.getRoomId(), roomId: payload.room_id || SdkContextClass.instance.roomViewStore.getRoomId(),
initialTabId: payload.initial_tab_id, initialTabId: payload.initial_tab_id,
sdkContext: SdkContextClass.instance,
}, },
/*className=*/ undefined, /*className=*/ undefined,
/*isPriority=*/ false, /*isPriority=*/ false,
@@ -24,6 +24,7 @@ import MatrixClientContext from "../../../../../src/contexts/MatrixClientContext
import SettingsStore from "../../../../../src/settings/SettingsStore"; import SettingsStore from "../../../../../src/settings/SettingsStore";
import { UIFeature } from "../../../../../src/settings/UIFeature"; import { UIFeature } from "../../../../../src/settings/UIFeature";
import DMRoomMap from "../../../../../src/utils/DMRoomMap"; import DMRoomMap from "../../../../../src/utils/DMRoomMap";
import { SdkContextClass } from "../../../../../src/contexts/SDKContext";
describe("<RoomSettingsDialog />", () => { describe("<RoomSettingsDialog />", () => {
const userId = "@alice:server.org"; const userId = "@alice:server.org";
@@ -43,6 +44,8 @@ describe("<RoomSettingsDialog />", () => {
const room2 = new Room("!room2:server.org", mockClient, userId); const room2 = new Room("!room2:server.org", mockClient, userId);
room2.name = "Another Room"; room2.name = "Another Room";
let sdkContext: SdkContextClass;
jest.spyOn(SettingsStore, "getValue"); jest.spyOn(SettingsStore, "getValue");
beforeEach(() => { beforeEach(() => {
@@ -54,6 +57,9 @@ describe("<RoomSettingsDialog />", () => {
return null; return null;
}); });
sdkContext = new SdkContextClass();
sdkContext.client = mockClient;
jest.spyOn(SettingsStore, "getValue").mockReset().mockReturnValue(false); jest.spyOn(SettingsStore, "getValue").mockReset().mockReturnValue(false);
const dmRoomMap = { const dmRoomMap = {
@@ -63,7 +69,7 @@ describe("<RoomSettingsDialog />", () => {
}); });
const getComponent = (onFinished = jest.fn(), propRoomId = roomId) => const getComponent = (onFinished = jest.fn(), propRoomId = roomId) =>
render(<RoomSettingsDialog roomId={propRoomId} onFinished={onFinished} />, { render(<RoomSettingsDialog roomId={propRoomId} onFinished={onFinished} sdkContext={sdkContext} />, {
wrapper: ({ children }) => ( wrapper: ({ children }) => (
<MatrixClientContext.Provider value={mockClient}>{children}</MatrixClientContext.Provider> <MatrixClientContext.Provider value={mockClient}>{children}</MatrixClientContext.Provider>
), ),
@@ -79,7 +85,7 @@ describe("<RoomSettingsDialog />", () => {
expect(getByText(`Room Settings - ${room.name}`)).toBeInTheDocument(); expect(getByText(`Room Settings - ${room.name}`)).toBeInTheDocument();
rerender(<RoomSettingsDialog roomId={room2.roomId} onFinished={jest.fn()} />); rerender(<RoomSettingsDialog roomId={room2.roomId} onFinished={jest.fn()} sdkContext={sdkContext} />);
expect(getByText(`Room Settings - ${room2.name}`)).toBeInTheDocument(); expect(getByText(`Room Settings - ${room2.name}`)).toBeInTheDocument();
}); });