import React, { useCallback } from 'react' import Icon from '@ant-design/icons' import { Turnstile, TurnstileInstance } from '@marsidev/react-turnstile' import { H_CAPTCHA_SITE_KEY, PERMISSION_FORGET_SUCCESS, PERMISSION_RETRIEVE_CODE_ERROR_OR_EXPIRED, PERMISSION_RETRIEVE_SUCCESS, PERMISSION_USER_NOT_FOUND, SYSTEM_INVALID_CAPTCHA_CODE } from '@/constants/common.constants' import { useUpdatedEffect } from '@/util/hooks' import { r_auth_forget, r_auth_retrieve } from '@/services/auth' import FitCenter from '@/components/common/FitCenter' import FlexBox from '@/components/common/FlexBox' const Forget: React.FC = () => { const navigate = useNavigate() const [searchParams] = useSearchParams() const turnstileRef = useRef() const turnstileRefCallback = useCallback( (node: TurnstileInstance) => { turnstileRef.current = node if (location.pathname === '/forget' && !searchParams.get('code')) { turnstileRef.current?.execute() } }, [location.pathname, searchParams] ) const retrieveTurnstileRef = useRef() const retrieveTurnstileRefCallback = useCallback( (node: TurnstileInstance) => { retrieveTurnstileRef.current = node if (location.pathname === '/forget' && searchParams.get('code')) { retrieveTurnstileRef.current?.execute() } }, [location.pathname, searchParams] ) const [isSending, setIsSending] = useState(false) const [isSent, setIsSent] = useState(false) const [isChanging, setIsChanging] = useState(false) const [isChanged, setIsChanged] = useState(false) const [captchaCode, setCaptchaCode] = useState('') const [retrieveCaptchaCode, setRetrieveCaptchaCode] = useState('') useUpdatedEffect(() => { if (!isSending) { setCaptchaCode('') turnstileRef.current?.reset() turnstileRef.current?.execute() } }, [isSending]) useUpdatedEffect(() => { if (!isChanging) { setRetrieveCaptchaCode('') retrieveTurnstileRef.current?.reset() retrieveTurnstileRef.current?.execute() } }, [isChanging]) const handleOnSend = (forgetParam: ForgetParam) => { if (isSending) { return } setIsSending(true) if (!captchaCode) { void message.warning('请先通过验证') setIsSending(false) return } void r_auth_forget({ email: forgetParam.email, captchaCode }) .then((res) => { const response = res.data switch (response.code) { case PERMISSION_FORGET_SUCCESS: void message.success('已发送验证邮件,请查收') setIsSent(true) break case PERMISSION_USER_NOT_FOUND: void message.error('用户不存在') break case SYSTEM_INVALID_CAPTCHA_CODE: void message.error('验证码有误,请重试') break default: void message.error('出错了,请稍后重试') } }) .finally(() => { setIsSending(false) }) } const handleOnRetry = () => { setIsSent(false) } const handleOnChange = (retrieveParam: RetrieveParam) => { if (isChanging) { return } setIsChanging(true) void r_auth_retrieve({ code: searchParams.get('code') ?? '', password: retrieveParam.password, captchaCode: retrieveCaptchaCode }) .then((res) => { const response = res.data switch (response.code) { case PERMISSION_RETRIEVE_SUCCESS: void message.success('密码已更新') setIsChanged(true) break case PERMISSION_RETRIEVE_CODE_ERROR_OR_EXPIRED: void message.error('请重新获取邮件') break case SYSTEM_INVALID_CAPTCHA_CODE: void message.error('验证码有误,请重试') break default: void message.error('出错了,请稍后重试') } }) .finally(() => { setIsChanging(false) }) } return (
找回密码
Retrieve password
{!searchParams.get('code') ? ( !isSent ? ( <> } placeholder={'邮箱'} disabled={isSending} /> 确    定 ) : (
我们向您发送了一封包含找回密码链接的邮件,如未收到,可能被归为垃圾邮件,请仔细检查。 重新发送
) ) : !isChanged ? ( <> 新  密  码 } placeholder={'密码'} disabled={isChanging} /> ({ validator(_, value) { if ( !value || getFieldValue('password') === value ) { return Promise.resolve() } return Promise.reject( new Error('两次密码输入必须一致') ) } }) ]} > 更    改 ) : (
恭喜你,密码已更新,请重新登录。
)}
) } export default Forget