Remove create-react-class

This commit is contained in:
Michael Telatynski 2020-08-29 12:14:16 +01:00
parent 672d0fe97b
commit 72498df28f
108 changed files with 3059 additions and 3545 deletions

View file

@ -17,7 +17,6 @@ limitations under the License.
*/
import React from 'react';
import createReactClass from 'create-react-class';
import PropTypes from 'prop-types';
import { _t } from '../../../languageHandler';
import * as sdk from '../../../index';
@ -40,50 +39,47 @@ const PHASE_EMAIL_SENT = 3;
// User has clicked the link in email and completed reset
const PHASE_DONE = 4;
export default createReactClass({
displayName: 'ForgotPassword',
propTypes: {
export default class ForgotPassword extends React.Component {
static propTypes = {
serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired,
onServerConfigChange: PropTypes.func.isRequired,
onLoginClick: PropTypes.func,
onComplete: PropTypes.func.isRequired,
},
};
getInitialState: function() {
return {
phase: PHASE_FORGOT,
email: "",
password: "",
password2: "",
errorText: null,
state = {
phase: PHASE_FORGOT,
email: "",
password: "",
password2: "",
errorText: null,
// We perform liveliness checks later, but for now suppress the errors.
// We also track the server dead errors independently of the regular errors so
// that we can render it differently, and override any other error the user may
// be seeing.
serverIsAlive: true,
serverErrorIsFatal: false,
serverDeadError: "",
serverRequiresIdServer: null,
};
},
// We perform liveliness checks later, but for now suppress the errors.
// We also track the server dead errors independently of the regular errors so
// that we can render it differently, and override any other error the user may
// be seeing.
serverIsAlive: true,
serverErrorIsFatal: false,
serverDeadError: "",
serverRequiresIdServer: null,
};
componentDidMount: function() {
componentDidMount() {
this.reset = null;
this._checkServerLiveliness(this.props.serverConfig);
},
}
// TODO: [REACT-WARNING] Replace with appropriate lifecycle event
UNSAFE_componentWillReceiveProps: function(newProps) {
// eslint-disable-next-line camelcase
UNSAFE_componentWillReceiveProps(newProps) {
if (newProps.serverConfig.hsUrl === this.props.serverConfig.hsUrl &&
newProps.serverConfig.isUrl === this.props.serverConfig.isUrl) return;
// Do a liveliness check on the new URLs
this._checkServerLiveliness(newProps.serverConfig);
},
}
_checkServerLiveliness: async function(serverConfig) {
async _checkServerLiveliness(serverConfig) {
try {
await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(
serverConfig.hsUrl,
@ -100,9 +96,9 @@ export default createReactClass({
} catch (e) {
this.setState(AutoDiscoveryUtils.authComponentStateForError(e, "forgot_password"));
}
},
}
submitPasswordReset: function(email, password) {
submitPasswordReset(email, password) {
this.setState({
phase: PHASE_SENDING_EMAIL,
});
@ -117,9 +113,9 @@ export default createReactClass({
phase: PHASE_FORGOT,
});
});
},
}
onVerify: async function(ev) {
onVerify = async ev => {
ev.preventDefault();
if (!this.reset) {
console.error("onVerify called before submitPasswordReset!");
@ -131,9 +127,9 @@ export default createReactClass({
} catch (err) {
this.showErrorDialog(err.message);
}
},
};
onSubmitForm: async function(ev) {
onSubmitForm = async ev => {
ev.preventDefault();
// refresh the server errors, just in case the server came back online
@ -166,41 +162,41 @@ export default createReactClass({
},
});
}
},
};
onInputChanged: function(stateKey, ev) {
onInputChanged = (stateKey, ev) => {
this.setState({
[stateKey]: ev.target.value,
});
},
};
async onServerDetailsNextPhaseClick() {
onServerDetailsNextPhaseClick = async () => {
this.setState({
phase: PHASE_FORGOT,
});
},
};
onEditServerDetailsClick(ev) {
onEditServerDetailsClick = ev => {
ev.preventDefault();
ev.stopPropagation();
this.setState({
phase: PHASE_SERVER_DETAILS,
});
},
};
onLoginClick: function(ev) {
onLoginClick = ev => {
ev.preventDefault();
ev.stopPropagation();
this.props.onLoginClick();
},
};
showErrorDialog: function(body, title) {
showErrorDialog(body, title) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Forgot Password Error', '', ErrorDialog, {
title: title,
description: body,
});
},
}
renderServerDetails() {
const ServerConfig = sdk.getComponent("auth.ServerConfig");
@ -218,7 +214,7 @@ export default createReactClass({
submitText={_t("Next")}
submitClass="mx_Login_submit"
/>;
},
}
renderForgot() {
const Field = sdk.getComponent('elements.Field');
@ -335,12 +331,12 @@ export default createReactClass({
{_t('Sign in instead')}
</a>
</div>;
},
}
renderSendingEmail() {
const Spinner = sdk.getComponent("elements.Spinner");
return <Spinner />;
},
}
renderEmailSent() {
return <div>
@ -350,7 +346,7 @@ export default createReactClass({
<input className="mx_Login_submit" type="button" onClick={this.onVerify}
value={_t('I have verified my email address')} />
</div>;
},
}
renderDone() {
return <div>
@ -363,9 +359,9 @@ export default createReactClass({
<input className="mx_Login_submit" type="button" onClick={this.props.onComplete}
value={_t('Return to login screen')} />
</div>;
},
}
render: function() {
render() {
const AuthHeader = sdk.getComponent("auth.AuthHeader");
const AuthBody = sdk.getComponent("auth.AuthBody");
@ -397,5 +393,5 @@ export default createReactClass({
</AuthBody>
</AuthPage>
);
},
});
}
}

View file

@ -17,7 +17,6 @@ limitations under the License.
*/
import React from 'react';
import createReactClass from 'create-react-class';
import PropTypes from 'prop-types';
import {_t, _td} from '../../../languageHandler';
import * as sdk from '../../../index';
@ -56,10 +55,8 @@ _td("General failure");
/**
* A wire component which glues together login UI components and Login logic
*/
export default createReactClass({
displayName: 'Login',
propTypes: {
export default class Login extends React.Component {
static propTypes = {
// Called when the user has logged in. Params:
// - The object returned by the login API
// - The user's password, if applicable, (may be cached in memory for a
@ -85,10 +82,14 @@ export default createReactClass({
serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired,
isSyncing: PropTypes.bool,
},
};
getInitialState: function() {
return {
constructor(props) {
super(props);
this._unmounted = false;
this.state = {
busy: false,
busyLoggingIn: null,
errorText: null,
@ -113,11 +114,6 @@ export default createReactClass({
serverErrorIsFatal: false,
serverDeadError: "",
};
},
// TODO: [REACT-WARNING] Move this to constructor
UNSAFE_componentWillMount: function() {
this._unmounted = false;
// map from login step type to a function which will render a control
// letting you do that login type
@ -130,11 +126,11 @@ export default createReactClass({
};
this._initLoginLogic();
},
}
componentWillUnmount: function() {
componentWillUnmount() {
this._unmounted = true;
},
}
// TODO: [REACT-WARNING] Replace with appropriate lifecycle event
UNSAFE_componentWillReceiveProps(newProps) {
@ -143,20 +139,18 @@ export default createReactClass({
// Ensure that we end up actually logging in to the right place
this._initLoginLogic(newProps.serverConfig.hsUrl, newProps.serverConfig.isUrl);
},
}
onPasswordLoginError: function(errorText) {
onPasswordLoginError = errorText => {
this.setState({
errorText,
loginIncorrect: Boolean(errorText),
});
},
};
isBusy: function() {
return this.state.busy || this.props.busy;
},
isBusy = () => this.state.busy || this.props.busy;
onPasswordLogin: async function(username, phoneCountry, phoneNumber, password) {
onPasswordLogin = async (username, phoneCountry, phoneNumber, password) => {
if (!this.state.serverIsAlive) {
this.setState({busy: true});
// Do a quick liveliness check on the URLs
@ -263,13 +257,13 @@ export default createReactClass({
loginIncorrect: error.httpStatus === 401 || error.httpStatus === 403,
});
});
},
};
onUsernameChanged: function(username) {
onUsernameChanged = username => {
this.setState({ username: username });
},
};
onUsernameBlur: async function(username) {
onUsernameBlur = async username => {
const doWellknownLookup = username[0] === "@";
this.setState({
username: username,
@ -314,19 +308,19 @@ export default createReactClass({
});
}
}
},
};
onPhoneCountryChanged: function(phoneCountry) {
onPhoneCountryChanged = phoneCountry => {
this.setState({ phoneCountry: phoneCountry });
},
};
onPhoneNumberChanged: function(phoneNumber) {
onPhoneNumberChanged = phoneNumber => {
this.setState({
phoneNumber: phoneNumber,
});
},
};
onPhoneNumberBlur: function(phoneNumber) {
onPhoneNumberBlur = phoneNumber => {
// Validate the phone number entered
if (!PHONE_NUMBER_REGEX.test(phoneNumber)) {
this.setState({
@ -339,15 +333,15 @@ export default createReactClass({
canTryLogin: true,
});
}
},
};
onRegisterClick: function(ev) {
onRegisterClick = ev => {
ev.preventDefault();
ev.stopPropagation();
this.props.onRegisterClick();
},
};
onTryRegisterClick: function(ev) {
onTryRegisterClick = ev => {
const step = this._getCurrentFlowStep();
if (step === 'm.login.sso' || step === 'm.login.cas') {
// If we're showing SSO it means that registration is also probably disabled,
@ -361,23 +355,23 @@ export default createReactClass({
// Don't intercept - just go through to the register page
this.onRegisterClick(ev);
}
},
};
async onServerDetailsNextPhaseClick() {
onServerDetailsNextPhaseClick = () => {
this.setState({
phase: PHASE_LOGIN,
});
},
};
onEditServerDetailsClick(ev) {
onEditServerDetailsClick = ev => {
ev.preventDefault();
ev.stopPropagation();
this.setState({
phase: PHASE_SERVER_DETAILS,
});
},
};
_initLoginLogic: async function(hsUrl, isUrl) {
async _initLoginLogic(hsUrl, isUrl) {
hsUrl = hsUrl || this.props.serverConfig.hsUrl;
isUrl = isUrl || this.props.serverConfig.isUrl;
@ -465,9 +459,9 @@ export default createReactClass({
busy: false,
});
});
},
}
_isSupportedFlow: function(flow) {
_isSupportedFlow(flow) {
// technically the flow can have multiple steps, but no one does this
// for login and loginLogic doesn't support it so we can ignore it.
if (!this._stepRendererMap[flow.type]) {
@ -475,11 +469,11 @@ export default createReactClass({
return false;
}
return true;
},
}
_getCurrentFlowStep: function() {
_getCurrentFlowStep() {
return this._loginLogic ? this._loginLogic.getCurrentFlowStep() : null;
},
}
_errorTextFromError(err) {
let errCode = err.errcode;
@ -526,7 +520,7 @@ export default createReactClass({
}
return errorText;
},
}
renderServerComponent() {
const ServerConfig = sdk.getComponent("auth.ServerConfig");
@ -552,7 +546,7 @@ export default createReactClass({
delayTimeMs={250}
{...serverDetailsProps}
/>;
},
}
renderLoginComponentForStep() {
if (PHASES_ENABLED && this.state.phase !== PHASE_LOGIN) {
@ -572,9 +566,9 @@ export default createReactClass({
}
return null;
},
}
_renderPasswordStep: function() {
_renderPasswordStep() {
const PasswordLogin = sdk.getComponent('auth.PasswordLogin');
let onEditServerDetailsClick = null;
@ -603,9 +597,9 @@ export default createReactClass({
busy={this.props.isSyncing || this.state.busyLoggingIn}
/>
);
},
}
_renderSsoStep: function(loginType) {
_renderSsoStep(loginType) {
const SignInToText = sdk.getComponent('views.auth.SignInToText');
let onEditServerDetailsClick = null;
@ -634,9 +628,9 @@ export default createReactClass({
/>
</div>
);
},
}
render: function() {
render() {
const Loader = sdk.getComponent("elements.Spinner");
const InlineSpinner = sdk.getComponent("elements.InlineSpinner");
const AuthHeader = sdk.getComponent("auth.AuthHeader");
@ -704,5 +698,5 @@ export default createReactClass({
</AuthBody>
</AuthPage>
);
},
});
}
}

View file

@ -15,29 +15,24 @@ limitations under the License.
*/
import React from 'react';
import createReactClass from 'create-react-class';
import PropTypes from 'prop-types';
import * as sdk from '../../../index';
import {MatrixClientPeg} from '../../../MatrixClientPeg';
import { _t } from '../../../languageHandler';
import AuthPage from "../../views/auth/AuthPage";
export default createReactClass({
displayName: 'PostRegistration',
propTypes: {
export default class PostRegistration extends React.Component {
static propTypes = {
onComplete: PropTypes.func.isRequired,
},
};
getInitialState: function() {
return {
avatarUrl: null,
errorString: null,
busy: false,
};
},
state = {
avatarUrl: null,
errorString: null,
busy: false,
};
componentDidMount: function() {
componentDidMount() {
// There is some assymetry between ChangeDisplayName and ChangeAvatar,
// as ChangeDisplayName will auto-get the name but ChangeAvatar expects
// the URL to be passed to you (because it's also used for room avatars).
@ -55,9 +50,9 @@ export default createReactClass({
busy: false,
});
});
},
}
render: function() {
render() {
const ChangeDisplayName = sdk.getComponent('settings.ChangeDisplayName');
const ChangeAvatar = sdk.getComponent('settings.ChangeAvatar');
const AuthHeader = sdk.getComponent('auth.AuthHeader');
@ -78,5 +73,5 @@ export default createReactClass({
</AuthBody>
</AuthPage>
);
},
});
}
}

View file

@ -19,7 +19,6 @@ limitations under the License.
import Matrix from 'matrix-js-sdk';
import React from 'react';
import createReactClass from 'create-react-class';
import PropTypes from 'prop-types';
import * as sdk from '../../../index';
import { _t, _td } from '../../../languageHandler';
@ -43,10 +42,8 @@ const PHASE_REGISTRATION = 1;
// Enable phases for registration
const PHASES_ENABLED = true;
export default createReactClass({
displayName: 'Registration',
propTypes: {
export default class Registration extends React.Component {
static propTypes = {
// Called when the user has logged in. Params:
// - object with userId, deviceId, homeserverUrl, identityServerUrl, accessToken
// - The user's password, if available and applicable (may be cached in memory
@ -65,12 +62,13 @@ export default createReactClass({
onLoginClick: PropTypes.func.isRequired,
onServerConfigChange: PropTypes.func.isRequired,
defaultDeviceDisplayName: PropTypes.string,
},
};
constructor(props) {
super(props);
getInitialState: function() {
const serverType = ServerType.getTypeFromServerConfig(this.props.serverConfig);
return {
this.state = {
busy: false,
errorText: null,
// We remember the values entered by the user because
@ -118,12 +116,12 @@ export default createReactClass({
// this is the user ID that's logged in.
differentLoggedInUserId: null,
};
},
}
componentDidMount: function() {
componentDidMount() {
this._unmounted = false;
this._replaceClient();
},
}
// TODO: [REACT-WARNING] Replace with appropriate lifecycle event
UNSAFE_componentWillReceiveProps(newProps) {
@ -142,7 +140,7 @@ export default createReactClass({
phase: this.getDefaultPhaseForServerType(serverType),
});
}
},
}
getDefaultPhaseForServerType(type) {
switch (type) {
@ -155,9 +153,9 @@ export default createReactClass({
case ServerType.ADVANCED:
return PHASE_SERVER_DETAILS;
}
},
}
onServerTypeChange(type) {
onServerTypeChange = type => {
this.setState({
serverType: type,
});
@ -184,9 +182,9 @@ export default createReactClass({
this.setState({
phase: this.getDefaultPhaseForServerType(type),
});
},
};
_replaceClient: async function(serverConfig) {
async _replaceClient(serverConfig) {
this.setState({
errorText: null,
serverDeadError: null,
@ -286,18 +284,18 @@ export default createReactClass({
showGenericError(e);
}
}
},
}
onFormSubmit: function(formVals) {
onFormSubmit = formVals => {
this.setState({
errorText: "",
busy: true,
formVals: formVals,
doingUIAuth: true,
});
},
};
_requestEmailToken: function(emailAddress, clientSecret, sendAttempt, sessionId) {
_requestEmailToken = (emailAddress, clientSecret, sendAttempt, sessionId) => {
return this.state.matrixClient.requestRegisterEmailToken(
emailAddress,
clientSecret,
@ -309,9 +307,9 @@ export default createReactClass({
session_id: sessionId,
}),
);
},
}
_onUIAuthFinished: async function(success, response, extra) {
_onUIAuthFinished = async (success, response, extra) => {
if (!success) {
let msg = response.message || response.toString();
// can we give a better error message?
@ -395,9 +393,9 @@ export default createReactClass({
}
this.setState(newState);
},
};
_setupPushers: function() {
_setupPushers() {
if (!this.props.brand) {
return Promise.resolve();
}
@ -418,15 +416,15 @@ export default createReactClass({
}, (error) => {
console.error("Couldn't get pushers: " + error);
});
},
}
onLoginClick: function(ev) {
onLoginClick = ev => {
ev.preventDefault();
ev.stopPropagation();
this.props.onLoginClick();
},
};
onGoToFormClicked(ev) {
onGoToFormClicked = ev => {
ev.preventDefault();
ev.stopPropagation();
this._replaceClient();
@ -435,23 +433,23 @@ export default createReactClass({
doingUIAuth: false,
phase: PHASE_REGISTRATION,
});
},
};
async onServerDetailsNextPhaseClick() {
onServerDetailsNextPhaseClick = async () => {
this.setState({
phase: PHASE_REGISTRATION,
});
},
};
onEditServerDetailsClick(ev) {
onEditServerDetailsClick = ev => {
ev.preventDefault();
ev.stopPropagation();
this.setState({
phase: PHASE_SERVER_DETAILS,
});
},
};
_makeRegisterRequest: function(auth) {
_makeRegisterRequest = auth => {
// We inhibit login if we're trying to register with an email address: this
// avoids a lot of complex race conditions that can occur if we try to log
// the user in one one or both of the tabs they might end up with after
@ -471,20 +469,20 @@ export default createReactClass({
if (auth) registerParams.auth = auth;
if (inhibitLogin !== undefined && inhibitLogin !== null) registerParams.inhibit_login = inhibitLogin;
return this.state.matrixClient.registerRequest(registerParams);
},
};
_getUIAuthInputs: function() {
_getUIAuthInputs() {
return {
emailAddress: this.state.formVals.email,
phoneCountry: this.state.formVals.phoneCountry,
phoneNumber: this.state.formVals.phoneNumber,
};
},
}
// 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?)
_onLoginClickWithCheck: async function(ev) {
_onLoginClickWithCheck = async ev => {
ev.preventDefault();
const sessionLoaded = await Lifecycle.loadSession({ignoreGuest: true});
@ -492,7 +490,7 @@ export default createReactClass({
// ok fine, there's still no session: really go to the login page
this.props.onLoginClick();
}
},
};
renderServerComponent() {
const ServerTypeSelector = sdk.getComponent("auth.ServerTypeSelector");
@ -553,7 +551,7 @@ export default createReactClass({
/>
{serverDetails}
</div>;
},
}
renderRegisterComponent() {
if (PHASES_ENABLED && this.state.phase !== PHASE_REGISTRATION) {
@ -608,9 +606,9 @@ export default createReactClass({
serverRequiresIdServer={this.state.serverRequiresIdServer}
/>;
}
},
}
render: function() {
render() {
const AuthHeader = sdk.getComponent('auth.AuthHeader');
const AuthBody = sdk.getComponent("auth.AuthBody");
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
@ -706,5 +704,5 @@ export default createReactClass({
</AuthBody>
</AuthPage>
);
},
});
}
}