import Icon from '@ant-design/icons' import { Turnstile, TurnstileInstance } from '@marsidev/react-turnstile' import { H_CAPTCHA_SITE_KEY, PERMISSION_LOGIN_SUCCESS, PERMISSION_LOGIN_USERNAME_PASSWORD_ERROR, PERMISSION_NEED_TWO_FACTOR, PERMISSION_TWO_FACTOR_VERIFICATION_CODE_ERROR, PERMISSION_USER_DISABLE, PERMISSION_USERNAME_NOT_FOUND, SYSTEM_INVALID_CAPTCHA_CODE } from '@/constants/common.constants' import { getUserInfo, setToken } from '@/util/auth' import { utcToLocalTime } from '@/util/datetime' import { r_auth_login } from '@/services/auth' import { AppContext } from '@/App' import FitCenter from '@/components/common/FitCenter' import FlexBox from '@/components/common/FlexBox' const SignIn = () => { const [modal, contextHolder] = AntdModal.useModal() const { refreshRouter } = useContext(AppContext) const navigate = useNavigate() const [searchParams] = useSearchParams() const turnstileRef = useRef() const [refreshTime, setRefreshTime] = useState(0) const [twoFactorForm] = AntdForm.useForm<{ twoFactorCode: string }>() const [isSigningIn, setIsSigningIn] = useState(false) const [captchaCode, setCaptchaCode] = useState('') useEffect(() => { const timer = setInterval(() => { if (window.turnstile) { clearInterval(timer) setRefreshTime(Date.now()) if (location.pathname === '/login') { setTimeout(() => { turnstileRef.current?.execute() }, 500) } } }) }, [location.pathname]) useEffect(() => { if (!isSigningIn) { setCaptchaCode('') turnstileRef.current?.reset() turnstileRef.current?.execute() } }, [isSigningIn]) const handleOnFinish = (loginParam: LoginParam) => { if (isSigningIn) { return } setIsSigningIn(true) if (!captchaCode) { void message.warning('请先通过验证') setIsSigningIn(false) return } void r_auth_login({ account: loginParam.account, password: loginParam.password, captchaCode, twoFactorCode: loginParam.twoFactorCode }) .then((res) => { const response = res.data const { code, data } = response switch (code) { case PERMISSION_LOGIN_SUCCESS: setToken(data?.token ?? '') void message.success('登录成功') setTimeout(() => { void getUserInfo().then((user) => { refreshRouter() if (searchParams.has('redirect')) { navigate(searchParams.get('redirect') ?? '/') } else { navigate('/') } notification.success({ message: '欢迎回来', description: ( <> 你好 {user.userInfo.nickname}
最近登录: {user.lastLoginTime ? `${utcToLocalTime(user.lastLoginTime)}【${ user.lastLoginIp }】` : '无'} ), placement: 'topRight' }) }) }, 1500) break case PERMISSION_NEED_TWO_FACTOR: twoFactorForm.resetFields() void modal.confirm({ title: '双因素验证', centered: true, footer: (_, { OkBtn, CancelBtn }) => ( <> ), content: ( <> { setTimeout(() => { // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access ref?.getFieldInstance('twoFactorCode').focus() }, 50) }} > ), onOk: () => twoFactorForm.validateFields().then( () => { return new Promise((resolve) => { handleOnFinish({ ...loginParam, twoFactorCode: twoFactorForm.getFieldValue( 'twoFactorCode' ) as string }) resolve() }) }, () => { return new Promise((_, reject) => { reject('输入有误') }) } ), onCancel: () => { setIsSigningIn(false) } }) break case PERMISSION_USERNAME_NOT_FOUND: case PERMISSION_LOGIN_USERNAME_PASSWORD_ERROR: void message.error( <> 账号密码错误,请重试 ) setIsSigningIn(false) break case PERMISSION_TWO_FACTOR_VERIFICATION_CODE_ERROR: void message.error('双因素验证码错误') setIsSigningIn(false) break case PERMISSION_USER_DISABLE: void message.error( <> 该用户已被禁用 ) setIsSigningIn(false) break case SYSTEM_INVALID_CAPTCHA_CODE: void message.error('验证码有误,请重试') setIsSigningIn(false) break default: void message.error( <> 服务器出错了 ) setIsSigningIn(false) } }) .catch(() => { setIsSigningIn(false) }) } return (
欢迎回来
Welcome back
} disabled={isSigningIn} placeholder={'邮箱/用户名'} /> } disabled={isSigningIn} placeholder={'密码'} /> { navigate('/') }} > 返回首页 { navigate(`/forget${location.search}`, { replace: true }) }} > 忘记密码? 登    录
{contextHolder}
) } export default SignIn