Wire up server type selector, similar to login flow
This commit is contained in:
parent
ad76451655
commit
23fc4417e8
1 changed files with 150 additions and 54 deletions
|
@ -23,13 +23,22 @@ import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import RegistrationForm from '../../views/auth/RegistrationForm';
|
|
||||||
import { _t, _td } from '../../../languageHandler';
|
import { _t, _td } from '../../../languageHandler';
|
||||||
import SdkConfig from '../../../SdkConfig';
|
import SdkConfig from '../../../SdkConfig';
|
||||||
import { messageForResourceLimitError } from '../../../utils/ErrorUtils';
|
import { messageForResourceLimitError } from '../../../utils/ErrorUtils';
|
||||||
|
import * as ServerType from '../../views/auth/ServerTypeSelector';
|
||||||
|
|
||||||
const MIN_PASSWORD_LENGTH = 6;
|
const MIN_PASSWORD_LENGTH = 6;
|
||||||
|
|
||||||
|
// Phases
|
||||||
|
// Show controls to configure server details
|
||||||
|
const PHASE_SERVER_DETAILS = 0;
|
||||||
|
// Show the appropriate registration flow(s) for the server
|
||||||
|
const PHASE_REGISTRATION = 1;
|
||||||
|
|
||||||
|
// Enable phases for registration
|
||||||
|
const PHASES_ENABLED = true;
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'Registration',
|
displayName: 'Registration',
|
||||||
|
|
||||||
|
@ -82,6 +91,7 @@ module.exports = React.createClass({
|
||||||
// If we've been given a session ID, we're resuming
|
// If we've been given a session ID, we're resuming
|
||||||
// straight back into UI auth
|
// straight back into UI auth
|
||||||
doingUIAuth: Boolean(this.props.sessionId),
|
doingUIAuth: Boolean(this.props.sessionId),
|
||||||
|
serverType: null,
|
||||||
hsUrl: this.props.customHsUrl,
|
hsUrl: this.props.customHsUrl,
|
||||||
isUrl: this.props.customIsUrl,
|
isUrl: this.props.customIsUrl,
|
||||||
flows: null,
|
flows: null,
|
||||||
|
@ -107,6 +117,39 @@ module.exports = React.createClass({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onServerTypeChange(type) {
|
||||||
|
this.setState({
|
||||||
|
serverType: type,
|
||||||
|
});
|
||||||
|
|
||||||
|
// When changing server types, set the HS / IS URLs to reasonable defaults for the
|
||||||
|
// the new type.
|
||||||
|
switch (type) {
|
||||||
|
case ServerType.FREE: {
|
||||||
|
const { hsUrl, isUrl } = ServerType.TYPES.FREE;
|
||||||
|
this.onServerConfigChange({
|
||||||
|
hsUrl,
|
||||||
|
isUrl,
|
||||||
|
});
|
||||||
|
// Move directly to the registration phase since the server details are fixed.
|
||||||
|
this.setState({
|
||||||
|
phase: PHASE_REGISTRATION,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerType.PREMIUM:
|
||||||
|
case ServerType.ADVANCED:
|
||||||
|
this.onServerConfigChange({
|
||||||
|
hsUrl: this.props.defaultHsUrl,
|
||||||
|
isUrl: this.props.defaultIsUrl,
|
||||||
|
});
|
||||||
|
this.setState({
|
||||||
|
phase: PHASE_SERVER_DETAILS,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_replaceClient: async function() {
|
_replaceClient: async function() {
|
||||||
this._matrixClient = Matrix.createClient({
|
this._matrixClient = Matrix.createClient({
|
||||||
baseUrl: this.state.hsUrl,
|
baseUrl: this.state.hsUrl,
|
||||||
|
@ -300,62 +343,114 @@ module.exports = React.createClass({
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
renderServerComponent() {
|
||||||
|
const ServerTypeSelector = sdk.getComponent("auth.ServerTypeSelector");
|
||||||
|
const ServerConfig = sdk.getComponent("auth.ServerConfig");
|
||||||
|
const ModularServerConfig = sdk.getComponent("auth.ModularServerConfig");
|
||||||
|
const AccessibleButton = sdk.getComponent("elements.AccessibleButton");
|
||||||
|
|
||||||
|
// TODO: May need to adjust the behavior of this config option
|
||||||
|
if (SdkConfig.get()['disable_custom_urls']) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're on a different phase, we only show the server type selector,
|
||||||
|
// which is always shown if we allow custom URLs at all.
|
||||||
|
if (PHASES_ENABLED && this.state.phase !== PHASE_SERVER_DETAILS) {
|
||||||
|
return <div>
|
||||||
|
<ServerTypeSelector
|
||||||
|
defaultHsUrl={this.props.defaultHsUrl}
|
||||||
|
onChange={this.onServerTypeChange}
|
||||||
|
/>
|
||||||
|
</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
let serverDetails = null;
|
||||||
|
switch (this.state.serverType) {
|
||||||
|
case ServerType.FREE:
|
||||||
|
break;
|
||||||
|
case ServerType.PREMIUM:
|
||||||
|
serverDetails = <ModularServerConfig
|
||||||
|
customHsUrl={this.state.discoveredHsUrl || this.props.customHsUrl}
|
||||||
|
defaultHsUrl={this.props.defaultHsUrl}
|
||||||
|
defaultIsUrl={this.props.defaultIsUrl}
|
||||||
|
onServerConfigChange={this.onServerConfigChange}
|
||||||
|
delayTimeMs={1000}
|
||||||
|
/>;
|
||||||
|
break;
|
||||||
|
case ServerType.ADVANCED:
|
||||||
|
serverDetails = <ServerConfig
|
||||||
|
customHsUrl={this.state.discoveredHsUrl || this.props.customHsUrl}
|
||||||
|
customIsUrl={this.state.discoveredIsUrl || this.props.customIsUrl}
|
||||||
|
defaultHsUrl={this.props.defaultHsUrl}
|
||||||
|
defaultIsUrl={this.props.defaultIsUrl}
|
||||||
|
onServerConfigChange={this.onServerConfigChange}
|
||||||
|
delayTimeMs={1000}
|
||||||
|
/>;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let nextButton = null;
|
||||||
|
if (PHASES_ENABLED) {
|
||||||
|
nextButton = <AccessibleButton className="mx_Login_submit"
|
||||||
|
onClick={this.onServerDetailsNextPhaseClick}
|
||||||
|
>
|
||||||
|
{_t("Next")}
|
||||||
|
</AccessibleButton>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div>
|
||||||
|
<ServerTypeSelector
|
||||||
|
defaultHsUrl={this.props.defaultHsUrl}
|
||||||
|
onChange={this.onServerTypeChange}
|
||||||
|
/>
|
||||||
|
{serverDetails}
|
||||||
|
{nextButton}
|
||||||
|
</div>;
|
||||||
|
},
|
||||||
|
|
||||||
|
renderRegisterComponent() {
|
||||||
|
if (PHASES_ENABLED && this.state.phase !== PHASE_REGISTRATION) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const InteractiveAuth = sdk.getComponent('structures.InteractiveAuth');
|
||||||
|
const Spinner = sdk.getComponent('elements.Spinner');
|
||||||
|
const RegistrationForm = sdk.getComponent('auth.RegistrationForm');
|
||||||
|
|
||||||
|
if (this.state.doingUIAuth) {
|
||||||
|
return <InteractiveAuth
|
||||||
|
matrixClient={this._matrixClient}
|
||||||
|
makeRequest={this._makeRegisterRequest}
|
||||||
|
onAuthFinished={this._onUIAuthFinished}
|
||||||
|
inputs={this._getUIAuthInputs()}
|
||||||
|
makeRegistrationUrl={this.props.makeRegistrationUrl}
|
||||||
|
sessionId={this.props.sessionId}
|
||||||
|
clientSecret={this.props.clientSecret}
|
||||||
|
emailSid={this.props.idSid}
|
||||||
|
poll={true}
|
||||||
|
/>;
|
||||||
|
} else if (this.state.busy || !this.state.flows) {
|
||||||
|
return <Spinner />;
|
||||||
|
} else {
|
||||||
|
return <RegistrationForm
|
||||||
|
defaultUsername={this.state.formVals.username}
|
||||||
|
defaultEmail={this.state.formVals.email}
|
||||||
|
defaultPhoneCountry={this.state.formVals.phoneCountry}
|
||||||
|
defaultPhoneNumber={this.state.formVals.phoneNumber}
|
||||||
|
defaultPassword={this.state.formVals.password}
|
||||||
|
minPasswordLength={MIN_PASSWORD_LENGTH}
|
||||||
|
onError={this.onFormValidationFailed}
|
||||||
|
onRegisterClick={this.onFormSubmit}
|
||||||
|
flows={this.state.flows}
|
||||||
|
/>;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
render: function() {
|
render: function() {
|
||||||
const AuthHeader = sdk.getComponent('auth.AuthHeader');
|
const AuthHeader = sdk.getComponent('auth.AuthHeader');
|
||||||
const AuthBody = sdk.getComponent("auth.AuthBody");
|
const AuthBody = sdk.getComponent("auth.AuthBody");
|
||||||
const AuthPage = sdk.getComponent('auth.AuthPage');
|
const AuthPage = sdk.getComponent('auth.AuthPage');
|
||||||
const InteractiveAuth = sdk.getComponent('structures.InteractiveAuth');
|
|
||||||
const Spinner = sdk.getComponent("elements.Spinner");
|
|
||||||
const ServerConfig = sdk.getComponent('views.auth.ServerConfig');
|
|
||||||
|
|
||||||
let registerBody;
|
|
||||||
if (this.state.doingUIAuth) {
|
|
||||||
registerBody = (
|
|
||||||
<InteractiveAuth
|
|
||||||
matrixClient={this._matrixClient}
|
|
||||||
makeRequest={this._makeRegisterRequest}
|
|
||||||
onAuthFinished={this._onUIAuthFinished}
|
|
||||||
inputs={this._getUIAuthInputs()}
|
|
||||||
makeRegistrationUrl={this.props.makeRegistrationUrl}
|
|
||||||
sessionId={this.props.sessionId}
|
|
||||||
clientSecret={this.props.clientSecret}
|
|
||||||
emailSid={this.props.idSid}
|
|
||||||
poll={true}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
} else if (this.state.busy || !this.state.flows) {
|
|
||||||
registerBody = <Spinner />;
|
|
||||||
} else {
|
|
||||||
let serverConfigSection;
|
|
||||||
if (!SdkConfig.get()['disable_custom_urls']) {
|
|
||||||
serverConfigSection = (
|
|
||||||
<ServerConfig ref="serverConfig"
|
|
||||||
customHsUrl={this.props.customHsUrl}
|
|
||||||
customIsUrl={this.props.customIsUrl}
|
|
||||||
defaultHsUrl={this.props.defaultHsUrl}
|
|
||||||
defaultIsUrl={this.props.defaultIsUrl}
|
|
||||||
onServerConfigChange={this.onServerConfigChange}
|
|
||||||
delayTimeMs={1000}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
registerBody = (
|
|
||||||
<div>
|
|
||||||
<RegistrationForm
|
|
||||||
defaultUsername={this.state.formVals.username}
|
|
||||||
defaultEmail={this.state.formVals.email}
|
|
||||||
defaultPhoneCountry={this.state.formVals.phoneCountry}
|
|
||||||
defaultPhoneNumber={this.state.formVals.phoneNumber}
|
|
||||||
defaultPassword={this.state.formVals.password}
|
|
||||||
minPasswordLength={MIN_PASSWORD_LENGTH}
|
|
||||||
onError={this.onFormValidationFailed}
|
|
||||||
onRegisterClick={this.onFormSubmit}
|
|
||||||
flows={this.state.flows}
|
|
||||||
/>
|
|
||||||
{ serverConfigSection }
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let errorText;
|
let errorText;
|
||||||
const err = this.state.errorText || this.props.defaultServerDiscoveryError;
|
const err = this.state.errorText || this.props.defaultServerDiscoveryError;
|
||||||
|
@ -378,7 +473,8 @@ module.exports = React.createClass({
|
||||||
<AuthBody>
|
<AuthBody>
|
||||||
<h2>{ _t('Create your account') }</h2>
|
<h2>{ _t('Create your account') }</h2>
|
||||||
{ errorText }
|
{ errorText }
|
||||||
{ registerBody }
|
{ this.renderServerComponent() }
|
||||||
|
{ this.renderRegisterComponent() }
|
||||||
{ signIn }
|
{ signIn }
|
||||||
</AuthBody>
|
</AuthBody>
|
||||||
</AuthPage>
|
</AuthPage>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue