import { history, Link, useRequest } from '@umijs/max'; import { Button, Col, Form, Input, message, Popover, Progress, Row, Select, Space } from 'antd'; import type { Store } from 'antd/es/form/interface'; import type { FC } from 'react'; import { useEffect, useState } from 'react'; import type { StateType } from './service'; import { fakeRegister } from './service'; import useStyles from './style.style'; import { registerUser } from '@/services/user/api'; import { CommonResponse } from '@/types/common'; const FormItem = Form.Item; const { Option } = Select; const passwordProgressMap: { ok: 'success'; pass: 'normal'; poor: 'exception'; } = { ok: 'success', pass: 'normal', poor: 'exception', }; const Register: FC = () => { const { styles } = useStyles(); const [count, setCount]: [number, any] = useState(0); const [open, setVisible]: [boolean, any] = useState(false); const [prefix, setPrefix]: [string, any] = useState('86'); const [popover, setPopover]: [boolean, any] = useState(false); const confirmDirty = false; let interval: number | undefined; const passwordStatusMap = { ok: (
强度:强
), pass: (
强度:中
), poor: (
强度:太短
), }; const [form] = Form.useForm(); useEffect( () => () => { clearInterval(interval); }, [interval], ); const onGetCaptcha = () => { let counts = 59; setCount(counts); interval = window.setInterval(() => { counts -= 1; setCount(counts); if (counts === 0) { clearInterval(interval); } }, 1000); }; const getPasswordStatus = () => { const value = form.getFieldValue('password'); if (value && value.length > 9) { return 'ok'; } if (value && value.length > 5) { return 'pass'; } return 'poor'; }; const { loading: submitting, run: register } = useRequest( (params) => registerUser(params, { skipErrorHandler: true }), { manual: true, onSuccess: (data, params) => { console.log('注册成功 - data:', data, 'params:', params); const response = data as CommonResponse; if (response?.code === 200) { message.success('注册成功!'); const formValues = params[0] as any; history.push({ pathname: `/user/register-result?account=${formValues?.email || formValues?.username || ''}`, }); } else { message.error(response?.message || '注册失败,请重试'); } }, }, ); const onFinish = (values: Store) => { // 将表单数据映射为后端需要的格式 const registerParams = { username: values.username, nickname: values.nickname, password: values.password, email: values.email || '', phone: values.phone || '', }; register(registerParams); }; const checkConfirm = (_: any, value: string) => { const promise = Promise; if (value && value !== form.getFieldValue('password')) { return promise.reject('两次输入的密码不匹配!'); } return promise.resolve(); }; const checkPassword = (_: any, value: string) => { const promise = Promise; // 没有值的情况 if (!value) { setVisible(!!value); return promise.reject('请输入密码!'); } // 有值的情况 if (!open) { setVisible(!!value); } setPopover(!popover); if (value.length < 6) { return promise.reject(''); } if (value && confirmDirty) { form.validateFields(['confirm']); } return promise.resolve(); }; const changePrefix = (value: string) => { setPrefix(value); }; const renderPasswordProgress = () => { const value = form.getFieldValue('password'); const passwordStatus = getPasswordStatus(); return value && value.length ? (
100 ? 100 : value.length * 10} showInfo={false} />
) : null; }; return (

注册

{ if (node && node.parentNode) { return node.parentNode as HTMLElement; } return node; }} content={ open && (
{passwordStatusMap[getPasswordStatus()]} {renderPasswordProgress()}
请至少输入 6 个字符。请不要使用容易被猜到的密码。
) } overlayStyle={{ width: 240, }} placement="right" open={open} > 0 && styles.password } rules={[ { validator: checkPassword, }, ]} >
{/* */}
使用已有账户登录
); }; export default Register;