diff --git a/src/RtsClient.js b/src/RtsClient.js
new file mode 100644
index 0000000000..25ed71b72b
--- /dev/null
+++ b/src/RtsClient.js
@@ -0,0 +1,15 @@
+const q = require('q');
+const request = q.nfbind(require('browser-request'));
+
+export default class RtsClient {
+ constructor(url) {
+ this._url = url;
+ }
+
+ getTeamsConfig() {
+ return request({
+ url: this._url + '/teams',
+ json: true,
+ });
+ }
+}
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index cb61041d48..989ae5aace 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -1060,7 +1060,7 @@ module.exports = React.createClass({
defaultHsUrl={this.getDefaultHsUrl()}
defaultIsUrl={this.getDefaultIsUrl()}
brand={this.props.config.brand}
- teamsConfig={this.props.config.teamsConfig}
+ teamServerConfig={this.props.config.teamServerConfig}
customHsUrl={this.getCurrentHsUrl()}
customIsUrl={this.getCurrentIsUrl()}
registrationUrl={this.props.registrationUrl}
diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js
index 20c26c6b22..730f31c8ad 100644
--- a/src/components/structures/login/Registration.js
+++ b/src/components/structures/login/Registration.js
@@ -25,6 +25,7 @@ var ServerConfig = require("../../views/login/ServerConfig");
var MatrixClientPeg = require("../../../MatrixClientPeg");
var RegistrationForm = require("../../views/login/RegistrationForm");
var CaptchaForm = require("../../views/login/CaptchaForm");
+var RtsClient = require("../../../RtsClient");
var MIN_PASSWORD_LENGTH = 6;
@@ -49,20 +50,11 @@ module.exports = React.createClass({
email: React.PropTypes.string,
username: React.PropTypes.string,
guestAccessToken: React.PropTypes.string,
- teamsConfig: React.PropTypes.shape({
+ teamServerConfig: React.PropTypes.shape({
// Email address to request new teams
- supportEmail: React.PropTypes.string,
- teams: React.PropTypes.arrayOf(React.PropTypes.shape({
- // The displayed name of the team
- "name": React.PropTypes.string,
- // The suffix with which every team email address ends
- "emailSuffix": React.PropTypes.string,
- // The rooms to use during auto-join
- "rooms": React.PropTypes.arrayOf(React.PropTypes.shape({
- "id": React.PropTypes.string,
- "autoJoin": React.PropTypes.bool,
- })),
- })).required,
+ supportEmail: React.PropTypes.string.isRequired,
+ // URL of the riot-team-server to get team configurations and track referrals
+ teamServerURL: React.PropTypes.string.isRequired,
}),
defaultDeviceDisplayName: React.PropTypes.string,
@@ -75,6 +67,7 @@ module.exports = React.createClass({
getInitialState: function() {
return {
busy: false,
+ teamServerBusy: false,
errorText: null,
// We remember the values entered by the user because
// the registration form will be unmounted during the
@@ -104,6 +97,36 @@ module.exports = React.createClass({
this.registerLogic.setIdSid(this.props.idSid);
this.registerLogic.setGuestAccessToken(this.props.guestAccessToken);
this.registerLogic.recheckState();
+
+ if (
+ this.props.teamServerConfig &&
+ this.props.teamServerConfig.teamServerURL &&
+ !this._rtsClient
+ ) {
+ this._rtsClient = new RtsClient(this.props.teamServerConfig.teamServerURL);
+
+ this.setState({
+ teamServerBusy: true,
+ });
+ // GET team configurations including domains, names and icons
+ this._rtsClient.getTeamsConfig().then((args) => {
+ // args = [$request, $body]
+ const teamsConfig = {
+ teams: args[1],
+ supportEmail: this.props.teamServerConfig.supportEmail,
+ };
+ console.log('Setting teams config to ', teamsConfig);
+ this.setState({
+ teamsConfig: teamsConfig,
+ });
+ }, (err) => {
+ console.error('Error retrieving config for teams', err);
+ }).finally(() => {
+ this.setState({
+ teamServerBusy: false,
+ });
+ }).done();
+ }
},
componentWillUnmount: function() {
@@ -187,10 +210,10 @@ module.exports = React.createClass({
});
// Auto-join rooms
- if (self.props.teamsConfig && self.props.teamsConfig.teams) {
- for (let i = 0; i < self.props.teamsConfig.teams.length; i++) {
- let team = self.props.teamsConfig.teams[i];
- if (self.state.formVals.email.endsWith(team.emailSuffix)) {
+ if (self.state.teamsConfig && self.state.teamsConfig.teams) {
+ for (let i = 0; i < self.state.teamsConfig.teams.length; i++) {
+ let team = self.state.teamsConfig.teams[i];
+ if (self.state.formVals.email.endsWith(team.domain)) {
console.log("User successfully registered with team " + team.name);
if (!team.rooms) {
break;
@@ -284,6 +307,8 @@ module.exports = React.createClass({
},
_getRegisterContentJsx: function() {
+ const Spinner = sdk.getComponent("elements.Spinner");
+
var currStep = this.registerLogic.getStep();
var registerStep;
switch (currStep) {
@@ -293,13 +318,17 @@ module.exports = React.createClass({
case "Register.STEP_m.login.dummy":
// NB. Our 'username' prop is specifically for upgrading
// a guest account
+ if (this.state.teamServerBusy) {
+ registerStep = ;
+ break;
+ }
registerStep = (
);