import * as React from 'react'; import Avatar from '@mui/material/Avatar'; import Button from '@mui/material/Button'; import CssBaseline from '@mui/material/CssBaseline'; import Link from '@mui/material/Link'; import Grid from '@mui/material/Grid'; import Box from '@mui/material/Box'; import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; import Typography from '@mui/material/Typography'; import Container from '@mui/material/Container'; import { Link as RouterLink } from "react-router-dom"; import { register } from '@/apis/apis' import CheckInput, { refType } from '@/components/CheckInput' import { useRef, useState } from 'react'; import Alert from '@mui/material/Alert'; import Snackbar from '@mui/material/Snackbar'; import Loading from '@/components/Loading' import { useNavigate } from "react-router-dom"; import CaptchaWidget from '@/components/CaptchaWidget'; import type { refType as CaptchaWidgetRef } from '@/components/CaptchaWidget' import useTitle from '@/hooks/useTitle'; import { ApiErr } from '@/apis/error'; import { useSetAtom } from 'jotai'; import { token, user } from '@/store/store'; export default function SignUp() { const [regErr, setRegErr] = useState(""); const navigate = useNavigate(); const [captchaToken, setCaptchaToken] = useState(""); const captchaRef = useRef(null) const [loading, setLoading] = useState(false); useTitle("注册") const setToken = useSetAtom(token) const setUserInfo = useSetAtom(user) const checkList = React.useRef>(new Map()) const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); if (loading) return const data = new FormData(event.currentTarget); const d = { email: data.get('email')?.toString(), password: data.get('password')?.toString(), username: data.get("username")?.toString() } if (!Array.from(checkList.current.values()).map(v => v.verify()).reduce((p, v) => (p == true) && (v == true))) { return } if (captchaToken == "") { setRegErr("验证码无效") return } setLoading(true) register(d.email ?? "", d.username ?? "", d.password ?? "", captchaToken). then(v => { if (!v) return setToken(v.token) setUserInfo({ uuid: v.uuid, name: v.name, }) navigate("/profile") }). catch(v => { captchaRef.current?.reload() console.warn(v) if (v instanceof ApiErr) { switch (v.code) { case 10: setRegErr("验证码错误") return case 3: setRegErr("邮箱已存在") return case 7: setRegErr("用户名已存在") return } } setRegErr(String(v)) }). finally(() => setLoading(false)) }; return ( 注册 { dom && checkList.current.set("1", dom) }} /> { dom && checkList.current.set("2", dom) }} checkList={[ { errMsg: "长度在 3-16 之间", reg: /^.{3,16}$/ } ]} required fullWidth name="username" label="角色名" autoComplete="username" /> { dom && checkList.current.set("3", dom) }} checkList={[ { errMsg: "长度在 6-50 之间", reg: /^.{6,50}$/ } ]} required fullWidth label="密码" type="password" name="password" autoComplete="new-password" /> 登录 setRegErr("")} severity="error">{regErr} {loading && } ); }