Conform more of the code base to strict null checking (#10147)

* Conform more of the code base to strict null checking

* More strict fixes

* More strict work

* Fix missing optional type

* Iterate
This commit is contained in:
Michael Telatynski 2023-02-13 17:01:43 +00:00 committed by GitHub
parent fa036a5080
commit da7aa4055e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
380 changed files with 682 additions and 694 deletions

View file

@ -48,7 +48,7 @@ export default class AskInviteAnywayDialog extends React.Component<IProps> {
this.props.onFinished(false);
};
public render(): JSX.Element {
public render(): React.ReactNode {
const errorList = this.props.unknownProfileUsers.map((address) => (
<li key={address.userId}>
{address.userId}: {address.errorText}

View file

@ -115,7 +115,7 @@ export default class BaseDialog extends React.Component<IProps> {
this.props.onFinished(false);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let cancelButton;
if (this.props.hasCancel) {
cancelButton = (

View file

@ -180,7 +180,7 @@ export default class BugReportDialog extends React.Component<IProps, IState> {
this.setState({ downloadProgress });
};
public render(): JSX.Element {
public render(): React.ReactNode {
let error = null;
if (this.state.err) {
error = <div className="error">{this.state.err}</div>;

View file

@ -86,7 +86,7 @@ export default class ChangelogDialog extends React.Component<IProps, State> {
);
}
public render(): JSX.Element {
public render(): React.ReactNode {
const logs = REPOS.map((repo) => {
let content;
if (this.state[repo] == null) {

View file

@ -72,7 +72,7 @@ export default class ConfirmAndWaitRedactDialog extends React.PureComponent<IPro
}
};
public render(): JSX.Element {
public render(): React.ReactNode {
if (this.state.isRedacting) {
if (this.state.redactionErrorCode) {
const code = this.state.redactionErrorCode;

View file

@ -33,7 +33,7 @@ interface IProps {
* A dialog for confirming a redaction.
*/
export default class ConfirmRedactDialog extends React.Component<IProps> {
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<TextInputDialog
onFinished={this.props.onFinished}

View file

@ -83,7 +83,7 @@ export default class ConfirmUserActionDialog extends React.Component<IProps, ISt
});
};
public render(): JSX.Element {
public render(): React.ReactNode {
const confirmButtonClass = this.props.danger ? "danger" : "";
let reasonBox;

View file

@ -33,7 +33,7 @@ export default class ConfirmWipeDeviceDialog extends React.Component<IProps> {
this.props.onFinished(false);
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_ConfirmWipeDeviceDialog"

View file

@ -216,7 +216,7 @@ export default class CreateRoomDialog extends React.Component<IProps, IState> {
],
});
public render(): JSX.Element {
public render(): React.ReactNode {
const isVideoRoom = this.props.type === RoomType.ElementVideo;
let aliasField: JSX.Element;

View file

@ -182,7 +182,7 @@ export default class DeactivateAccountDialog extends React.Component<IProps, ISt
});
}
public render(): JSX.Element {
public render(): React.ReactNode {
let error = null;
if (this.state.errStr) {
error = <div className="error">{this.state.errStr}</div>;

View file

@ -67,7 +67,7 @@ export default class EndPollDialog extends React.Component<IProps> {
this.props.onFinished(endPoll);
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<QuestionDialog
title={_t("End Poll")}

View file

@ -52,7 +52,7 @@ export default class ErrorDialog extends React.Component<IProps, IState> {
this.props.onFinished(true);
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_ErrorDialog"

View file

@ -97,7 +97,7 @@ const FeedbackDialog: React.FC<IProps> = (props: IProps) => {
);
}
let bugReports = null;
let bugReports: JSX.Element | null = null;
if (rageshakeUrl) {
bugReports = (
<p className="mx_FeedbackDialog_section_microcopy">

View file

@ -256,7 +256,7 @@ export default class IncomingSasDialog extends React.Component<IProps, IState> {
return <VerificationCancelled onDone={this.onCancelClick} />;
}
public render(): JSX.Element {
public render(): React.ReactNode {
let body;
switch (this.state.phase) {
case PHASE_START:

View file

@ -44,7 +44,7 @@ export default class InfoDialog extends React.Component<IProps> {
this.props.onFinished();
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_InfoDialog"

View file

@ -35,7 +35,7 @@ export default class IntegrationsDisabledDialog extends React.Component<IProps>
dis.fire(Action.ViewUserSettings);
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_IntegrationsDisabledDialog"

View file

@ -29,7 +29,7 @@ export default class IntegrationsImpossibleDialog extends React.Component<IProps
this.props.onFinished();
};
public render(): JSX.Element {
public render(): React.ReactNode {
const brand = SdkConfig.get().brand;
return (

View file

@ -140,7 +140,7 @@ export default class InteractiveAuthDialog extends React.Component<InteractiveAu
this.props.onFinished(false);
};
public render(): JSX.Element {
public render(): React.ReactNode {
// Let's pick a title, body, and other params text that we'll show to the user. The order
// is most specific first, so stagePhase > our props > defaults.

View file

@ -100,7 +100,7 @@ class DMUserTile extends React.PureComponent<IDMUserTileProps> {
this.props.onRemove(this.props.member);
};
public render(): JSX.Element {
public render(): React.ReactNode {
const avatarSize = 20;
const avatar = <SearchResultAvatar user={this.props.member} size={avatarSize} />;
@ -187,7 +187,7 @@ class DMRoomTile extends React.PureComponent<IDMRoomTileProps> {
return result;
}
public render(): JSX.Element {
public render(): React.ReactNode {
let timestamp = null;
if (this.props.lastActiveTs) {
const humanTs = humanizeTime(this.props.lastActiveTs);
@ -1082,7 +1082,7 @@ export default class InviteDialog extends React.PureComponent<Props, IInviteDial
}
}
public render(): JSX.Element {
public render(): React.ReactNode {
let spinner = null;
if (this.state.busy) {
spinner = <Spinner w={20} h={20} />;

View file

@ -127,7 +127,7 @@ export default class LogoutDialog extends React.Component<IProps, IState> {
this.props.onFinished(true);
};
public render(): JSX.Element {
public render(): React.ReactNode {
if (this.state.shouldLoadBackupStatus) {
const description = (
<div>

View file

@ -40,7 +40,7 @@ export default class ManualDeviceKeyVerificationDialog extends React.Component<I
this.props.onFinished(confirm);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let text;
if (MatrixClientPeg.get().getUserId() === this.props.userId) {
text = _t("Confirm by comparing the following with the User Settings in your other session:");

View file

@ -152,7 +152,7 @@ export default class MessageEditHistoryDialog extends React.PureComponent<IProps
return nodes;
}
public render(): JSX.Element {
public render(): React.ReactNode {
let content;
if (this.state.error) {
const { error } = this.state;

View file

@ -124,7 +124,7 @@ export default class ModalWidgetDialog extends React.PureComponent<IProps, IStat
this.state.messaging.transport.reply(ev.detail, {} as IWidgetApiAcknowledgeResponseData);
};
public render(): JSX.Element {
public render(): React.ReactNode {
const templated = this.widget.getCompleteUrl({
widgetRoomId: this.props.widgetRoomId,
currentUserId: MatrixClientPeg.get().getUserId(),

View file

@ -58,7 +58,7 @@ export default class QuestionDialog extends React.Component<IQuestionDialogProps
this.props.onFinished(false);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let primaryButtonClass = "";
if (this.props.danger) {
primaryButtonClass = "danger";

View file

@ -273,7 +273,7 @@ export default class ReportEventDialog extends React.Component<IProps, IState> {
}
};
public render(): JSX.Element {
public render(): React.ReactNode {
let error = null;
if (this.state.err) {
error = <div className="error">{this.state.err}</div>;

View file

@ -181,7 +181,7 @@ export default class RoomSettingsDialog extends React.Component<IProps, IState>
return tabs;
}
public render(): JSX.Element {
public render(): React.ReactNode {
const roomName = this.state.roomName;
return (
<BaseDialog

View file

@ -68,7 +68,7 @@ export default class RoomUpgradeDialog extends React.Component<IProps, IState> {
});
};
public render(): JSX.Element {
public render(): React.ReactNode {
let buttons;
if (this.state.busy) {
buttons = <Spinner />;

View file

@ -100,7 +100,7 @@ export default class RoomUpgradeWarningDialog extends React.Component<IProps, IS
Modal.createDialog(BugReportDialog, {});
};
public render(): JSX.Element {
public render(): React.ReactNode {
const brand = SdkConfig.get().brand;
let inviteToggle = null;

View file

@ -73,7 +73,7 @@ export default abstract class ScrollableBaseModal<
protected abstract submit(): void;
protected abstract renderContent(): React.ReactNode;
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<MatrixClientContext.Provider value={this.matrixClient}>
<FocusLock

View file

@ -88,7 +88,7 @@ export default class ServerOfflineDialog extends React.PureComponent<IProps> {
});
}
public render(): JSX.Element {
public render(): React.ReactNode {
let timeline = this.renderTimeline().filter((c) => !!c); // remove nulls for next check
if (timeline.length === 0) {
timeline = [<div key={1}>{_t("You're all caught up.")}</div>];

View file

@ -163,7 +163,7 @@ export default class ServerPickerDialog extends React.PureComponent<IProps, ISta
this.props.onFinished(this.state.defaultChosen ? this.defaultServer : this.validatedConf);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let text;
if (this.defaultServer.hsName === "matrix.org") {
text = _t("Matrix.org is the biggest public homeserver in the world, so it's a good place for many.");

View file

@ -22,7 +22,7 @@ import DialogButtons from "../elements/DialogButtons";
import { IDialogProps } from "./IDialogProps";
export default class SeshatResetDialog extends React.PureComponent<IDialogProps> {
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
hasCancel={true}

View file

@ -54,7 +54,7 @@ export default class SessionRestoreErrorDialog extends React.Component<IProps> {
window.location.reload();
};
public render(): JSX.Element {
public render(): React.ReactNode {
const brand = SdkConfig.get().brand;
const clearStorageButton = (

View file

@ -138,7 +138,7 @@ export default class SetEmailDialog extends React.Component<IProps, IState> {
);
}
public render(): JSX.Element {
public render(): React.ReactNode {
const emailInput = this.state.emailBusy ? (
<Spinner />
) : (

View file

@ -71,14 +71,14 @@ interface IProps extends IDialogProps {
interface IState {
linkSpecificEvent: boolean;
permalinkCreator: RoomPermalinkCreator;
permalinkCreator: RoomPermalinkCreator | null;
}
export default class ShareDialog extends React.PureComponent<IProps, IState> {
public constructor(props: IProps) {
super(props);
let permalinkCreator: RoomPermalinkCreator = null;
let permalinkCreator: RoomPermalinkCreator | null = null;
if (props.target instanceof Room) {
permalinkCreator = new RoomPermalinkCreator(props.target);
permalinkCreator.load();
@ -108,15 +108,15 @@ export default class ShareDialog extends React.PureComponent<IProps, IState> {
if (this.props.target instanceof Room) {
if (this.state.linkSpecificEvent) {
const events = this.props.target.getLiveTimeline().getEvents();
matrixToUrl = this.state.permalinkCreator.forEvent(events[events.length - 1].getId());
matrixToUrl = this.state.permalinkCreator!.forEvent(events[events.length - 1].getId()!);
} else {
matrixToUrl = this.state.permalinkCreator.forShareableRoom();
matrixToUrl = this.state.permalinkCreator!.forShareableRoom();
}
} else if (this.props.target instanceof User || this.props.target instanceof RoomMember) {
matrixToUrl = makeUserPermalink(this.props.target.userId);
} else if (this.props.target instanceof MatrixEvent) {
if (this.state.linkSpecificEvent) {
matrixToUrl = this.props.permalinkCreator.forEvent(this.props.target.getId());
matrixToUrl = this.props.permalinkCreator.forEvent(this.props.target.getId()!);
} else {
matrixToUrl = this.props.permalinkCreator.forShareableRoom();
}
@ -124,7 +124,7 @@ export default class ShareDialog extends React.PureComponent<IProps, IState> {
return matrixToUrl;
}
public render(): JSX.Element {
public render(): React.ReactNode {
let title;
let checkbox;

View file

@ -37,7 +37,7 @@ export default class StorageEvictedDialog extends React.Component<IProps> {
this.props.onFinished(true);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let logRequest;
if (SdkConfig.get().bug_report_endpoint_url) {
logRequest = _t(

View file

@ -34,7 +34,7 @@ class TermsCheckbox extends React.PureComponent<ITermsCheckboxProps> {
this.props.onChange(this.props.url, ev.currentTarget.checked);
};
public render(): JSX.Element {
public render(): React.ReactNode {
return <input type="checkbox" onChange={this.onChange} checked={this.props.checked} />;
}
}
@ -126,7 +126,7 @@ export default class TermsDialog extends React.PureComponent<ITermsDialogProps,
});
};
public render(): JSX.Element {
public render(): React.ReactNode {
const rows = [];
for (const policiesAndService of this.props.policiesAndServicePairs) {
const parsedBaseUrl = url.parse(policiesAndService.service.baseUrl);

View file

@ -106,7 +106,7 @@ export default class TextInputDialog extends React.Component<IProps, IState> {
return result;
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_TextInputDialog"

View file

@ -65,7 +65,7 @@ export default class UploadConfirmDialog extends React.Component<IProps> {
this.props.onFinished(true, true);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let title: string;
if (this.props.totalFiles > 1 && this.props.currentIndex !== undefined) {
title = _t("Upload files (%(current)s of %(total)s)", {

View file

@ -43,7 +43,7 @@ export default class UploadFailureDialog extends React.Component<IProps> {
this.props.onFinished(true);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let message;
let preview;
let buttons;

View file

@ -210,7 +210,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState>
return tabs;
}
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_UserSettingsDialog"

View file

@ -47,7 +47,7 @@ export default class VerificationRequestDialog extends React.Component<IProps, I
}
}
public render(): JSX.Element {
public render(): React.ReactNode {
const request = this.state.verificationRequest;
const otherUserId = request && request.otherUserId;
const member = this.props.member || (otherUserId && MatrixClientPeg.get().getUser(otherUserId));

View file

@ -86,7 +86,7 @@ export default class WidgetCapabilitiesPromptDialog extends React.PureComponent<
this.props.onFinished({ approved, remember: this.state.rememberSelection });
}
public render(): JSX.Element {
public render(): React.ReactNode {
// We specifically order the timeline capabilities down to the bottom. The capability text
// generation cares strongly about this.
const orderedCapabilities = Object.entries(this.state.booleanStates).sort(([capA], [capB]) => {

View file

@ -73,7 +73,7 @@ export default class WidgetOpenIDPermissionsDialog extends React.PureComponent<I
this.setState({ rememberSelection: newVal });
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_WidgetOpenIDPermissionsDialog"

View file

@ -268,7 +268,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent<IProp
}
}
public render(): JSX.Element {
public render(): React.ReactNode {
const hasPassphrase =
this.props.keyInfo &&
this.props.keyInfo.passphrase &&

View file

@ -33,7 +33,7 @@ export default class ConfirmDestroyCrossSigningDialog extends React.Component<IP
this.props.onFinished(false);
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
className="mx_ConfirmDestroyCrossSigningDialog"

View file

@ -168,7 +168,7 @@ export default class CreateCrossSigningDialog extends React.PureComponent<IProps
this.props.onFinished(false);
};
public render(): JSX.Element {
public render(): React.ReactNode {
let content;
if (this.state.error) {
content = (

View file

@ -308,7 +308,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent<IProps,
}
}
public render(): JSX.Element {
public render(): React.ReactNode {
const backupHasPassphrase =
this.state.backupInfo &&
this.state.backupInfo.auth_data &&

View file

@ -57,7 +57,7 @@ export default class SetupEncryptionDialog extends React.Component<IProps, IStat
this.setState({ icon: iconFromPhase(this.store.phase) });
};
public render(): JSX.Element {
public render(): React.ReactNode {
return (
<BaseDialog
headerImage={this.state.icon}