Enable @typescript-eslint/explicit-function-return-type in /src (#9788)

* Enable `@typescript-eslint/explicit-member-accessibility` on /src

* Prettier

* Enable `@typescript-eslint/explicit-function-return-type` in /src

* Fix types

* tsc strict fixes

* Delint

* Fix test

* Fix bad merge
This commit is contained in:
Michael Telatynski 2023-01-12 13:25:14 +00:00 committed by GitHub
parent 7a36ba0fde
commit 030b7e90bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
683 changed files with 3459 additions and 3013 deletions

View file

@ -57,7 +57,7 @@ export default class CompleteSecurity extends React.Component<IProps, IState> {
store.stop();
}
public render() {
public render(): JSX.Element {
const { phase, lostKeys } = this.state;
let icon;
let title;

View file

@ -27,7 +27,7 @@ interface IProps {
}
export default class E2eSetup extends React.Component<IProps> {
public render() {
public render(): JSX.Element {
return (
<AuthPage>
<CompleteSecurityBody>

View file

@ -110,11 +110,11 @@ export default class ForgotPassword extends React.Component<Props, State> {
this.reset = new PasswordReset(this.props.serverConfig.hsUrl, this.props.serverConfig.isUrl);
}
public componentDidMount() {
public componentDidMount(): void {
this.checkServerCapabilities(this.props.serverConfig);
}
public componentDidUpdate(prevProps: Readonly<Props>) {
public componentDidUpdate(prevProps: Readonly<Props>): void {
if (
prevProps.serverConfig.hsUrl !== this.props.serverConfig.hsUrl ||
prevProps.serverConfig.isUrl !== this.props.serverConfig.isUrl
@ -159,7 +159,7 @@ export default class ForgotPassword extends React.Component<Props, State> {
});
}
private async onPhaseEmailInputSubmit() {
private async onPhaseEmailInputSubmit(): Promise<void> {
this.phase = Phase.SendingEmail;
if (await this.sendVerificationMail()) {
@ -213,7 +213,7 @@ export default class ForgotPassword extends React.Component<Props, State> {
});
}
private async onPhaseEmailSentSubmit() {
private async onPhaseEmailSentSubmit(): Promise<void> {
this.setState({
phase: Phase.PasswordInput,
});
@ -288,7 +288,7 @@ export default class ForgotPassword extends React.Component<Props, State> {
false,
false,
{
onBeforeClose: async (reason?: string) => {
onBeforeClose: async (reason?: string): Promise<boolean> => {
if (reason === "backgroundClick") {
// Modal dismissed by clicking the background.
// Go one phase back.
@ -342,7 +342,7 @@ export default class ForgotPassword extends React.Component<Props, State> {
}
};
private onInputChanged = (stateKey: string, ev: React.FormEvent<HTMLInputElement>) => {
private onInputChanged = (stateKey: string, ev: React.FormEvent<HTMLInputElement>): void => {
let value = ev.currentTarget.value;
if (stateKey === "email") value = value.trim();
this.setState({
@ -460,7 +460,7 @@ export default class ForgotPassword extends React.Component<Props, State> {
);
}
public renderDone() {
public renderDone(): JSX.Element {
return (
<>
<CheckboxIcon className="mx_Icon mx_Icon_32 mx_Icon_accent" />
@ -484,7 +484,7 @@ export default class ForgotPassword extends React.Component<Props, State> {
);
}
public render() {
public render(): JSX.Element {
let resetPasswordJsx: JSX.Element;
switch (this.state.phase) {

View file

@ -144,15 +144,15 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
};
}
public componentDidMount() {
public componentDidMount(): void {
this.initLoginLogic(this.props.serverConfig);
}
public componentWillUnmount() {
public componentWillUnmount(): void {
this.unmounted = true;
}
public componentDidUpdate(prevProps) {
public componentDidUpdate(prevProps): void {
if (
prevProps.serverConfig.hsUrl !== this.props.serverConfig.hsUrl ||
prevProps.serverConfig.isUrl !== this.props.serverConfig.isUrl
@ -162,9 +162,9 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
}
}
public isBusy = () => this.state.busy || this.props.busy;
public isBusy = (): boolean => this.state.busy || this.props.busy;
public onPasswordLogin = async (username, phoneCountry, phoneNumber, password) => {
public onPasswordLogin = async (username, phoneCountry, phoneNumber, password): Promise<void> => {
if (!this.state.serverIsAlive) {
this.setState({ busy: true });
// Do a quick liveliness check on the URLs
@ -264,11 +264,11 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
);
};
public onUsernameChanged = (username) => {
public onUsernameChanged = (username): void => {
this.setState({ username: username });
};
public onUsernameBlur = async (username) => {
public onUsernameBlur = async (username): Promise<void> => {
const doWellknownLookup = username[0] === "@";
this.setState({
username: username,
@ -315,23 +315,23 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
}
};
public onPhoneCountryChanged = (phoneCountry) => {
public onPhoneCountryChanged = (phoneCountry): void => {
this.setState({ phoneCountry: phoneCountry });
};
public onPhoneNumberChanged = (phoneNumber) => {
public onPhoneNumberChanged = (phoneNumber): void => {
this.setState({
phoneNumber: phoneNumber,
});
};
public onRegisterClick = (ev) => {
public onRegisterClick = (ev): void => {
ev.preventDefault();
ev.stopPropagation();
this.props.onRegisterClick();
};
public onTryRegisterClick = (ev) => {
public onTryRegisterClick = (ev): void => {
const hasPasswordFlow = this.state.flows?.find((flow) => flow.type === "m.login.password");
const ssoFlow = this.state.flows?.find((flow) => flow.type === "m.login.sso" || flow.type === "m.login.cas");
// If has no password flow but an SSO flow guess that the user wants to register with SSO.
@ -352,7 +352,7 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
}
};
private async initLoginLogic({ hsUrl, isUrl }: ValidatedServerConfig) {
private async initLoginLogic({ hsUrl, isUrl }: ValidatedServerConfig): Promise<void> {
let isDefaultServer = false;
if (
this.props.serverConfig.isDefault &&
@ -502,7 +502,7 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
return errorText;
}
public renderLoginComponentForFlows() {
public renderLoginComponentForFlows(): JSX.Element {
if (!this.state.flows) return null;
// this is the ideal order we want to show the flows in
@ -519,7 +519,7 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
);
}
private renderPasswordStep = () => {
private renderPasswordStep = (): JSX.Element => {
return (
<PasswordLogin
onSubmit={this.onPasswordLogin}
@ -539,7 +539,7 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
);
};
private renderSsoStep = (loginType) => {
private renderSsoStep = (loginType): JSX.Element => {
const flow = this.state.flows.find((flow) => flow.type === "m.login." + loginType) as ISSOFlow;
return (
@ -553,7 +553,7 @@ export default class LoginComponent extends React.PureComponent<IProps, IState>
);
};
public render() {
public render(): JSX.Element {
const loader =
this.isBusy() && !this.state.busyLoggingIn ? (
<div className="mx_Login_loader">

View file

@ -14,9 +14,9 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import { AuthType, createClient, IAuthData } from "matrix-js-sdk/src/matrix";
import { AuthType, createClient, IAuthData, IInputs } from "matrix-js-sdk/src/matrix";
import React, { Fragment, ReactNode } from "react";
import { MatrixClient } from "matrix-js-sdk/src/client";
import { IRequestTokenResponse, MatrixClient } from "matrix-js-sdk/src/client";
import classNames from "classnames";
import { logger } from "matrix-js-sdk/src/logger";
import { ISSOFlow } from "matrix-js-sdk/src/@types/auth";
@ -32,7 +32,7 @@ import dis from "../../../dispatcher/dispatcher";
import SSOButtons from "../../views/elements/SSOButtons";
import ServerPicker from "../../views/elements/ServerPicker";
import RegistrationForm from "../../views/auth/RegistrationForm";
import AccessibleButton from "../../views/elements/AccessibleButton";
import AccessibleButton, { ButtonEvent } from "../../views/elements/AccessibleButton";
import AuthBody from "../../views/auth/AuthBody";
import AuthHeader from "../../views/auth/AuthHeader";
import InteractiveAuth, { InteractiveAuthCallback } from "../InteractiveAuth";
@ -42,7 +42,7 @@ import { AuthHeaderProvider } from "./header/AuthHeaderProvider";
import SettingsStore from "../../../settings/SettingsStore";
import { ValidatedServerConfig } from "../../../utils/ValidatedServerConfig";
const debuglog = (...args: any[]) => {
const debuglog = (...args: any[]): void => {
if (SettingsStore.getValue("debug_registration")) {
logger.log.call(console, "Registration debuglog:", ...args);
}
@ -148,17 +148,17 @@ export default class Registration extends React.Component<IProps, IState> {
});
}
public componentDidMount() {
public componentDidMount(): void {
this.replaceClient(this.props.serverConfig);
//triggers a confirmation dialog for data loss before page unloads/refreshes
window.addEventListener("beforeunload", this.unloadCallback);
}
public componentWillUnmount() {
public componentWillUnmount(): void {
window.removeEventListener("beforeunload", this.unloadCallback);
}
private unloadCallback = (event: BeforeUnloadEvent) => {
private unloadCallback = (event: BeforeUnloadEvent): string => {
if (this.state.doingUIAuth) {
event.preventDefault();
event.returnValue = "";
@ -166,7 +166,7 @@ export default class Registration extends React.Component<IProps, IState> {
}
};
public componentDidUpdate(prevProps) {
public componentDidUpdate(prevProps): void {
if (
prevProps.serverConfig.hsUrl !== this.props.serverConfig.hsUrl ||
prevProps.serverConfig.isUrl !== this.props.serverConfig.isUrl
@ -175,7 +175,7 @@ export default class Registration extends React.Component<IProps, IState> {
}
}
private async replaceClient(serverConfig: ValidatedServerConfig) {
private async replaceClient(serverConfig: ValidatedServerConfig): Promise<void> {
this.latestServerConfig = serverConfig;
const { hsUrl, isUrl } = serverConfig;
@ -283,7 +283,12 @@ export default class Registration extends React.Component<IProps, IState> {
});
};
private requestEmailToken = (emailAddress, clientSecret, sendAttempt, sessionId) => {
private requestEmailToken = (
emailAddress: string,
clientSecret: string,
sendAttempt: number,
sessionId: string,
): Promise<IRequestTokenResponse> => {
return this.state.matrixClient.requestRegisterEmailToken(
emailAddress,
clientSecret,
@ -297,10 +302,10 @@ export default class Registration extends React.Component<IProps, IState> {
);
};
private onUIAuthFinished: InteractiveAuthCallback = async (success, response) => {
private onUIAuthFinished: InteractiveAuthCallback = async (success, response): Promise<void> => {
debuglog("Registration: ui authentication finished: ", { success, response });
if (!success) {
let errorText: ReactNode = response.message || response.toString();
let errorText: ReactNode = (response as Error).message || (response as Error).toString();
// can we give a better error message?
if (response.errcode === "M_RESOURCE_LIMIT_EXCEEDED") {
const errorTop = messageForResourceLimitError(response.data.limit_type, response.data.admin_contact, {
@ -404,7 +409,7 @@ export default class Registration extends React.Component<IProps, IState> {
this.setState(newState);
};
private setupPushers() {
private setupPushers(): Promise<void> {
if (!this.props.brand) {
return Promise.resolve();
}
@ -433,13 +438,13 @@ export default class Registration extends React.Component<IProps, IState> {
);
}
private onLoginClick = (ev) => {
private onLoginClick = (ev: ButtonEvent): void => {
ev.preventDefault();
ev.stopPropagation();
this.props.onLoginClick();
};
private onGoToFormClicked = (ev) => {
private onGoToFormClicked = (ev: ButtonEvent): void => {
ev.preventDefault();
ev.stopPropagation();
this.replaceClient(this.props.serverConfig);
@ -449,7 +454,7 @@ export default class Registration extends React.Component<IProps, IState> {
});
};
private makeRegisterRequest = (auth: IAuthData | null) => {
private makeRegisterRequest = (auth: IAuthData | null): Promise<IAuthData> => {
const registerParams = {
username: this.state.formVals.username,
password: this.state.formVals.password,
@ -464,7 +469,7 @@ export default class Registration extends React.Component<IProps, IState> {
return this.state.matrixClient.registerRequest(registerParams);
};
private getUIAuthInputs() {
private getUIAuthInputs(): IInputs {
return {
emailAddress: this.state.formVals.email,
phoneCountry: this.state.formVals.phoneCountry,
@ -475,7 +480,7 @@ export default class Registration extends React.Component<IProps, IState> {
// Links to the login page shown after registration is completed are routed through this
// which checks the user hasn't already logged in somewhere else (perhaps we should do
// this more generally?)
private onLoginClickWithCheck = async (ev) => {
private onLoginClickWithCheck = async (ev: ButtonEvent): Promise<boolean> => {
ev.preventDefault();
const sessionLoaded = await Lifecycle.loadSession({ ignoreGuest: true });
@ -487,7 +492,7 @@ export default class Registration extends React.Component<IProps, IState> {
return sessionLoaded;
};
private renderRegisterComponent() {
private renderRegisterComponent(): JSX.Element {
if (this.state.matrixClient && this.state.doingUIAuth) {
return (
<InteractiveAuth
@ -565,7 +570,7 @@ export default class Registration extends React.Component<IProps, IState> {
}
}
public render() {
public render(): JSX.Element {
let errorText;
const err = this.state.errorText;
if (err) {
@ -627,7 +632,7 @@ export default class Registration extends React.Component<IProps, IState> {
<p>
<AccessibleButton
kind="link_inline"
onClick={async (event) => {
onClick={async (event: ButtonEvent): Promise<void> => {
const sessionLoaded = await this.onLoginClickWithCheck(event);
if (sessionLoaded) {
dis.dispatch({ action: "view_welcome_page" });
@ -651,7 +656,7 @@ export default class Registration extends React.Component<IProps, IState> {
a: (sub) => (
<AccessibleButton
kind="link_inline"
onClick={async (event) => {
onClick={async (event: ButtonEvent): Promise<void> => {
const sessionLoaded = await this.onLoginClickWithCheck(event);
if (sessionLoaded) {
dis.dispatch({ action: "view_home_page" });

View file

@ -61,7 +61,7 @@ export default class SetupEncryptionBody extends React.Component<IProps, IState>
};
}
private onStoreUpdate = () => {
private onStoreUpdate = (): void => {
const store = SetupEncryptionStore.sharedInstance();
if (store.phase === Phase.Finished) {
this.props.onFinished();
@ -75,18 +75,18 @@ export default class SetupEncryptionBody extends React.Component<IProps, IState>
});
};
public componentWillUnmount() {
public componentWillUnmount(): void {
const store = SetupEncryptionStore.sharedInstance();
store.off("update", this.onStoreUpdate);
store.stop();
}
private onUsePassphraseClick = async () => {
private onUsePassphraseClick = async (): Promise<void> => {
const store = SetupEncryptionStore.sharedInstance();
store.usePassPhrase();
};
private onVerifyClick = () => {
private onVerifyClick = (): void => {
const cli = MatrixClientPeg.get();
const userId = cli.getUserId();
const requestPromise = cli.requestVerification(userId);
@ -97,7 +97,7 @@ export default class SetupEncryptionBody extends React.Component<IProps, IState>
Modal.createDialog(VerificationRequestDialog, {
verificationRequestPromise: requestPromise,
member: cli.getUser(userId),
onFinished: async () => {
onFinished: async (): Promise<void> => {
const request = await requestPromise;
request.cancel();
this.props.onFinished();
@ -105,43 +105,43 @@ export default class SetupEncryptionBody extends React.Component<IProps, IState>
});
};
private onSkipConfirmClick = () => {
private onSkipConfirmClick = (): void => {
const store = SetupEncryptionStore.sharedInstance();
store.skipConfirm();
};
private onSkipBackClick = () => {
private onSkipBackClick = (): void => {
const store = SetupEncryptionStore.sharedInstance();
store.returnAfterSkip();
};
private onResetClick = (ev: React.MouseEvent<HTMLButtonElement>) => {
private onResetClick = (ev: React.MouseEvent<HTMLButtonElement>): void => {
ev.preventDefault();
const store = SetupEncryptionStore.sharedInstance();
store.reset();
};
private onResetConfirmClick = () => {
private onResetConfirmClick = (): void => {
this.props.onFinished();
const store = SetupEncryptionStore.sharedInstance();
store.resetConfirm();
};
private onResetBackClick = () => {
private onResetBackClick = (): void => {
const store = SetupEncryptionStore.sharedInstance();
store.returnAfterReset();
};
private onDoneClick = () => {
private onDoneClick = (): void => {
const store = SetupEncryptionStore.sharedInstance();
store.done();
};
private onEncryptionPanelClose = () => {
private onEncryptionPanelClose = (): void => {
this.props.onFinished();
};
public render() {
public render(): JSX.Element {
const { phase, lostKeys } = this.state;
if (this.state.verificationRequest) {

View file

@ -101,7 +101,7 @@ export default class SoftLogout extends React.Component<IProps, IState> {
}
}
private onClearAll = () => {
private onClearAll = (): void => {
Modal.createDialog(ConfirmWipeDeviceDialog, {
onFinished: (wipeData) => {
if (!wipeData) return;
@ -112,7 +112,7 @@ export default class SoftLogout extends React.Component<IProps, IState> {
});
};
private async initLogin() {
private async initLogin(): Promise<void> {
const queryParams = this.props.realQueryParams;
const hasAllParams = queryParams && queryParams["loginToken"];
if (hasAllParams) {
@ -133,15 +133,15 @@ export default class SoftLogout extends React.Component<IProps, IState> {
this.setState({ flows, loginView: chosenView });
}
private onPasswordChange = (ev) => {
private onPasswordChange = (ev): void => {
this.setState({ password: ev.target.value });
};
private onForgotPassword = () => {
private onForgotPassword = (): void => {
dis.dispatch({ action: "start_password_recovery" });
};
private onPasswordLogin = async (ev) => {
private onPasswordLogin = async (ev): Promise<void> => {
ev.preventDefault();
ev.stopPropagation();
@ -181,7 +181,7 @@ export default class SoftLogout extends React.Component<IProps, IState> {
});
};
private async trySsoLogin() {
private async trySsoLogin(): Promise<void> {
this.setState({ busy: true });
const hsUrl = localStorage.getItem(SSO_HOMESERVER_URL_KEY);
@ -261,7 +261,7 @@ export default class SoftLogout extends React.Component<IProps, IState> {
);
}
private renderSignInSection() {
private renderSignInSection(): JSX.Element {
if (this.state.loginView === LoginView.Loading) {
return <Spinner />;
}
@ -325,7 +325,7 @@ export default class SoftLogout extends React.Component<IProps, IState> {
);
}
public render() {
public render(): JSX.Element {
return (
<AuthPage>
<AuthHeader />

View file

@ -50,7 +50,7 @@ export const EnterEmail: React.FC<EnterEmailProps> = ({
const emailFieldRef = useRef<Field>(null);
const onSubmit = async (event: React.FormEvent) => {
const onSubmit = async (event: React.FormEvent): Promise<void> => {
if (await emailFieldRef.current?.validate({ allowEmpty: false })) {
onSubmitForm(event);
return;

View file

@ -24,7 +24,7 @@ interface Props {
serverPicker: ReactNode;
}
export function AuthHeaderDisplay({ title, icon, serverPicker, children }: PropsWithChildren<Props>) {
export function AuthHeaderDisplay({ title, icon, serverPicker, children }: PropsWithChildren<Props>): JSX.Element {
const context = useContext(AuthHeaderContext);
if (!context) {
return null;

View file

@ -25,7 +25,7 @@ interface Props {
hideServerPicker?: boolean;
}
export function AuthHeaderModifier(props: Props) {
export function AuthHeaderModifier(props: Props): null {
const context = useContext(AuthHeaderContext);
const dispatch = context ? context.dispatch : null;
useEffect(() => {

View file

@ -32,7 +32,7 @@ interface AuthHeaderAction {
export type AuthHeaderReducer = Reducer<ComponentProps<typeof AuthHeaderModifier>[], AuthHeaderAction>;
export function AuthHeaderProvider({ children }: PropsWithChildren<{}>) {
export function AuthHeaderProvider({ children }: PropsWithChildren<{}>): JSX.Element {
const [state, dispatch] = useReducer<AuthHeaderReducer>(
(state: ComponentProps<typeof AuthHeaderModifier>[], action: AuthHeaderAction) => {
switch (action.type) {