import React, { useContext, useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { API, getLogo, showError, showInfo, showSuccess, updateAPI, getSystemName, setUserData } from '../../helpers/index.js'; import Turnstile from 'react-turnstile'; import { Button, Card, Divider, Form, Icon, Modal, } from '@douyinfe/semi-ui'; import Title from '@douyinfe/semi-ui/lib/es/typography/title'; import Text from '@douyinfe/semi-ui/lib/es/typography/text'; import { IconGithubLogo, IconMail, IconUser, IconLock, IconKey } from '@douyinfe/semi-icons'; import { onGitHubOAuthClicked, onLinuxDOOAuthClicked, onOIDCClicked, } from '../../helpers/index.js'; import OIDCIcon from '../common/logo/OIDCIcon.js'; import LinuxDoIcon from '../common/logo/LinuxDoIcon.js'; import WeChatIcon from '../common/logo/WeChatIcon.js'; import TelegramLoginButton from 'react-telegram-login/src'; import { UserContext } from '../../context/User/index.js'; import { useTranslation } from 'react-i18next'; const RegisterForm = () => { let navigate = useNavigate(); const { t } = useTranslation(); const [inputs, setInputs] = useState({ username: '', password: '', password2: '', email: '', verification_code: '', wechat_verification_code: '', }); const { username, password, password2 } = inputs; const [userDispatch] = useContext(UserContext); const [turnstileEnabled, setTurnstileEnabled] = useState(false); const [turnstileSiteKey, setTurnstileSiteKey] = useState(''); const [turnstileToken, setTurnstileToken] = useState(''); const [showWeChatLoginModal, setShowWeChatLoginModal] = useState(false); const [showEmailRegister, setShowEmailRegister] = useState(false); const [wechatLoading, setWechatLoading] = useState(false); const [githubLoading, setGithubLoading] = useState(false); const [oidcLoading, setOidcLoading] = useState(false); const [linuxdoLoading, setLinuxdoLoading] = useState(false); const [emailRegisterLoading, setEmailRegisterLoading] = useState(false); const [registerLoading, setRegisterLoading] = useState(false); const [verificationCodeLoading, setVerificationCodeLoading] = useState(false); const [otherRegisterOptionsLoading, setOtherRegisterOptionsLoading] = useState(false); const [wechatCodeSubmitLoading, setWechatCodeSubmitLoading] = useState(false); const logo = getLogo(); const systemName = getSystemName(); let affCode = new URLSearchParams(window.location.search).get('aff'); if (affCode) { localStorage.setItem('aff', affCode); } const [status] = useState(() => { const savedStatus = localStorage.getItem('status'); return savedStatus ? JSON.parse(savedStatus) : {}; }); const [showEmailVerification, setShowEmailVerification] = useState(() => { return status.email_verification ?? false; }); useEffect(() => { setShowEmailVerification(status.email_verification); if (status.turnstile_check) { setTurnstileEnabled(true); setTurnstileSiteKey(status.turnstile_site_key); } }, [status]); const onWeChatLoginClicked = () => { setWechatLoading(true); setShowWeChatLoginModal(true); setWechatLoading(false); }; const onSubmitWeChatVerificationCode = async () => { if (turnstileEnabled && turnstileToken === '') { showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); return; } setWechatCodeSubmitLoading(true); try { const res = await API.get( `/api/oauth/wechat?code=${inputs.wechat_verification_code}`, ); const { success, message, data } = res.data; if (success) { userDispatch({ type: 'login', payload: data }); localStorage.setItem('user', JSON.stringify(data)); setUserData(data); updateAPI(); navigate('/'); showSuccess('登录成功!'); setShowWeChatLoginModal(false); } else { showError(message); } } catch (error) { showError('登录失败,请重试'); } finally { setWechatCodeSubmitLoading(false); } }; function handleChange(name, value) { setInputs((inputs) => ({ ...inputs, [name]: value })); } async function handleSubmit(e) { if (password.length < 8) { showInfo('密码长度不得小于 8 位!'); return; } if (password !== password2) { showInfo('两次输入的密码不一致'); return; } if (username && password) { if (turnstileEnabled && turnstileToken === '') { showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); return; } setRegisterLoading(true); try { if (!affCode) { affCode = localStorage.getItem('aff'); } inputs.aff_code = affCode; const res = await API.post( `/api/user/register?turnstile=${turnstileToken}`, inputs, ); const { success, message } = res.data; if (success) { navigate('/login'); showSuccess('注册成功!'); } else { showError(message); } } catch (error) { showError('注册失败,请重试'); } finally { setRegisterLoading(false); } } } const sendVerificationCode = async () => { if (inputs.email === '') return; if (turnstileEnabled && turnstileToken === '') { showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); return; } setVerificationCodeLoading(true); try { const res = await API.get( `/api/verification?email=${inputs.email}&turnstile=${turnstileToken}`, ); const { success, message } = res.data; if (success) { showSuccess('验证码发送成功,请检查你的邮箱!'); } else { showError(message); } } catch (error) { showError('发送验证码失败,请重试'); } finally { setVerificationCodeLoading(false); } }; const handleGitHubClick = () => { setGithubLoading(true); try { onGitHubOAuthClicked(status.github_client_id); } finally { setTimeout(() => setGithubLoading(false), 3000); } }; const handleOIDCClick = () => { setOidcLoading(true); try { onOIDCClicked( status.oidc_authorization_endpoint, status.oidc_client_id ); } finally { setTimeout(() => setOidcLoading(false), 3000); } }; const handleLinuxDOClick = () => { setLinuxdoLoading(true); try { onLinuxDOOAuthClicked(status.linuxdo_client_id); } finally { setTimeout(() => setLinuxdoLoading(false), 3000); } }; const handleEmailRegisterClick = () => { setEmailRegisterLoading(true); setShowEmailRegister(true); setEmailRegisterLoading(false); }; const handleOtherRegisterOptionsClick = () => { setOtherRegisterOptionsLoading(true); setShowEmailRegister(false); setOtherRegisterOptionsLoading(false); }; const onTelegramLoginClicked = async (response) => { const fields = [ 'id', 'first_name', 'last_name', 'username', 'photo_url', 'auth_date', 'hash', 'lang', ]; const params = {}; fields.forEach((field) => { if (response[field]) { params[field] = response[field]; } }); try { const res = await API.get(`/api/oauth/telegram/login`, { params }); const { success, message, data } = res.data; if (success) { userDispatch({ type: 'login', payload: data }); localStorage.setItem('user', JSON.stringify(data)); showSuccess('登录成功!'); setUserData(data); updateAPI(); navigate('/'); } else { showError(message); } } catch (error) { showError('登录失败,请重试'); } }; const renderOAuthOptions = () => { return (
{t('微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)')}