Ivan - Frontend - Add captcha and departments from globals [skip ci]
This commit is contained in:
parent
d638465ea6
commit
7dc7e14168
|
@ -65,7 +65,7 @@
|
|||
"react": "^15.0.1",
|
||||
"react-document-title": "^1.0.2",
|
||||
"react-dom": "^15.0.1",
|
||||
"react-google-recaptcha": "^0.5.2",
|
||||
"react-google-recaptcha": "^0.5.4",
|
||||
"react-motion": "^0.3.0",
|
||||
"react-redux": "^4.4.5",
|
||||
"react-router": "^2.4.0",
|
||||
|
|
|
@ -11,8 +11,8 @@ const ConfigActions = requireUnit('actions/config-actions', {
|
|||
describe('Config Actions,', function () {
|
||||
|
||||
describe('init action', function () {
|
||||
it('should return INIT_CONFIGS_FULFILLED with configs if it is already retrieved', function () {
|
||||
sessionStoreMock.areConfigsStored.returns(true);
|
||||
it('should return INIT_CONFIGS_FULFILLED with configs if it user is logged in', function () {
|
||||
sessionStoreMock.isLoggedIn.returns(true);
|
||||
sessionStoreMock.getConfigs.returns({
|
||||
config1: 'CONFIG_1',
|
||||
config2: 'CONFIG_2'
|
||||
|
@ -31,7 +31,7 @@ describe('Config Actions,', function () {
|
|||
|
||||
it('should return INIT_CONFIGS with API_RESULT if it is not retrieved', function () {
|
||||
APICallMock.call.reset();
|
||||
sessionStoreMock.areConfigsStored.returns(false);
|
||||
sessionStoreMock.isLoggedIn.returns(false);
|
||||
sessionStoreMock.getConfigs.returns({
|
||||
config1: 'CONFIG_1',
|
||||
config2: 'CONFIG_2'
|
||||
|
|
|
@ -3,7 +3,7 @@ import sessionStore from 'lib-app/session-store';
|
|||
|
||||
export default {
|
||||
init() {
|
||||
if (sessionStore.areConfigsStored()) {
|
||||
if (sessionStore.isLoggedIn()) {
|
||||
return {
|
||||
type: 'INIT_CONFIGS_FULFILLED',
|
||||
payload: {
|
||||
|
|
|
@ -2,6 +2,8 @@ import API from 'lib-app/api-call';
|
|||
import sessionStore from 'lib-app/session-store';
|
||||
import store from 'app/store';
|
||||
|
||||
import ConfigActions from 'actions/config-actions';
|
||||
|
||||
export default {
|
||||
login(loginData) {
|
||||
return {
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import ReCAPTCHA from 'react-google-recaptcha';
|
||||
import {connect} from 'react-redux';
|
||||
|
||||
|
||||
class Captcha extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
value: ''
|
||||
};
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<ReCAPTCHA sitekey={this.props.sitekey} ref="reCaptcha" onChange={(value) => {this.setState({value})}} tabIndex="0" />
|
||||
);
|
||||
}
|
||||
|
||||
getValue() {
|
||||
return this.state.value;
|
||||
}
|
||||
|
||||
focus() {
|
||||
ReactDOM.findDOMNode(this).focus();
|
||||
}
|
||||
}
|
||||
|
||||
export default connect((store) => {
|
||||
return {
|
||||
sitekey: store.config.reCaptchaKey
|
||||
};
|
||||
}, null, null, { withRef: true })(Captcha);
|
|
@ -4,6 +4,7 @@ import { browserHistory } from 'react-router';
|
|||
|
||||
import i18n from 'lib-app/i18n';
|
||||
import API from 'lib-app/api-call';
|
||||
import SessionStore from 'lib-app/session-store';
|
||||
import store from 'app/store';
|
||||
import SessionActions from 'actions/session-actions';
|
||||
|
||||
|
@ -41,11 +42,7 @@ class CreateTicketForm extends React.Component {
|
|||
<div className="row">
|
||||
<FormField className="col-md-7" label="Title" name="title" validation="TITLE" required field="input" fieldProps={{size: 'large'}}/>
|
||||
<FormField className="col-md-5" label="Department" name="departmentId" field="select" fieldProps={{
|
||||
items: [
|
||||
{content: 'Sales Support'},
|
||||
{content: 'Technical Issues'},
|
||||
{content: 'System and Administration'}
|
||||
],
|
||||
items: SessionStore.getDepartments().map((department) => {return {content: department}}),
|
||||
size: 'medium'
|
||||
}} />
|
||||
</div>
|
||||
|
@ -70,7 +67,7 @@ class CreateTicketForm extends React.Component {
|
|||
renderCaptcha() {
|
||||
return (
|
||||
<div className="create-ticket-form__captcha">
|
||||
<ReCAPTCHA sitekey="6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS" onChange={function () {}}/>
|
||||
<Captcha />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
import React from 'react';
|
||||
import ReCAPTCHA from 'react-google-recaptcha';
|
||||
import ReactDOM from 'react-dom';
|
||||
import _ from 'lodash';
|
||||
|
||||
import i18n from 'lib-app/i18n';
|
||||
import API from 'lib-app/api-call';
|
||||
|
||||
import Captcha from 'app/main/captcha';
|
||||
import SubmitButton from 'core-components/submit-button';
|
||||
import Message from 'core-components/message';
|
||||
import Form from 'core-components/form';
|
||||
|
@ -34,7 +36,7 @@ class MainSignUpPageWidget extends React.Component {
|
|||
<FormField {...this.getInputProps(true)} label="Repeat Password" name="repeated-password" validation="REPEAT_PASSWORD" required/>
|
||||
</div>
|
||||
<div className="signup-widget__captcha">
|
||||
<ReCAPTCHA sitekey="6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS" onChange={function () {}}/>
|
||||
<Captcha ref="captcha"/>
|
||||
</div>
|
||||
<SubmitButton type="primary">SIGN UP</SubmitButton>
|
||||
</Form>
|
||||
|
@ -75,14 +77,20 @@ class MainSignUpPageWidget extends React.Component {
|
|||
}
|
||||
|
||||
onLoginFormSubmit(formState) {
|
||||
this.setState({
|
||||
loading: true
|
||||
});
|
||||
const captcha = this.refs.captcha.getWrappedInstance();
|
||||
|
||||
API.call({
|
||||
path: '/user/signup',
|
||||
data: formState
|
||||
}).then(this.onSignupSuccess.bind(this)).catch(this.onSignupFail.bind(this));
|
||||
if (!captcha.getValue()) {
|
||||
captcha.focus();
|
||||
} else {
|
||||
this.setState({
|
||||
loading: true
|
||||
});
|
||||
|
||||
API.call({
|
||||
path: '/user/signup',
|
||||
data: _.extend({captcha: captcha.getValue()}, formState)
|
||||
}).then(this.onSignupSuccess.bind(this)).catch(this.onSignupFail.bind(this));
|
||||
}
|
||||
}
|
||||
|
||||
onSignupSuccess() {
|
||||
|
|
|
@ -7,7 +7,12 @@ module.exports = [
|
|||
status: 'success',
|
||||
data: {
|
||||
'language': 'us',
|
||||
'reCaptchaKey': '6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS'
|
||||
'reCaptchaKey': '6LfM5CYTAAAAAGLz6ctpf-hchX2_l0Ge-Bn-n8wS',
|
||||
'departments': [
|
||||
'Sales Support',
|
||||
'Technical Issues',
|
||||
'System and Administration'
|
||||
]
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@ class SessionStore {
|
|||
return JSON.parse(this.getItem('userData'));
|
||||
}
|
||||
|
||||
getDepartments() {
|
||||
return JSON.parse(this.getItem('departments'));
|
||||
}
|
||||
|
||||
storeRememberData({token, userId, expiration}) {
|
||||
this.setItem('rememberData-token', token);
|
||||
this.setItem('rememberData-userId', userId);
|
||||
|
@ -51,19 +55,17 @@ class SessionStore {
|
|||
storeConfigs(configs) {
|
||||
this.setItem('language', configs.language);
|
||||
this.setItem('reCaptchaKey', configs.reCaptchaKey);
|
||||
this.setItem('departments', JSON.stringify(configs.departments));
|
||||
}
|
||||
|
||||
getConfigs() {
|
||||
return {
|
||||
language: this.getItem('language'),
|
||||
reCaptchaKey: this.getItem('reCaptchaKey')
|
||||
reCaptchaKey: this.getItem('reCaptchaKey'),
|
||||
departments: this.getDepartments()
|
||||
};
|
||||
}
|
||||
|
||||
areConfigsStored() {
|
||||
return !!this.getItem('reCaptchaKey');
|
||||
}
|
||||
|
||||
isRememberDataExpired() {
|
||||
let rememberData = this.getRememberData();
|
||||
|
||||
|
|
Loading…
Reference in New Issue