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 { User } from '../../stores/user';
import { Common } from '../../stores/common';
import { MobileArea, WechatUserAppId } 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, data: { area: MobileArea[0].value } };
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,
);
}
close() {
User.closeLogin();
}
login() {
const { data, needEmail, mobileError, validError } = this.state;
const { area, mobile, mobileVerifyCode, email } = data;
if (mobileError || validError) return;
if (!area || !mobile || !mobileVerifyCode) return;
if (needEmail && !email) return;
User.login(area, mobile, mobileVerifyCode, email)
.then((result) => {
if (result.bindWechat) {
this.close();
} else {
this.setState({ type: BIND_WX });
}
})
.catch(err => {
if (err.message.indexOf('验证码') >= 0) {
this.setState({ validError: err.message });
} else {
this.setState({ mobileError: err.message });
}
});
}
bind() {
const { data, needEmail, mobileError, validError } = this.state;
const { area, mobile, mobileVerifyCode, email } = data;
if (mobileError || validError) return;
if (!area || !mobile || !mobileVerifyCode) return;
if (needEmail && !email) return;
User.bind(area, mobile, mobileVerifyCode, email)
.then(() => {
this.close();
})
.catch(err => {
if (err.message.indexOf('验证码') >= 0) {
this.setState({ validError: err.message });
} else {
this.setState({ mobileError: err.message });
}
});
}
scanLogin(code) {
User.loginWechat(code).then(result => {
if (result.bindMobile) {
this.close();
} else {
this.setState({ type: BIND_PHONE });
}
});
}
scanBind(code) {
User.loginWechat(code)
.then(() => {
this.close();
})
.catch(err => {
this.setState({ type: BIND_WX_ERROR, wechatError: err.message });
});
}
changeData(field, value) {
let { data } = this.state;
data = data || {};
data[field] = value;
this.setState({ data });
}
validMobile(login) {
const { data } = this.state;
const { area, mobile } = data;
if (!area || !mobile) return;
this.validNumber += 1;
const number = this.validNumber;
User.validWechat(area, mobile)
.then(result => {
if (result) {
this.setState({ mobileError: '' });
return User.validMobile(area, mobile).then(r => {
if (number !== this.validNumber) return;
this.setState({ needEmail: r });
});
}
this.setState({ needEmail: false });
return login ? Promise.resolve() : Promise.reject(new Error('该手机已绑定其他账号,请更换手机号码'));
})
.catch(err => {
this.setState({ mobileError: 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;
});
}
render() {
const { type } = this.state;
const { user } = this.props;
return (