import React, { Component } from 'react';
import './index.less';
import { Modal, Icon, Button, Tooltip } from 'antd';
import Assets from '@src/components/Assets';
import { asyncSMessage } from '@src/services/AsyncTools';
import { Icon as GIcon } from '../Icon';
import { Button as GButton } from '../Button';
import RadioItem from '../RadioItem';
import { User } from '../../stores/user';
import { Common } from '../../stores/common';
import { Main } from '../../stores/main';
import { MobileArea, WechatPcAppId, PcUrl } from '../../../Constant';
const LOGIN_PHONE = 'LOGIN_PHONE';
const LOGIN_WX = 'LOGIN_WX';
const BIND_PHONE = 'BIND_PHONE';
const BIND_WX = 'BIND_WX';
const BIND_WX_ERROR = 'BIND_WX_ERROR';
export default class Login extends Component {
constructor(props) {
super(props);
this.validNumber = 0;
this.state = { type: LOGIN_WX, empty: {}, data: { area: MobileArea[0].value } };
this.validMobileNumber = 0;
this.validEmailNumber = 0;
window.addEventListener(
'message',
event => {
if (typeof event.data === 'string' && event.data.indexOf('code:') === 0) {
const code = event.data.split(':')[1];
if (this.state.type === LOGIN_WX) {
this.scanLogin(code);
} else if (this.state.type === BIND_WX) {
this.scanBind(code);
}
}
},
false,
);
}
componentWillReceiveProps(nextProps) {
if (nextProps.user.needLogin && !this.init) {
this.init = true;
Main.getContract('register').then(result => {
this.setState({ registerContract: result });
});
Main.getContract('privacy').then(result => {
this.setState({ privacyContract: result });
});
}
}
close() {
User.closeLogin();
}
login() {
const { data, needEmail, mobileError, validError, emailError, empty } = this.state;
const { area, mobile, mobileVerifyCode, email } = data;
if (mobileError || emailError || validError) return;
if (!area || !mobile || !mobileVerifyCode || (needEmail && !email)) {
empty[LOGIN_PHONE] = { mobile: !mobile, mobileVerifyCode: !mobileVerifyCode, email: !email };
this.setState({ empty });
return;
}
empty[LOGIN_PHONE] = {};
this.setState({ empty });
User.login(area, mobile, mobileVerifyCode, email, null, false)
.then(result => {
if (result.bindWechat) {
this.close();
} else {
this.changeType(BIND_WX);
}
})
.catch(err => {
if (err.message.indexOf('验证码') >= 0) {
this.setState({ validError: err.message });
} else if (err.message.indexOf('邮箱') >= 0) {
this.setState({ emailError: err.message });
} else {
this.setState({ mobileError: err.message });
}
});
}
bind() {
const { data, needEmail, mobileError, emailError, validError, error } = this.state;
const { area, mobile, mobileVerifyCode, email } = data;
if (mobileError || emailError || validError) return;
if (!area || !mobile || !mobileVerifyCode || (needEmail && !email)) {
error[BIND_PHONE] = { mobile: !mobile, mobileVerifyCode: !mobileVerifyCode, email: !email };
this.setState({ error });
return;
}
error[BIND_PHONE] = {};
this.setState({ error });
User.bind(area, mobile, mobileVerifyCode, email)
.then(() => {
this.close();
})
.catch(err => {
if (err.message.indexOf('验证码') >= 0) {
this.setState({ validError: err.message });
} else if (err.message.indexOf('邮箱') >= 0) {
this.setState({ emailError: err.message });
} else {
this.setState({ mobileError: err.message });
}
});
}
scanLogin(code) {
User.loginWechat(code, false)
.then(result => {
if (result.bindMobile) {
this.close();
} else {
this.changeType(BIND_PHONE);
}
})
.catch(err => {
asyncSMessage(err.message, 'error');
});
}
scanBind(code) {
User.loginWechat(code, false)
.then(() => {
this.close();
})
.catch(() => {
this.changeType(BIND_WX_ERROR);
});
}
changeData(field, value) {
let { data, empty } = this.state;
data = data || {};
empty = empty || {};
data[field] = value;
if (value) empty[this.state.type][field] = !value;
this.setState({ data, empty });
}
validMobile(login) {
const { data } = this.state;
const { area, mobile } = data;
if (!area || !mobile) return;
this.validMobileNumber += 1;
const number = this.validMobileNumber;
User.validWechat(area, mobile)
.then(result => {
if (result) {
this.setState({ mobileError: '' });
return User.validMobile(area, mobile).then(r => {
if (number !== this.validMobileNumber) return;
this.setState({ needEmail: r });
});
}
this.setState({ needEmail: false });
return login ? Promise.resolve() : Promise.reject(new Error('该手机已绑定其他账号,请更换手机号码'));
})
.catch(err => {
this.setState({ mobileError: err.message });
});
}
validEmail() {
const { data } = this.state;
const { email } = data;
if (!email) return;
this.validEmailNumber += 1;
const number = this.validEmailNumber;
User.validEmail(email)
.then(result => {
if (number !== this.validEmailNumber) return Promise.resolve();
if (result) {
this.setState({ emailError: '' });
return Promise.resolve();
}
return Promise.reject(new Error('该邮箱已绑定其他账号,请更换邮箱地址'));
})
.catch(err => {
this.setState({ emailError: err.message });
});
}
sendValid() {
const { data, mobileError } = this.state;
const { area, mobile } = data;
if (!area || !mobile || mobileError) return Promise.reject();
return Common.sendSms(area, mobile)
.then(result => {
if (result) {
asyncSMessage('发送成功');
this.setState({ mobileError: '', validError: '' });
} else {
throw new Error('发送失败');
}
})
.catch(err => {
this.setState({ mobileError: err.message });
throw err;
});
}
changeType(type) {
this.setState({ type, empty: {}, mobileError: '', emailError: '', validError: '' });
}
render() {
const { type } = this.state;
const { user } = this.props;
return (