Enable strictPropertyInitialization (#11203)
This commit is contained in:
parent
4207d182cd
commit
cfd48b36aa
38 changed files with 97 additions and 117 deletions
|
@ -117,7 +117,7 @@ export default class CaptchaForm extends React.Component<ICaptchaFormProps, ICap
|
|||
});
|
||||
} catch (e) {
|
||||
this.setState({
|
||||
errorText: e.toString(),
|
||||
errorText: e instanceof Error ? e.message : String(e),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -647,7 +647,7 @@ export class MsisdnAuthEntry extends React.Component<IMsisdnAuthEntryProps, IMsi
|
|||
});
|
||||
}
|
||||
} catch (e) {
|
||||
this.props.fail(e);
|
||||
this.props.fail(e instanceof Error ? e : new Error("Failed to submit msisdn token"));
|
||||
logger.log("Failed to submit msisdn token");
|
||||
}
|
||||
};
|
||||
|
|
|
@ -112,7 +112,7 @@ const BeaconViewDialog: React.FC<IProps> = ({ initialFocusedBeacon, roomId, matr
|
|||
|
||||
const { bounds, centerGeoUri } = useMapPosition(liveBeacons, focusedBeaconState);
|
||||
|
||||
const [mapDisplayError, setMapDisplayError] = useState<Error>();
|
||||
const [mapDisplayError, setMapDisplayError] = useState<unknown>();
|
||||
|
||||
// automatically open the sidebar if there is no map to see
|
||||
useEffect(() => {
|
||||
|
@ -156,7 +156,9 @@ const BeaconViewDialog: React.FC<IProps> = ({ initialFocusedBeacon, roomId, matr
|
|||
)}
|
||||
</Map>
|
||||
)}
|
||||
{mapDisplayError && <MapError error={mapDisplayError.message as LocationShareError} isMinimised />}
|
||||
{mapDisplayError instanceof Error && (
|
||||
<MapError error={mapDisplayError.message as LocationShareError} isMinimised />
|
||||
)}
|
||||
{!centerGeoUri && !mapDisplayError && (
|
||||
<MapFallback data-testid="beacon-view-dialog-map-fallback" className="mx_BeaconViewDialog_map">
|
||||
<span className="mx_BeaconViewDialog_mapFallbackMessage">{_t("No live locations")}</span>
|
||||
|
|
|
@ -154,7 +154,7 @@ export const AddExistingToSpace: React.FC<IAddExistingToSpaceProps> = ({
|
|||
|
||||
const [selectedToAdd, setSelectedToAdd] = useState(new Set<Room>());
|
||||
const [progress, setProgress] = useState<number | null>(null);
|
||||
const [error, setError] = useState<Error | null>(null);
|
||||
const [error, setError] = useState(false);
|
||||
const [query, setQuery] = useState("");
|
||||
const lcQuery = query.toLowerCase().trim();
|
||||
|
||||
|
@ -196,10 +196,10 @@ export const AddExistingToSpace: React.FC<IAddExistingToSpaceProps> = ({
|
|||
}, [visibleRooms, space, lcQuery, existingRoomsSet, existingSubspacesSet]);
|
||||
|
||||
const addRooms = async (): Promise<void> => {
|
||||
setError(null);
|
||||
setError(false);
|
||||
setProgress(0);
|
||||
|
||||
let error: Error | undefined;
|
||||
let error = false;
|
||||
|
||||
for (const room of selectedToAdd) {
|
||||
const via = calculateRoomVia(room);
|
||||
|
@ -216,7 +216,7 @@ export const AddExistingToSpace: React.FC<IAddExistingToSpaceProps> = ({
|
|||
setProgress((i) => (i ?? 0) + 1);
|
||||
} catch (e) {
|
||||
logger.error("Failed to add rooms to space", e);
|
||||
error = e;
|
||||
error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ interface IProps {
|
|||
onFinished: (success: boolean) => void;
|
||||
initialText?: string;
|
||||
label?: string;
|
||||
error?: Error;
|
||||
error?: unknown;
|
||||
}
|
||||
|
||||
interface IState {
|
||||
|
|
|
@ -27,7 +27,7 @@ import BaseDialog from "./BaseDialog";
|
|||
import DialogButtons from "../elements/DialogButtons";
|
||||
|
||||
interface IProps {
|
||||
error: Error;
|
||||
error: unknown;
|
||||
onFinished(clear?: boolean): void;
|
||||
}
|
||||
|
||||
|
|
|
@ -84,8 +84,8 @@ export const SlidingSyncOptionsDialog: React.FC<{ onFinished(enabled: boolean):
|
|||
: _t("Your server lacks native support");
|
||||
}
|
||||
|
||||
const validProxy = withValidation<undefined, { error?: Error }>({
|
||||
async deriveData({ value }): Promise<{ error?: Error }> {
|
||||
const validProxy = withValidation<undefined, { error?: unknown }>({
|
||||
async deriveData({ value }): Promise<{ error?: unknown }> {
|
||||
try {
|
||||
await proxyHealthCheck(value!, MatrixClientPeg.safeGet().baseUrl);
|
||||
return {};
|
||||
|
@ -104,7 +104,7 @@ export const SlidingSyncOptionsDialog: React.FC<{ onFinished(enabled: boolean):
|
|||
final: true,
|
||||
test: async (_, { error }) => !error,
|
||||
valid: () => _t("Looks good"),
|
||||
invalid: ({ error }) => error?.message ?? null,
|
||||
invalid: ({ error }) => (error instanceof Error ? error.message : null),
|
||||
},
|
||||
],
|
||||
});
|
||||
|
|
|
@ -111,7 +111,7 @@ export const EventEditor: React.FC<IEventEditorProps> = ({ fieldDefs, defaultCon
|
|||
const json = JSON.parse(content);
|
||||
await onSend(fieldData, json);
|
||||
} catch (e) {
|
||||
return _t("Failed to send event!") + ` (${e.toString()})`;
|
||||
return _t("Failed to send event!") + (e instanceof Error ? ` (${e.message})` : "");
|
||||
}
|
||||
return _t("Event sent!");
|
||||
};
|
||||
|
|
|
@ -125,7 +125,7 @@ const EditSetting: React.FC<IEditSettingProps> = ({ setting, onBack }) => {
|
|||
}
|
||||
onBack();
|
||||
} catch (e) {
|
||||
return _t("Failed to save settings.") + ` (${e.message})`;
|
||||
return _t("Failed to save settings.") + (e instanceof Error ? ` (${e.message})` : "");
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ interface IProps {
|
|||
}
|
||||
|
||||
interface IState {
|
||||
error: Error | null;
|
||||
error: boolean;
|
||||
canUploadKeysWithPasswordOnly: boolean | null;
|
||||
accountPassword: string;
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ export default class CreateCrossSigningDialog extends React.PureComponent<IProps
|
|||
super(props);
|
||||
|
||||
this.state = {
|
||||
error: null,
|
||||
error: false,
|
||||
// Does the server offer a UI auth flow with just m.login.password
|
||||
// for /keys/device_signing/upload?
|
||||
// If we have an account password in memory, let's simplify and
|
||||
|
@ -145,7 +145,7 @@ export default class CreateCrossSigningDialog extends React.PureComponent<IProps
|
|||
|
||||
private bootstrapCrossSigning = async (): Promise<void> => {
|
||||
this.setState({
|
||||
error: null,
|
||||
error: false,
|
||||
});
|
||||
|
||||
try {
|
||||
|
@ -161,7 +161,7 @@ export default class CreateCrossSigningDialog extends React.PureComponent<IProps
|
|||
return;
|
||||
}
|
||||
|
||||
this.setState({ error: e });
|
||||
this.setState({ error: true });
|
||||
logger.error("Error bootstrapping cross-signing", e);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -20,6 +20,7 @@ import { MatrixClient } from "matrix-js-sdk/src/client";
|
|||
import { IKeyBackupInfo, IKeyBackupRestoreResult } from "matrix-js-sdk/src/crypto/keybackup";
|
||||
import { ISecretStorageKeyInfo } from "matrix-js-sdk/src/crypto/api";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { MatrixError } from "matrix-js-sdk/src/matrix";
|
||||
|
||||
import { MatrixClientPeg } from "../../../../MatrixClientPeg";
|
||||
import { _t } from "../../../../languageHandler";
|
||||
|
@ -56,9 +57,7 @@ interface IState {
|
|||
backupKeyStored: Record<string, ISecretStorageKeyInfo> | null;
|
||||
loading: boolean;
|
||||
loadError: boolean | null;
|
||||
restoreError: {
|
||||
errcode: string;
|
||||
} | null;
|
||||
restoreError: unknown | null;
|
||||
recoveryKey: string;
|
||||
recoverInfo: IKeyBackupRestoreResult | null;
|
||||
recoveryKeyValid: boolean;
|
||||
|
@ -343,7 +342,10 @@ export default class RestoreKeyBackupDialog extends React.PureComponent<IProps,
|
|||
title = _t("Error");
|
||||
content = _t("Unable to load backup status");
|
||||
} else if (this.state.restoreError) {
|
||||
if (this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY) {
|
||||
if (
|
||||
this.state.restoreError instanceof MatrixError &&
|
||||
this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY
|
||||
) {
|
||||
if (this.state.restoreType === RestoreType.RecoveryKey) {
|
||||
title = _t("Security Key mismatch");
|
||||
content = (
|
||||
|
|
|
@ -38,8 +38,8 @@ export interface IPublicRoomDirectoryConfig {
|
|||
instanceId?: string;
|
||||
}
|
||||
|
||||
const validServer = withValidation<undefined, { error?: MatrixError }>({
|
||||
deriveData: async ({ value }): Promise<{ error?: MatrixError }> => {
|
||||
const validServer = withValidation<undefined, { error?: unknown }>({
|
||||
deriveData: async ({ value }): Promise<{ error?: unknown }> => {
|
||||
try {
|
||||
// check if we can successfully load this server's room directory
|
||||
await MatrixClientPeg.safeGet().publicRooms({
|
||||
|
@ -63,7 +63,7 @@ const validServer = withValidation<undefined, { error?: MatrixError }>({
|
|||
test: async (_, { error }) => !error,
|
||||
valid: () => _t("Looks good"),
|
||||
invalid: ({ error }) =>
|
||||
error?.errcode === "M_FORBIDDEN"
|
||||
error instanceof MatrixError && error.errcode === "M_FORBIDDEN"
|
||||
? _t("You are not allowed to view this server's rooms list")
|
||||
: _t("Can't find this server or its room list"),
|
||||
},
|
||||
|
|
|
@ -91,7 +91,7 @@ export default class EditableTextContainer extends React.Component<IProps, IStat
|
|||
} catch (error) {
|
||||
if (this.unmounted) return;
|
||||
this.setState({
|
||||
errorString: error.toString(),
|
||||
errorString: error instanceof Error ? error.message : String(error),
|
||||
busy: false,
|
||||
});
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ import RoomContext, { TimelineRenderingType } from "../../../contexts/RoomContex
|
|||
import MediaProcessingError from "./shared/MediaProcessingError";
|
||||
|
||||
interface IState {
|
||||
error?: Error;
|
||||
error?: boolean;
|
||||
playback?: Playback;
|
||||
}
|
||||
|
||||
|
@ -54,12 +54,12 @@ export default class MAudioBody extends React.PureComponent<IBodyProps, IState>
|
|||
const blob = await this.props.mediaEventHelper!.sourceBlob.value;
|
||||
buffer = await blob.arrayBuffer();
|
||||
} catch (e) {
|
||||
this.setState({ error: e });
|
||||
this.setState({ error: true });
|
||||
logger.warn("Unable to decrypt audio message", e);
|
||||
return; // stop processing the audio file
|
||||
}
|
||||
} catch (e) {
|
||||
this.setState({ error: e });
|
||||
this.setState({ error: true });
|
||||
logger.warn("Unable to decrypt/download audio message", e);
|
||||
return; // stop processing the audio file
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ interface IState {
|
|||
contentUrl: string | null;
|
||||
thumbUrl: string | null;
|
||||
isAnimated?: boolean;
|
||||
error?: Error;
|
||||
error?: unknown;
|
||||
imgError: boolean;
|
||||
imgLoaded: boolean;
|
||||
loadedImageDimensions?: {
|
||||
|
|
|
@ -31,7 +31,7 @@ import AccessibleButton from "../elements/AccessibleButton";
|
|||
import { SettingsSubsectionText } from "./shared/SettingsSubsection";
|
||||
|
||||
interface IState {
|
||||
error?: Error;
|
||||
error: boolean;
|
||||
crossSigningPublicKeysOnDevice?: boolean;
|
||||
crossSigningPrivateKeysInStorage?: boolean;
|
||||
masterPrivateKeyCached?: boolean;
|
||||
|
@ -47,7 +47,9 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> {
|
|||
public constructor(props: {}) {
|
||||
super(props);
|
||||
|
||||
this.state = {};
|
||||
this.state = {
|
||||
error: false,
|
||||
};
|
||||
}
|
||||
|
||||
public componentDidMount(): void {
|
||||
|
@ -125,7 +127,7 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> {
|
|||
* @param {bool} [forceReset] Bootstrap again even if keys already present
|
||||
*/
|
||||
private bootstrapCrossSigning = async ({ forceReset = false }): Promise<void> => {
|
||||
this.setState({ error: undefined });
|
||||
this.setState({ error: false });
|
||||
try {
|
||||
const cli = MatrixClientPeg.safeGet();
|
||||
await cli.bootstrapCrossSigning({
|
||||
|
@ -143,7 +145,7 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> {
|
|||
setupNewCrossSigning: forceReset,
|
||||
});
|
||||
} catch (e) {
|
||||
this.setState({ error: e });
|
||||
this.setState({ error: true });
|
||||
logger.error("Error bootstrapping cross-signing", e);
|
||||
}
|
||||
if (this.unmounted) return;
|
||||
|
|
|
@ -239,7 +239,11 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
|
|||
<SettingsSubsectionText>
|
||||
<details>
|
||||
<summary>{_t("Advanced")}</summary>
|
||||
<code>{EventIndexPeg.error.message}</code>
|
||||
<code>
|
||||
{EventIndexPeg.error instanceof Error
|
||||
? EventIndexPeg.error.message
|
||||
: _t("Unknown error")}
|
||||
</code>
|
||||
<p>
|
||||
<AccessibleButton key="delete" kind="danger" onClick={this.confirmEventStoreReset}>
|
||||
{_t("Reset")}
|
||||
|
|
|
@ -40,7 +40,7 @@ export interface JoinRuleSettingsProps {
|
|||
room: Room;
|
||||
promptUpgrade?: boolean;
|
||||
closeSettingsFn(): void;
|
||||
onError(error: Error): void;
|
||||
onError(error: unknown): void;
|
||||
beforeChange?(joinRule: JoinRule): Promise<boolean>; // if returns false then aborts the change
|
||||
aliasWarning?: ReactNode;
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ import { SettingsSubsectionText } from "./shared/SettingsSubsection";
|
|||
|
||||
interface IState {
|
||||
loading: boolean;
|
||||
error: Error | null;
|
||||
error: boolean;
|
||||
backupKeyStored: boolean | null;
|
||||
backupKeyCached: boolean | null;
|
||||
backupKeyWellFormed: boolean | null;
|
||||
|
@ -54,7 +54,7 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
|
|||
|
||||
this.state = {
|
||||
loading: true,
|
||||
error: null,
|
||||
error: false,
|
||||
backupKeyStored: null,
|
||||
backupKeyCached: null,
|
||||
backupKeyWellFormed: null,
|
||||
|
@ -103,7 +103,7 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
|
|||
const keyBackupResult = await MatrixClientPeg.safeGet().checkKeyBackup();
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: null,
|
||||
error: false,
|
||||
backupInfo: keyBackupResult?.backupInfo ?? null,
|
||||
backupSigStatus: keyBackupResult?.trustInfo ?? null,
|
||||
});
|
||||
|
@ -112,7 +112,7 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
|
|||
if (this.unmounted) return;
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: e,
|
||||
error: true,
|
||||
backupInfo: null,
|
||||
backupSigStatus: null,
|
||||
});
|
||||
|
@ -128,7 +128,7 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
|
|||
if (this.unmounted) return;
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: null,
|
||||
error: false,
|
||||
backupInfo,
|
||||
backupSigStatus,
|
||||
});
|
||||
|
@ -137,7 +137,7 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
|
|||
if (this.unmounted) return;
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: e,
|
||||
error: true,
|
||||
backupInfo: null,
|
||||
backupSigStatus: null,
|
||||
});
|
||||
|
@ -209,13 +209,13 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> {
|
|||
};
|
||||
|
||||
private resetSecretStorage = async (): Promise<void> => {
|
||||
this.setState({ error: null });
|
||||
this.setState({ error: false });
|
||||
try {
|
||||
await accessSecretStorage(async (): Promise<void> => {}, /* forceReset = */ true);
|
||||
} catch (e) {
|
||||
logger.error("Error resetting secret storage", e);
|
||||
if (this.unmounted) return;
|
||||
this.setState({ error: e });
|
||||
this.setState({ error: true });
|
||||
}
|
||||
if (this.unmounted) return;
|
||||
this.loadBackupStatus();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue