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

Commit

Permalink
Conform more of the codebase to strict types (#11191)
Browse files Browse the repository at this point in the history
  • Loading branch information
t3chguy authored Jul 5, 2023
1 parent 4044c2a commit 8107f1d
Show file tree
Hide file tree
Showing 25 changed files with 88 additions and 57 deletions.
3 changes: 2 additions & 1 deletion src/ScalarMessaging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,8 @@ async function setBotPower(
success: true,
});
} catch (err) {
sendError(event, err instanceof Error ? err.message : _t("Failed to send request."), err);
const error = err instanceof Error ? err : undefined;
sendError(event, error?.message ?? _t("Failed to send request."), error);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/SlashCommands.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1105,7 +1105,7 @@ export const Commands = [
try {
cli.forceDiscardSession(roomId);
} catch (e) {
return reject(e.message);
return reject(e instanceof Error ? e.message : e);
}
return success();
},
Expand Down Expand Up @@ -1134,7 +1134,7 @@ export const Commands = [
}),
);
} catch (e) {
return reject(e.message);
return reject(e instanceof Error ? e.message : e);
}
},
category: CommandCategories.advanced,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ import FileSaver from "file-saver";
import { logger } from "matrix-js-sdk/src/logger";
import { IKeyBackupInfo } from "matrix-js-sdk/src/crypto/keybackup";
import { TrustInfo } from "matrix-js-sdk/src/crypto/backup";
import { CrossSigningKeys, MatrixError, UIAFlow } from "matrix-js-sdk/src/matrix";
import { CrossSigningKeys, IAuthDict, MatrixError, UIAFlow } from "matrix-js-sdk/src/matrix";
import { IRecoveryKey } from "matrix-js-sdk/src/crypto/api";
import { CryptoEvent } from "matrix-js-sdk/src/crypto";
import classNames from "classnames";
import { UIAResponse } from "matrix-js-sdk/src/@types/uia";

import { MatrixClientPeg } from "../../../../MatrixClientPeg";
import { _t, _td } from "../../../../languageHandler";
Expand Down Expand Up @@ -90,7 +91,7 @@ interface IState {
accountPasswordCorrect: boolean | null;
canSkip: boolean;
passPhraseKeySelected: string;
error?: string;
error?: boolean;
}

/*
Expand Down Expand Up @@ -279,7 +280,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent<IProp
});
};

private doBootstrapUIAuth = async (makeRequest: (authData: any) => Promise<{}>): Promise<void> => {
private doBootstrapUIAuth = async (
makeRequest: (authData: IAuthDict) => Promise<UIAResponse<void>>,
): Promise<void> => {
if (this.state.canUploadKeysWithPasswordOnly && this.state.accountPassword) {
await makeRequest({
type: "m.login.password",
Expand Down Expand Up @@ -385,7 +388,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent<IProp
phase: Phase.Migrate,
});
} else {
this.setState({ error: e });
this.setState({ error: true });
}
logger.error("Error bootstrapping secret storage", e);
}
Expand Down
4 changes: 2 additions & 2 deletions src/components/structures/auth/Registration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -246,11 +246,11 @@ export default class Registration extends React.Component<IProps, IState> {
}
} catch (e) {
if (serverConfig !== this.latestServerConfig) return; // discard, serverConfig changed from under us
if (e.httpStatus === 401) {
if (e instanceof MatrixError && e.httpStatus === 401) {
this.setState({
flows: e.data.flows,
});
} else if (e.httpStatus === 403 || e.errcode === "M_FORBIDDEN") {
} else if (e instanceof MatrixError && (e.httpStatus === 403 || e.errcode === "M_FORBIDDEN")) {
// Check for 403 or M_FORBIDDEN, Synapse used to send 403 M_UNKNOWN but now sends 403 M_FORBIDDEN.
// At this point registration is pretty much disabled, but before we do that let's
// quickly check to see if the server supports SSO instead. If it does, we'll send
Expand Down
2 changes: 1 addition & 1 deletion src/components/views/dialogs/ChangelogDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export default class ChangelogDialog extends React.Component<IProps, State> {
const body = await res.json();
this.setState({ [repo]: body.commits });
} catch (err) {
this.setState({ [repo]: err.message });
this.setState({ [repo]: err instanceof Error ? err.message : _t("Unknown error") });
}
}

Expand Down
2 changes: 0 additions & 2 deletions src/components/views/dialogs/LogoutDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ interface IState {
shouldLoadBackupStatus: boolean;
loading: boolean;
backupInfo: IKeyBackupInfo | null;
error?: string;
}

export default class LogoutDialog extends React.Component<IProps, IState> {
Expand Down Expand Up @@ -75,7 +74,6 @@ export default class LogoutDialog extends React.Component<IProps, IState> {
logger.log("Unable to fetch key backup status", e);
this.setState({
loading: false,
error: e,
});
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/components/views/dialogs/ReportEventDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ export default class ReportEventDialog extends React.Component<IProps, IState> {
logger.error(e);
this.setState({
busy: false,
err: e.message,
err: e instanceof Error ? e.message : String(e),
});
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ limitations under the License.
import React from "react";
import { CrossSigningKeys } from "matrix-js-sdk/src/client";
import { logger } from "matrix-js-sdk/src/logger";
import { UIAFlow } from "matrix-js-sdk/src/matrix";
import { AuthDict, MatrixError, UIAFlow } from "matrix-js-sdk/src/matrix";
import { UIAResponse } from "matrix-js-sdk/src/@types/uia";

import { MatrixClientPeg } from "../../../../MatrixClientPeg";
import { _t } from "../../../../languageHandler";
Expand Down Expand Up @@ -79,7 +80,7 @@ export default class CreateCrossSigningDialog extends React.PureComponent<IProps
// no keys which would be a no-op.
logger.log("uploadDeviceSigningKeys unexpectedly succeeded without UI auth!");
} catch (error) {
if (!error.data || !error.data.flows) {
if (!(error instanceof MatrixError) || !error.data || !error.data.flows) {
logger.log("uploadDeviceSigningKeys advertised no flows!");
return;
}
Expand All @@ -92,7 +93,9 @@ export default class CreateCrossSigningDialog extends React.PureComponent<IProps
}
}

private doBootstrapUIAuth = async (makeRequest: (authData: any) => Promise<{}>): Promise<void> => {
private doBootstrapUIAuth = async (
makeRequest: (authData: AuthDict) => Promise<UIAResponse<void>>,
): Promise<void> => {
if (this.state.canUploadKeysWithPasswordOnly && this.state.accountPassword) {
await makeRequest({
type: "m.login.password",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ interface IState {
backupInfo: IKeyBackupInfo | null;
backupKeyStored: Record<string, ISecretStorageKeyInfo> | null;
loading: boolean;
loadError: string | null;
loadError: boolean | null;
restoreError: {
errcode: string;
} | null;
Expand All @@ -66,7 +66,7 @@ interface IState {
passPhrase: string;
restoreType: RestoreType | null;
progress: {
stage: ProgressState;
stage: ProgressState | string;
total?: number;
successes?: number;
failures?: number;
Expand Down Expand Up @@ -304,7 +304,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent<IProps,
} catch (e) {
logger.log("Error loading backup status", e);
this.setState({
loadError: e,
loadError: true,
loading: false,
});
}
Expand Down
4 changes: 2 additions & 2 deletions src/components/views/elements/LazyRenderList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export default class LazyRenderList<T = any> extends React.Component<IProps<T>,
this.state = LazyRenderList.getDerivedStateFromProps(props, {} as IState) as IState;
}

public static getDerivedStateFromProps(props: IProps<unknown>, state: IState): Partial<IState> | null {
public static getDerivedStateFromProps<T>(props: IProps<T>, state: IState): Partial<IState> | null {
const range = LazyRenderList.getVisibleRangeFromProps(props);
const intersectRange = range.expand(props.overflowMargin);
const renderRange = range.expand(props.overflowItems);
Expand All @@ -105,7 +105,7 @@ export default class LazyRenderList<T = any> extends React.Component<IProps<T>,
return null;
}

private static getVisibleRangeFromProps(props: IProps<unknown>): ItemRange {
private static getVisibleRangeFromProps<T>(props: IProps<T>): ItemRange {
const { items, itemHeight, scrollTop, height } = props;
const length = items ? items.length : 0;
const topCount = Math.min(Math.max(0, Math.floor(scrollTop / itemHeight)), length);
Expand Down
3 changes: 2 additions & 1 deletion src/components/views/elements/RoomAliasField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ limitations under the License.
*/

import React, { createRef, KeyboardEventHandler } from "react";
import { MatrixError } from "matrix-js-sdk/src/matrix";

import { _t } from "../../../languageHandler";
import withValidation, { IFieldState, IValidationResult } from "./Validation";
Expand Down Expand Up @@ -209,7 +210,7 @@ export default class RoomAliasField extends React.PureComponent<IProps, IState>
// any server error code will do,
// either it M_NOT_FOUND or the alias is invalid somehow,
// in which case we don't want to show the invalid message
return !!err.errcode;
return err instanceof MatrixError;
}
},
valid: () => _t("This address is available to use"),
Expand Down
6 changes: 3 additions & 3 deletions src/components/views/settings/devices/deleteDevices.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

import { MatrixClient } from "matrix-js-sdk/src/matrix";
import { MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix";
import { IAuthDict, IAuthData } from "matrix-js-sdk/src/interactive-auth";

import { _t } from "../../../../languageHandler";
Expand Down Expand Up @@ -42,7 +42,7 @@ export const deleteDevicesWithInteractiveAuth = async (
// no interactive auth needed
onFinished(true, undefined);
} catch (error) {
if (error.httpStatus !== 401 || !error.data?.flows) {
if (!(error instanceof MatrixError) || error.httpStatus !== 401 || !error.data?.flows) {
// doesn't look like an interactive-auth failure
throw error;
}
Expand Down Expand Up @@ -73,7 +73,7 @@ export const deleteDevicesWithInteractiveAuth = async (
Modal.createDialog(InteractiveAuthDialog, {
title: _t("Authentication"),
matrixClient: matrixClient,
authData: error.data,
authData: error.data as IAuthData,
onFinished,
makeRequest: makeDeleteRequest(matrixClient, deviceIds),
aestheticsForStagePhases: {
Expand Down
2 changes: 1 addition & 1 deletion src/components/views/toasts/VerificationRequestToast.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ export default class VerificationRequestToast extends React.PureComponent<IProps
}
await request.accept();
} catch (err) {
logger.error(err.message);
logger.error("Failed to accept verification request", err);
}
};

Expand Down
6 changes: 3 additions & 3 deletions src/hooks/useLocalStorageState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

import { Dispatch, SetStateAction, useCallback, useEffect, useState } from "react";
import { Dispatch, useCallback, useEffect, useState } from "react";

const getValue = <T>(key: string, initialValue: T): T => {
try {
Expand All @@ -26,7 +26,7 @@ const getValue = <T>(key: string, initialValue: T): T => {
};

// Hook behaving like useState but persisting the value to localStorage. Returns same as useState
export const useLocalStorageState = <T>(key: string, initialValue: T): [T, Dispatch<SetStateAction<T>>] => {
export const useLocalStorageState = <T>(key: string, initialValue: T): [T, Dispatch<T>] => {
const lsKey = "mx_" + key;

const [value, setValue] = useState<T>(getValue(lsKey, initialValue));
Expand All @@ -35,7 +35,7 @@ export const useLocalStorageState = <T>(key: string, initialValue: T): [T, Dispa
setValue(getValue(lsKey, initialValue));
}, [lsKey, initialValue]);

const _setValue: Dispatch<SetStateAction<T>> = useCallback(
const _setValue: Dispatch<T> = useCallback(
(v: T) => {
window.localStorage.setItem(lsKey, JSON.stringify(v));
setValue(v);
Expand Down
4 changes: 2 additions & 2 deletions src/hooks/useStateCallback.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

import { Dispatch, SetStateAction, useState } from "react";
import { Dispatch, useState } from "react";

// Hook to simplify interactions with a store-backed state values
// Returns value and method to change the state value
export const useStateCallback = <T>(initialValue: T, callback: (v: T) => void): [T, Dispatch<SetStateAction<T>>] => {
export const useStateCallback = <T>(initialValue: T, callback: (v: T) => void): [T, Dispatch<T>] => {
const [value, setValue] = useState(initialValue);
const interceptSetValue = (newVal: T): void => {
setValue(newVal);
Expand Down
2 changes: 1 addition & 1 deletion src/i18n/strings/en_EN.json
Original file line number Diff line number Diff line change
Expand Up @@ -2765,6 +2765,7 @@
"Remove %(count)s messages|one": "Remove 1 message",
"Can't start voice message": "Can't start voice message",
"You can't start a voice message as you are currently recording a live broadcast. Please end your live broadcast in order to start recording a voice message.": "You can't start a voice message as you are currently recording a live broadcast. Please end your live broadcast in order to start recording a voice message.",
"Unknown error": "Unknown error",
"Unable to load commit detail: %(msg)s": "Unable to load commit detail: %(msg)s",
"Unavailable": "Unavailable",
"Changelog": "Changelog",
Expand Down Expand Up @@ -3469,7 +3470,6 @@
"You don't have permission": "You don't have permission",
"This room is suggested as a good one to join": "This room is suggested as a good one to join",
"Suggested": "Suggested",
"Unknown error": "Unknown error",
"Select a room below first": "Select a room below first",
"Mark as not suggested": "Mark as not suggested",
"Mark as suggested": "Mark as suggested",
Expand Down
32 changes: 26 additions & 6 deletions src/settings/SettingsStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -666,7 +666,9 @@ export default class SettingsStore {
logger.log(`--- ${handlerName}@${roomId || "<no_room>"} = ${JSON.stringify(value)}`);
} catch (e) {
logger.log(
`--- ${handler.constructor.name}@${roomId || "<no_room>"} THREW ERROR: ${e.message}`,
`--- ${handler.constructor.name}@${roomId || "<no_room>"} THREW ERROR: ${
e instanceof Error ? e.message : e
}`,
);
logger.error(e);
}
Expand All @@ -676,7 +678,11 @@ export default class SettingsStore {
const value = handler.getValue(settingName, null);
logger.log(`--- ${handlerName}@<no_room> = ${JSON.stringify(value)}`);
} catch (e) {
logger.log(`--- ${handler.constructor.name}@<no_room> THREW ERROR: ${e.message}`);
logger.log(
`--- ${handler.constructor.name}@<no_room> THREW ERROR: ${
e instanceof Error ? e.message : e
}`,
);
logger.error(e);
}
}
Expand All @@ -689,7 +695,11 @@ export default class SettingsStore {
const value = SettingsStore.getValue(settingName, roomId);
logger.log(`--- SettingsStore#generic@${roomId || "<no_room>"} = ${JSON.stringify(value)}`);
} catch (e) {
logger.log(`--- SettingsStore#generic@${roomId || "<no_room>"} THREW ERROR: ${e.message}`);
logger.log(
`--- SettingsStore#generic@${roomId || "<no_room>"} THREW ERROR: ${
e instanceof Error ? e.message : e
}`,
);
logger.error(e);
}

Expand All @@ -698,7 +708,9 @@ export default class SettingsStore {
const value = SettingsStore.getValue(settingName, null);
logger.log(`--- SettingsStore#generic@<no_room> = ${JSON.stringify(value)}`);
} catch (e) {
logger.log(`--- SettingsStore#generic@$<no_room> THREW ERROR: ${e.message}`);
logger.log(
`--- SettingsStore#generic@$<no_room> THREW ERROR: ${e instanceof Error ? e.message : e}`,
);
logger.error(e);
}
}
Expand All @@ -708,7 +720,11 @@ export default class SettingsStore {
const value = SettingsStore.getValueAt(level, settingName, roomId);
logger.log(`--- SettingsStore#${level}@${roomId || "<no_room>"} = ${JSON.stringify(value)}`);
} catch (e) {
logger.log(`--- SettingsStore#${level}@${roomId || "<no_room>"} THREW ERROR: ${e.message}`);
logger.log(
`--- SettingsStore#${level}@${roomId || "<no_room>"} THREW ERROR: ${
e instanceof Error ? e.message : e
}`,
);
logger.error(e);
}

Expand All @@ -717,7 +733,11 @@ export default class SettingsStore {
const value = SettingsStore.getValueAt(level, settingName, null);
logger.log(`--- SettingsStore#${level}@<no_room> = ${JSON.stringify(value)}`);
} catch (e) {
logger.log(`--- SettingsStore#${level}@$<no_room> THREW ERROR: ${e.message}`);
logger.log(
`--- SettingsStore#${level}@$<no_room> THREW ERROR: ${
e instanceof Error ? e.message : e
}`,
);
logger.error(e);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/utils/MultiInviter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ export default class MultiInviter {
} catch (err) {
// The error handling during the invitation process covers any API.
// Some errors must to me mapped from profile API errors to more specific ones to avoid collisions.
switch (err.errcode) {
switch (err instanceof MatrixError ? err.errcode : err) {
case "M_FORBIDDEN":
throw new MatrixError({ errcode: "M_PROFILE_UNDISCLOSED" });
case "M_NOT_FOUND":
Expand Down
Loading

0 comments on commit 8107f1d

Please sign in to comment.