From b013f02209c7c128a35d1c54f2d4a7d6a9701f72 Mon Sep 17 00:00:00 2001
From: Reed Garmsen <rgarmsen2295@gmail.com>
Date: Wed, 13 Jan 2016 14:58:49 -0800
Subject: Added ability to sign in via username; separated email sign in and
 sign up config settings

---
 web/react/components/login_username.jsx | 181 ++++++++++++++++++++++++++++++++
 1 file changed, 181 insertions(+)
 create mode 100644 web/react/components/login_username.jsx

(limited to 'web/react/components/login_username.jsx')

diff --git a/web/react/components/login_username.jsx b/web/react/components/login_username.jsx
new file mode 100644
index 000000000..f787490fa
--- /dev/null
+++ b/web/react/components/login_username.jsx
@@ -0,0 +1,181 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import * as Utils from '../utils/utils.jsx';
+import * as Client from '../utils/client.jsx';
+import UserStore from '../stores/user_store.jsx';
+
+import {injectIntl, intlShape, defineMessages, FormattedMessage} from 'mm-intl';
+
+var holders = defineMessages({
+    badTeam: {
+        id: 'login_username.badTeam',
+        defaultMessage: 'Bad team name'
+    },
+    usernameReq: {
+        id: 'login_username.usernameReq',
+        defaultMessage: 'A username is required'
+    },
+    pwdReq: {
+        id: 'login_username.pwdReq',
+        defaultMessage: 'A password is required'
+    },
+    verifyEmailError: {
+        id: 'login_username.verifyEmailError',
+        defaultMessage: 'Please verify your email address. Check your inbox for an email.'
+    },
+    userNotFoundError: {
+        id: 'login_username.userNotFoundError',
+        defaultMessage: "We couldn't find an existing account matching your username for this team."
+    },
+    username: {
+        id: 'login_username.username',
+        defaultMessage: 'Username'
+    },
+    pwd: {
+        id: 'login_username.pwd',
+        defaultMessage: 'Password'
+    }
+});
+
+export default class LoginUsername extends React.Component {
+    constructor(props) {
+        super(props);
+
+        this.handleSubmit = this.handleSubmit.bind(this);
+
+        this.state = {
+            serverError: ''
+        };
+    }
+    handleSubmit(e) {
+        e.preventDefault();
+        const {formatMessage} = this.props.intl;
+        var state = {};
+
+        const name = this.props.teamName;
+        if (!name) {
+            state.serverError = formatMessage(holders.badTeam);
+            this.setState(state);
+            return;
+        }
+
+        const username = this.refs.username.value.trim();
+        if (!username) {
+            state.serverError = formatMessage(holders.usernameReq);
+            this.setState(state);
+            return;
+        }
+
+        const password = this.refs.password.value.trim();
+        if (!password) {
+            state.serverError = formatMessage(holders.pwdReq);
+            this.setState(state);
+            return;
+        }
+
+        state.serverError = '';
+        this.setState(state);
+
+        Client.loginByUsername(name, username, password,
+            () => {
+                UserStore.setLastUsername(username);
+
+                const redirect = Utils.getUrlParameter('redirect');
+                if (redirect) {
+                    window.location.href = decodeURIComponent(redirect);
+                } else {
+                    window.location.href = '/' + name + '/channels/town-square';
+                }
+            },
+            (err) => {
+                if (err.message === 'api.user.login.not_verified.app_error') {
+                    state.serverError = formatMessage(holders.verifyEmailError);
+                } else if (err.message === 'store.sql_user.get_by_username.app_error') {
+                    state.serverError = formatMessage(holders.userNotFoundError);
+                } else {
+                    state.serverError = err.message;
+                }
+
+                this.valid = false;
+                this.setState(state);
+            }
+        );
+    }
+    render() {
+        let serverError;
+        let errorClass = '';
+        if (this.state.serverError) {
+            serverError = <label className='control-label'>{this.state.serverError}</label>;
+            errorClass = ' has-error';
+        }
+
+        let priorUsername = UserStore.getLastUsername();
+        let focusUsername = false;
+        let focusPassword = false;
+        if (priorUsername === '') {
+            focusUsername = true;
+        } else {
+            focusPassword = true;
+        }
+
+        const emailParam = Utils.getUrlParameter('email');
+        if (emailParam) {
+            priorUsername = decodeURIComponent(emailParam);
+        }
+
+        const {formatMessage} = this.props.intl;
+        return (
+            <form onSubmit={this.handleSubmit}>
+                <div className='signup__email-container'>
+                    <div className={'form-group' + errorClass}>
+                        {serverError}
+                    </div>
+                    <div className={'form-group' + errorClass}>
+                        <input
+                            autoFocus={focusUsername}
+                            type='username'
+                            className='form-control'
+                            name='username'
+                            defaultValue={priorUsername}
+                            ref='username'
+                            placeholder={formatMessage(holders.username)}
+                            spellCheck='false'
+                        />
+                    </div>
+                    <div className={'form-group' + errorClass}>
+                        <input
+                            autoFocus={focusPassword}
+                            type='password'
+                            className='form-control'
+                            name='password'
+                            ref='password'
+                            placeholder={formatMessage(holders.pwd)}
+                            spellCheck='false'
+                        />
+                    </div>
+                    <div className='form-group'>
+                        <button
+                            type='submit'
+                            className='btn btn-primary'
+                        >
+                            <FormattedMessage
+                                id='login_username.signin'
+                                defaultMessage='Sign in'
+                            />
+                        </button>
+                    </div>
+                </div>
+            </form>
+        );
+    }
+}
+LoginUsername.defaultProps = {
+};
+
+LoginUsername.propTypes = {
+    intl: intlShape.isRequired,
+    teamName: React.PropTypes.string.isRequired
+};
+
+export default injectIntl(LoginUsername);
-- 
cgit v1.2.3-1-g7c22

