Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit ad65b4e

Browse files
authored
Apply strictNullChecks to src/components/views/room_settings/* (#10366
* Apply `strictNullChecks` to `src/components/views/room_settings/*` * Restore tsconfig.json
1 parent e3930fb commit ad65b4e

File tree

4 files changed

+37
-30
lines changed

4 files changed

+37
-30
lines changed

src/components/views/elements/EditableItemList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import Field from "./Field";
2121
import AccessibleButton, { ButtonEvent } from "./AccessibleButton";
2222

2323
interface IItemProps {
24-
index?: number;
24+
index: number;
2525
value?: string;
2626
onRemove?(index: number): void;
2727
}
@@ -99,7 +99,7 @@ interface IProps {
9999
canEdit?: boolean;
100100
canRemove?: boolean;
101101
suggestionsListId?: string;
102-
onItemAdded?(item: string): void;
102+
onItemAdded?(item?: string): void;
103103
onItemRemoved?(index: number): void;
104104
onNewItemChanged?(item: string): void;
105105
}

src/components/views/room_settings/AliasSettings.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class EditableAliasesList extends EditableItemList<IEditableAliasesListProps> {
4141

4242
private onAliasAdded = async (ev: SyntheticEvent): Promise<void> => {
4343
ev.preventDefault();
44+
45+
if (!this.aliasField.current) return;
4446
await this.aliasField.current.validate({ allowEmpty: false });
4547

4648
if (this.aliasField.current.isValid) {
@@ -85,9 +87,12 @@ interface IProps {
8587
}
8688

8789
interface IState {
90+
// [ #alias:domain.tld, ... ]
8891
altAliases: string[];
92+
// [ #alias:my-hs.tld, ... ]
8993
localAliases: string[];
90-
canonicalAlias?: string;
94+
// #canonical:domain.tld
95+
canonicalAlias: string | null;
9196
updatingCanonicalAlias: boolean;
9297
localAliasesLoading: boolean;
9398
detailsOpen: boolean;
@@ -108,9 +113,9 @@ export default class AliasSettings extends React.Component<IProps, IState> {
108113
super(props, context);
109114

110115
const state: IState = {
111-
altAliases: [], // [ #alias:domain.tld, ... ]
112-
localAliases: [], // [ #alias:my-hs.tld, ... ]
113-
canonicalAlias: null, // #canonical:domain.tld
116+
altAliases: [],
117+
localAliases: [],
118+
canonicalAlias: null,
114119
updatingCanonicalAlias: false,
115120
localAliasesLoading: false,
116121
detailsOpen: false,
@@ -156,7 +161,7 @@ export default class AliasSettings extends React.Component<IProps, IState> {
156161
}
157162
}
158163

159-
private changeCanonicalAlias(alias: string): void {
164+
private changeCanonicalAlias(alias: string | null): void {
160165
if (!this.props.canSetCanonicalAlias) return;
161166

162167
const oldAlias = this.state.canonicalAlias;
@@ -232,7 +237,7 @@ export default class AliasSettings extends React.Component<IProps, IState> {
232237
this.setState({ newAlias: value });
233238
};
234239

235-
private onLocalAliasAdded = (alias: string): void => {
240+
private onLocalAliasAdded = (alias?: string): void => {
236241
if (!alias || alias.length === 0) return; // ignore attempts to create blank aliases
237242

238243
const localDomain = this.context.getDomain();
@@ -242,11 +247,11 @@ export default class AliasSettings extends React.Component<IProps, IState> {
242247
.createAlias(alias, this.props.roomId)
243248
.then(() => {
244249
this.setState({
245-
localAliases: this.state.localAliases.concat(alias),
246-
newAlias: null,
250+
localAliases: this.state.localAliases.concat(alias!),
251+
newAlias: undefined,
247252
});
248253
if (!this.state.canonicalAlias) {
249-
this.changeCanonicalAlias(alias);
254+
this.changeCanonicalAlias(alias!);
250255
}
251256
})
252257
.catch((err) => {
@@ -338,7 +343,7 @@ export default class AliasSettings extends React.Component<IProps, IState> {
338343

339344
public render(): React.ReactNode {
340345
const mxClient = this.context;
341-
const localDomain = mxClient.getDomain();
346+
const localDomain = mxClient.getDomain()!;
342347
const isSpaceRoom = mxClient.getRoom(this.props.roomId)?.isSpaceRoom();
343348

344349
let found = false;

src/components/views/room_settings/RoomProfileSettings.tsx

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ limitations under the License.
1616

1717
import React, { createRef } from "react";
1818
import classNames from "classnames";
19+
import { EventType } from "matrix-js-sdk/src/matrix";
1920

2021
import { _t } from "../../../languageHandler";
2122
import { MatrixClientPeg } from "../../../MatrixClientPeg";
@@ -33,9 +34,9 @@ interface IProps {
3334
interface IState {
3435
originalDisplayName: string;
3536
displayName: string;
36-
originalAvatarUrl: string;
37-
avatarUrl: string;
38-
avatarFile: File;
37+
originalAvatarUrl: string | null;
38+
avatarUrl: string | null;
39+
avatarFile: File | null;
3940
originalTopic: string;
4041
topic: string;
4142
profileFieldsTouched: Record<string, boolean>;
@@ -55,16 +56,17 @@ export default class RoomProfileSettings extends React.Component<IProps, IState>
5556
const room = client.getRoom(props.roomId);
5657
if (!room) throw new Error(`Expected a room for ID: ${props.roomId}`);
5758

58-
const avatarEvent = room.currentState.getStateEvents("m.room.avatar", "");
59-
let avatarUrl = avatarEvent && avatarEvent.getContent() ? avatarEvent.getContent()["url"] : null;
59+
const avatarEvent = room.currentState.getStateEvents(EventType.RoomAvatar, "");
60+
let avatarUrl = avatarEvent?.getContent()["url"] ?? null;
6061
if (avatarUrl) avatarUrl = mediaFromMxc(avatarUrl).getSquareThumbnailHttp(96);
6162

62-
const topicEvent = room.currentState.getStateEvents("m.room.topic", "");
63+
const topicEvent = room.currentState.getStateEvents(EventType.RoomTopic, "");
6364
const topic = topicEvent && topicEvent.getContent() ? topicEvent.getContent()["topic"] : "";
6465

65-
const nameEvent = room.currentState.getStateEvents("m.room.name", "");
66+
const nameEvent = room.currentState.getStateEvents(EventType.RoomName, "");
6667
const name = nameEvent && nameEvent.getContent() ? nameEvent.getContent()["name"] : "";
6768

69+
const userId = client.getSafeUserId();
6870
this.state = {
6971
originalDisplayName: name,
7072
displayName: name,
@@ -74,19 +76,19 @@ export default class RoomProfileSettings extends React.Component<IProps, IState>
7476
originalTopic: topic,
7577
topic: topic,
7678
profileFieldsTouched: {},
77-
canSetName: room.currentState.maySendStateEvent("m.room.name", client.getUserId()),
78-
canSetTopic: room.currentState.maySendStateEvent("m.room.topic", client.getUserId()),
79-
canSetAvatar: room.currentState.maySendStateEvent("m.room.avatar", client.getUserId()),
79+
canSetName: room.currentState.maySendStateEvent(EventType.RoomName, userId),
80+
canSetTopic: room.currentState.maySendStateEvent(EventType.RoomTopic, userId),
81+
canSetAvatar: room.currentState.maySendStateEvent(EventType.RoomAvatar, userId),
8082
};
8183
}
8284

8385
private uploadAvatar = (): void => {
84-
this.avatarUpload.current.click();
86+
this.avatarUpload.current?.click();
8587
};
8688

8789
private removeAvatar = (): void => {
8890
// clear file upload field so same file can be selected
89-
this.avatarUpload.current.value = "";
91+
if (this.avatarUpload.current) this.avatarUpload.current.value = "";
9092
this.setState({
9193
avatarUrl: null,
9294
avatarFile: null,
@@ -135,12 +137,12 @@ export default class RoomProfileSettings extends React.Component<IProps, IState>
135137

136138
if (this.state.avatarFile) {
137139
const { content_uri: uri } = await client.uploadContent(this.state.avatarFile);
138-
await client.sendStateEvent(this.props.roomId, "m.room.avatar", { url: uri }, "");
140+
await client.sendStateEvent(this.props.roomId, EventType.RoomAvatar, { url: uri }, "");
139141
newState.avatarUrl = mediaFromMxc(uri).getSquareThumbnailHttp(96);
140142
newState.originalAvatarUrl = newState.avatarUrl;
141143
newState.avatarFile = null;
142144
} else if (this.state.originalAvatarUrl !== this.state.avatarUrl) {
143-
await client.sendStateEvent(this.props.roomId, "m.room.avatar", {}, "");
145+
await client.sendStateEvent(this.props.roomId, EventType.RoomAvatar, {}, "");
144146
}
145147

146148
if (this.state.originalTopic !== this.state.topic) {
@@ -207,7 +209,7 @@ export default class RoomProfileSettings extends React.Component<IProps, IState>
207209
const reader = new FileReader();
208210
reader.onload = (ev) => {
209211
this.setState({
210-
avatarUrl: String(ev.target.result),
212+
avatarUrl: String(ev.target?.result),
211213
avatarFile: file,
212214
profileFieldsTouched: {
213215
...this.state.profileFieldsTouched,
@@ -269,7 +271,7 @@ export default class RoomProfileSettings extends React.Component<IProps, IState>
269271
/>
270272
</div>
271273
<AvatarSetting
272-
avatarUrl={this.state.avatarUrl}
274+
avatarUrl={this.state.avatarUrl ?? undefined}
273275
avatarName={this.state.displayName || this.props.roomId}
274276
avatarAltText={_t("Room avatar")}
275277
uploadAvatar={this.state.canSetAvatar ? this.uploadAvatar : undefined}

src/components/views/room_settings/RoomPublishSetting.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ limitations under the License.
1515
*/
1616

1717
import React from "react";
18-
import { Visibility } from "matrix-js-sdk/src/@types/partials";
18+
import { JoinRule, Visibility } from "matrix-js-sdk/src/@types/partials";
1919

2020
import LabelledToggleSwitch from "../elements/LabelledToggleSwitch";
2121
import { _t } from "../../../languageHandler";
@@ -66,7 +66,7 @@ export default class RoomPublishSetting extends React.PureComponent<IProps, ISta
6666
const client = MatrixClientPeg.get();
6767

6868
const room = client.getRoom(this.props.roomId);
69-
const isRoomPublishable = room.getJoinRule() !== "invite";
69+
const isRoomPublishable = room && room.getJoinRule() !== JoinRule.Invite;
7070

7171
const enabled =
7272
(DirectoryCustomisations.requireCanonicalAliasAccessToPublish?.() === false ||

0 commit comments

Comments
 (0)