Skip to content

Commit 9c48487

Browse files
authored
Prefer MatrixClientContext over MatrixClientPeg (matrix-org#10986)
1 parent b40f29f commit 9c48487

20 files changed

+120
-87
lines changed

src/components/structures/UserView.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
2020
import { RoomMember } from "matrix-js-sdk/src/models/room-member";
2121
import { MatrixClient } from "matrix-js-sdk/src/matrix";
2222

23-
import { MatrixClientPeg } from "../../MatrixClientPeg";
2423
import Modal from "../../Modal";
2524
import { _t } from "../../languageHandler";
2625
import ErrorDialog from "../views/dialogs/ErrorDialog";
@@ -30,6 +29,7 @@ import Spinner from "../views/elements/Spinner";
3029
import ResizeNotifier from "../../utils/ResizeNotifier";
3130
import { RightPanelPhases } from "../../stores/right-panel/RightPanelStorePhases";
3231
import { UserOnboardingPage } from "../views/user-onboarding/UserOnboardingPage";
32+
import MatrixClientContext from "../../contexts/MatrixClientContext";
3333

3434
interface IProps {
3535
userId: string;
@@ -42,6 +42,9 @@ interface IState {
4242
}
4343

4444
export default class UserView extends React.Component<IProps, IState> {
45+
public static contextType = MatrixClientContext;
46+
public context!: React.ContextType<typeof MatrixClientContext>;
47+
4548
public constructor(props: IProps) {
4649
super(props);
4750
this.state = {
@@ -65,11 +68,10 @@ export default class UserView extends React.Component<IProps, IState> {
6568
}
6669

6770
private async loadProfileInfo(): Promise<void> {
68-
const cli = MatrixClientPeg.get();
6971
this.setState({ loading: true });
7072
let profileInfo: Awaited<ReturnType<MatrixClient["getProfileInfo"]>>;
7173
try {
72-
profileInfo = await cli.getProfileInfo(this.props.userId);
74+
profileInfo = await this.context.getProfileInfo(this.props.userId);
7375
} catch (err) {
7476
Modal.createDialog(ErrorDialog, {
7577
title: _t("Could not load user profile"),

src/components/views/messages/EditHistoryMessage.tsx

+9-5
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ import { formatTime } from "../../../DateUtils";
2525
import { pillifyLinks, unmountPills } from "../../../utils/pillify";
2626
import { tooltipifyLinks, unmountTooltips } from "../../../utils/tooltipify";
2727
import { _t } from "../../../languageHandler";
28-
import { MatrixClientPeg } from "../../../MatrixClientPeg";
2928
import Modal from "../../../Modal";
3029
import RedactedBody from "./RedactedBody";
3130
import AccessibleButton from "../elements/AccessibleButton";
3231
import ConfirmAndWaitRedactDialog from "../dialogs/ConfirmAndWaitRedactDialog";
3332
import ViewSource from "../../structures/ViewSource";
3433
import SettingsStore from "../../../settings/SettingsStore";
34+
import MatrixClientContext from "../../../contexts/MatrixClientContext";
3535

3636
function getReplacedContent(event: MatrixEvent): IContent {
3737
const originalContent = event.getOriginalContent();
@@ -52,14 +52,18 @@ interface IState {
5252
}
5353

5454
export default class EditHistoryMessage extends React.PureComponent<IProps, IState> {
55+
public static contextType = MatrixClientContext;
56+
public context!: React.ContextType<typeof MatrixClientContext>;
57+
5558
private content = createRef<HTMLDivElement>();
5659
private pills: Element[] = [];
5760
private tooltips: Element[] = [];
5861

59-
public constructor(props: IProps) {
62+
public constructor(props: IProps, context: React.ContextType<typeof MatrixClientContext>) {
6063
super(props);
64+
this.context = context;
6165

62-
const cli = MatrixClientPeg.get();
66+
const cli = this.context;
6367
const userId = cli.getSafeUserId();
6468
const event = this.props.mxEvent;
6569
const room = cli.getRoom(event.getRoomId());
@@ -74,7 +78,7 @@ export default class EditHistoryMessage extends React.PureComponent<IProps, ISta
7478

7579
private onRedactClick = async (): Promise<void> => {
7680
const event = this.props.mxEvent;
77-
const cli = MatrixClientPeg.get();
81+
const cli = this.context;
7882

7983
Modal.createDialog(
8084
ConfirmAndWaitRedactDialog,
@@ -102,7 +106,7 @@ export default class EditHistoryMessage extends React.PureComponent<IProps, ISta
102106
private pillifyLinks(): void {
103107
// not present for redacted events
104108
if (this.content.current) {
105-
pillifyLinks(MatrixClientPeg.get(), this.content.current.children, this.props.mxEvent, this.pills);
109+
pillifyLinks(this.context, this.content.current.children, this.props.mxEvent, this.pills);
106110
}
107111
}
108112

src/components/views/right_panel/EncryptionPanel.tsx

+4-6
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ import { User } from "matrix-js-sdk/src/models/user";
2727

2828
import EncryptionInfo from "./EncryptionInfo";
2929
import VerificationPanel from "./VerificationPanel";
30-
import { MatrixClientPeg } from "../../../MatrixClientPeg";
3130
import { ensureDMExists } from "../../../createRoom";
3231
import { useTypedEventEmitter } from "../../../hooks/useEventEmitter";
3332
import Modal from "../../../Modal";
3433
import { _t } from "../../../languageHandler";
3534
import { RightPanelPhases } from "../../../stores/right-panel/RightPanelStorePhases";
3635
import RightPanelStore from "../../../stores/right-panel/RightPanelStore";
3736
import ErrorDialog from "../dialogs/ErrorDialog";
37+
import { useMatrixClientContext } from "../../../contexts/MatrixClientContext";
3838

3939
// cancellation codes which constitute a key mismatch
4040
const MISMATCHES = ["m.key_mismatch", "m.user_error", "m.mismatched_sas"];
@@ -49,6 +49,7 @@ interface IProps {
4949
}
5050

5151
const EncryptionPanel: React.FC<IProps> = (props: IProps) => {
52+
const cli = useMatrixClientContext();
5253
const { verificationRequest, verificationRequestPromise, member, onClose, layout, isRoomEncrypted } = props;
5354
const [request, setRequest] = useState(verificationRequest);
5455
// state to show a spinner immediately after clicking "start verification",
@@ -106,7 +107,6 @@ const EncryptionPanel: React.FC<IProps> = (props: IProps) => {
106107

107108
const onStartVerification = useCallback(async (): Promise<void> => {
108109
setRequesting(true);
109-
const cli = MatrixClientPeg.get();
110110
let verificationRequest_: VerificationRequest;
111111
try {
112112
const roomId = await ensureDMExists(cli, member.userId);
@@ -135,14 +135,12 @@ const EncryptionPanel: React.FC<IProps> = (props: IProps) => {
135135
});
136136
}
137137
if (!RightPanelStore.instance.isOpen) RightPanelStore.instance.togglePanel(null);
138-
}, [member]);
138+
}, [cli, member]);
139139

140140
const requested: boolean =
141141
(!request && isRequesting) ||
142142
(!!request && (phase === PHASE_REQUESTED || phase === PHASE_UNSENT || phase === undefined));
143-
const isSelfVerification = request
144-
? request.isSelfVerification
145-
: member.userId === MatrixClientPeg.get().getUserId();
143+
const isSelfVerification = request ? request.isSelfVerification : member.userId === cli.getUserId();
146144

147145
if (!request || requested) {
148146
const initiatedByMe = (!request && isRequesting) || (!!request && request.initiatedByMe);

src/components/views/settings/tabs/room/BridgeSettingsTab.tsx

+7-4
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ limitations under the License.
1717
import React, { ReactNode } from "react";
1818
import { Room } from "matrix-js-sdk/src/models/room";
1919
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
20+
import { MatrixClient } from "matrix-js-sdk/src/matrix";
2021

2122
import { _t } from "../../../../../languageHandler";
22-
import { MatrixClientPeg } from "../../../../../MatrixClientPeg";
2323
import BridgeTile from "../../BridgeTile";
2424
import SettingsTab from "../SettingsTab";
2525
import { SettingsSection } from "../../shared/SettingsSection";
26+
import MatrixClientContext from "../../../../../contexts/MatrixClientContext";
2627

2728
const BRIDGE_EVENT_TYPES = [
2829
"uk.half-shot.bridge",
@@ -36,14 +37,16 @@ interface IProps {
3637
}
3738

3839
export default class BridgeSettingsTab extends React.Component<IProps> {
40+
public static contextType = MatrixClientContext;
41+
public context!: React.ContextType<typeof MatrixClientContext>;
42+
3943
private renderBridgeCard(event: MatrixEvent, room: Room | null): ReactNode {
4044
const content = event.getContent();
4145
if (!room || !content?.channel || !content.protocol) return null;
4246
return <BridgeTile key={event.getId()} room={room} ev={event} />;
4347
}
4448

45-
public static getBridgeStateEvents(roomId: string): MatrixEvent[] {
46-
const client = MatrixClientPeg.get();
49+
public static getBridgeStateEvents(client: MatrixClient, roomId: string): MatrixEvent[] {
4750
const roomState = client.getRoom(roomId)?.currentState;
4851
if (!roomState) return [];
4952

@@ -53,7 +56,7 @@ export default class BridgeSettingsTab extends React.Component<IProps> {
5356
public render(): React.ReactNode {
5457
// This settings tab will only be invoked if the following function returns more
5558
// than 0 events, so no validation is needed at this stage.
56-
const bridgeEvents = BridgeSettingsTab.getBridgeStateEvents(this.props.room.roomId);
59+
const bridgeEvents = BridgeSettingsTab.getBridgeStateEvents(this.context, this.props.room.roomId);
5760
const room = this.props.room;
5861

5962
let content: JSX.Element;

src/components/views/settings/tabs/room/NotificationSettingsTab.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import React, { createRef } from "react";
1818
import { logger } from "matrix-js-sdk/src/logger";
1919

2020
import { _t } from "../../../../../languageHandler";
21-
import { MatrixClientPeg } from "../../../../../MatrixClientPeg";
2221
import AccessibleButton, { ButtonEvent } from "../../../elements/AccessibleButton";
2322
import Notifier from "../../../../../Notifier";
2423
import SettingsStore from "../../../../../settings/SettingsStore";
@@ -116,7 +115,7 @@ export default class NotificationsSettingsTab extends React.Component<IProps, IS
116115
type = "audio/ogg";
117116
}
118117

119-
const { content_uri: url } = await MatrixClientPeg.get().uploadContent(this.state.uploadedFile, {
118+
const { content_uri: url } = await this.context.uploadContent(this.state.uploadedFile, {
120119
type,
121120
});
122121

src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx

+18-14
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import { IContent } from "matrix-js-sdk/src/models/event";
2525
import { Room } from "matrix-js-sdk/src/matrix";
2626

2727
import { _t, _td } from "../../../../../languageHandler";
28-
import { MatrixClientPeg } from "../../../../../MatrixClientPeg";
2928
import AccessibleButton from "../../../elements/AccessibleButton";
3029
import Modal from "../../../../../Modal";
3130
import ErrorDialog from "../../../dialogs/ErrorDialog";
@@ -38,6 +37,7 @@ import SdkConfig, { DEFAULTS } from "../../../../../SdkConfig";
3837
import { AddPrivilegedUsers } from "../../AddPrivilegedUsers";
3938
import SettingsTab from "../SettingsTab";
4039
import { SettingsSection } from "../../shared/SettingsSection";
40+
import MatrixClientContext from "../../../../../contexts/MatrixClientContext";
4141

4242
interface IEventShowOpts {
4343
isState?: boolean;
@@ -91,16 +91,17 @@ interface IBannedUserProps {
9191
}
9292

9393
export class BannedUser extends React.Component<IBannedUserProps> {
94+
public static contextType = MatrixClientContext;
95+
public context!: React.ContextType<typeof MatrixClientContext>;
96+
9497
private onUnbanClick = (): void => {
95-
MatrixClientPeg.get()
96-
.unban(this.props.member.roomId, this.props.member.userId)
97-
.catch((err) => {
98-
logger.error("Failed to unban: " + err);
99-
Modal.createDialog(ErrorDialog, {
100-
title: _t("Error"),
101-
description: _t("Failed to unban"),
102-
});
98+
this.context.unban(this.props.member.roomId, this.props.member.userId).catch((err) => {
99+
logger.error("Failed to unban: " + err);
100+
Modal.createDialog(ErrorDialog, {
101+
title: _t("Error"),
102+
description: _t("Failed to unban"),
103103
});
104+
});
104105
};
105106

106107
public render(): React.ReactNode {
@@ -136,12 +137,15 @@ interface IProps {
136137
}
137138

138139
export default class RolesRoomSettingsTab extends React.Component<IProps> {
140+
public static contextType = MatrixClientContext;
141+
public context!: React.ContextType<typeof MatrixClientContext>;
142+
139143
public componentDidMount(): void {
140-
MatrixClientPeg.get().on(RoomStateEvent.Update, this.onRoomStateUpdate);
144+
this.context.on(RoomStateEvent.Update, this.onRoomStateUpdate);
141145
}
142146

143147
public componentWillUnmount(): void {
144-
const client = MatrixClientPeg.get();
148+
const client = this.context;
145149
if (client) {
146150
client.removeListener(RoomStateEvent.Update, this.onRoomStateUpdate);
147151
}
@@ -173,7 +177,7 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> {
173177
}
174178

175179
private onPowerLevelsChanged = (value: number, powerLevelKey: string): void => {
176-
const client = MatrixClientPeg.get();
180+
const client = this.context;
177181
const room = this.props.room;
178182
const plEvent = room.currentState.getStateEvents(EventType.RoomPowerLevels, "");
179183
let plContent = plEvent?.getContent() ?? {};
@@ -215,7 +219,7 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> {
215219
};
216220

217221
private onUserPowerLevelChanged = (value: number, powerLevelKey: string): void => {
218-
const client = MatrixClientPeg.get();
222+
const client = this.context;
219223
const room = this.props.room;
220224
const plEvent = room.currentState.getStateEvents(EventType.RoomPowerLevels, "");
221225
let plContent = plEvent?.getContent() ?? {};
@@ -241,7 +245,7 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> {
241245
};
242246

243247
public render(): React.ReactNode {
244-
const client = MatrixClientPeg.get();
248+
const client = this.context;
245249
const room = this.props.room;
246250
const isSpaceRoom = room.isSpaceRoom();
247251

src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx

+13-11
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import { RoomState } from "matrix-js-sdk/src/models/room-state";
2121
import { Room } from "matrix-js-sdk/src/matrix";
2222

2323
import { _t } from "../../../../../languageHandler";
24-
import { MatrixClientPeg } from "../../../../../MatrixClientPeg";
2524
import LabelledToggleSwitch from "../../../elements/LabelledToggleSwitch";
2625
import SettingsSubsection from "../../shared/SettingsSubsection";
2726
import SettingsTab from "../SettingsTab";
@@ -38,14 +37,17 @@ const ElementCallSwitch: React.FC<ElementCallSwitchProps> = ({ room }) => {
3837
const isPublic = useMemo(() => room.getJoinRule() === JoinRule.Public, [room]);
3938
const [content, events, maySend] = useRoomState(
4039
room,
41-
useCallback((state: RoomState) => {
42-
const content = state?.getStateEvents(EventType.RoomPowerLevels, "")?.getContent();
43-
return [
44-
content ?? {},
45-
content?.["events"] ?? {},
46-
state?.maySendStateEvent(EventType.RoomPowerLevels, MatrixClientPeg.get().getSafeUserId()),
47-
];
48-
}, []),
40+
useCallback(
41+
(state: RoomState) => {
42+
const content = state?.getStateEvents(EventType.RoomPowerLevels, "")?.getContent();
43+
return [
44+
content ?? {},
45+
content?.["events"] ?? {},
46+
state?.maySendStateEvent(EventType.RoomPowerLevels, room.client.getSafeUserId()),
47+
];
48+
},
49+
[room.client],
50+
),
4951
);
5052

5153
const [elementCallEnabled, setElementCallEnabled] = useState<boolean>(() => {
@@ -69,12 +71,12 @@ const ElementCallSwitch: React.FC<ElementCallSwitchProps> = ({ room }) => {
6971
events[ElementCall.MEMBER_EVENT_TYPE.name] = adminLevel;
7072
}
7173

72-
MatrixClientPeg.get().sendStateEvent(room.roomId, EventType.RoomPowerLevels, {
74+
room.client.sendStateEvent(room.roomId, EventType.RoomPowerLevels, {
7375
events: events,
7476
...content,
7577
});
7678
},
77-
[room.roomId, content, events, isPublic],
79+
[room.client, room.roomId, content, events, isPublic],
7880
);
7981

8082
const brand = SdkConfig.get("element_call").brand ?? DEFAULTS.element_call.brand;

src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import React, { ChangeEvent, ReactNode } from "react";
1919

2020
import { _t } from "../../../../../languageHandler";
2121
import SdkConfig from "../../../../../SdkConfig";
22-
import { MatrixClientPeg } from "../../../../../MatrixClientPeg";
2322
import SettingsStore from "../../../../../settings/SettingsStore";
2423
import SettingsFlag from "../../../elements/SettingsFlag";
2524
import Field from "../../../elements/Field";
@@ -34,6 +33,7 @@ import ImageSizePanel from "../../ImageSizePanel";
3433
import SettingsTab from "../SettingsTab";
3534
import { SettingsSection } from "../../shared/SettingsSection";
3635
import SettingsSubsection, { SettingsSubsectionText } from "../../shared/SettingsSubsection";
36+
import MatrixClientContext from "../../../../../contexts/MatrixClientContext";
3737

3838
interface IProps {}
3939

@@ -49,6 +49,9 @@ interface IState {
4949
}
5050

5151
export default class AppearanceUserSettingsTab extends React.Component<IProps, IState> {
52+
public static contextType = MatrixClientContext;
53+
public context!: React.ContextType<typeof MatrixClientContext>;
54+
5255
private readonly MESSAGE_PREVIEW_TEXT = _t("Hey you. You're the best!");
5356

5457
private unmounted = false;
@@ -66,7 +69,7 @@ export default class AppearanceUserSettingsTab extends React.Component<IProps, I
6669

6770
public async componentDidMount(): Promise<void> {
6871
// Fetch the current user profile for the message preview
69-
const client = MatrixClientPeg.get();
72+
const client = this.context;
7073
const userId = client.getUserId()!;
7174
const profileInfo = await client.getProfileInfo(userId);
7275
if (this.unmounted) return;

0 commit comments

Comments
 (0)