import { Alert, Checkbox, Icon } from 'antd'; import { FormattedMessage, formatMessage } from 'umi-plugin-react/locale'; import React, { Component } from 'react'; import { CheckboxChangeEvent } from 'antd/es/checkbox'; import { Dispatch, AnyAction } from 'redux'; import { FormComponentProps } from 'antd/es/form'; import Link from 'umi/link'; import { connect } from 'dva'; import { StateType } from '@/models/login'; import LoginComponents from './components/Login'; import styles from './style.less'; import { LoginParamsType } from '@/services/login'; import { ConnectState } from '@/models/connect'; const { Tab, UserName, Password, Mobile, Captcha, Submit } = LoginComponents; interface LoginProps { dispatch: Dispatch; userLogin: StateType; submitting: boolean; } interface LoginState { type: string; autoLogin: boolean; } @connect(({ login, loading }: ConnectState) => ({ userLogin: login, submitting: loading.effects['login/login'], })) class Login extends Component { loginForm: FormComponentProps['form'] | undefined | null = undefined; state: LoginState = { type: 'account', autoLogin: true, }; changeAutoLogin = (e: CheckboxChangeEvent) => { this.setState({ autoLogin: e.target.checked, }); }; handleSubmit = (err: unknown, values: LoginParamsType) => { const { type } = this.state; if (!err) { const { dispatch } = this.props; dispatch({ type: 'login/login', payload: { ...values, type, }, }); } }; onTabChange = (type: string) => { this.setState({ type }); }; onGetCaptcha = () => new Promise((resolve, reject) => { if (!this.loginForm) { return; } this.loginForm.validateFields( ['mobile'], {}, async (err: unknown, values: LoginParamsType) => { if (err) { reject(err); } else { const { dispatch } = this.props; try { const success = await ((dispatch({ type: 'login/getCaptcha', payload: values.mobile, }) as unknown) as Promise); resolve(!!success); } catch (error) { reject(error); } } }, ); }); renderMessage = (content: string) => ( ); render() { const { userLogin, submitting } = this.props; const { status, type: loginType } = userLogin; const { type, autoLogin } = this.state; return (
{ this.loginForm = form; }} > {status === 'error' && loginType === 'account' && !submitting && this.renderMessage( formatMessage({ id: 'user-login.login.message-invalid-credentials' }), )} { e.preventDefault(); if (this.loginForm) { this.loginForm.validateFields(this.handleSubmit); } }} /> {status === 'error' && loginType === 'mobile' && !submitting && this.renderMessage( formatMessage({ id: 'user-login.login.message-invalid-verification-code' }), )}
); } } export default Login;