import React, { useContext, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, Divider, Form, Header, Image, Message, Modal, } from 'semantic-ui-react'; import { Link, useNavigate } from 'react-router-dom'; import { API, copy, showError, showInfo, showNotice, showSuccess, } from '../helpers'; import Turnstile from 'react-turnstile'; import { UserContext } from '../context/User'; import { onGitHubOAuthClicked, onLarkOAuthClicked } from './utils'; const PersonalSetting = () => { const { t } = useTranslation(); const [userState, userDispatch] = useContext(UserContext); let navigate = useNavigate(); const [inputs, setInputs] = useState({ wechat_verification_code: '', email_verification_code: '', email: '', self_account_deletion_confirmation: '', }); const [status, setStatus] = useState({}); const [showWeChatBindModal, setShowWeChatBindModal] = useState(false); const [showEmailBindModal, setShowEmailBindModal] = useState(false); const [showAccountDeleteModal, setShowAccountDeleteModal] = useState(false); const [turnstileEnabled, setTurnstileEnabled] = useState(false); const [turnstileSiteKey, setTurnstileSiteKey] = useState(''); const [turnstileToken, setTurnstileToken] = useState(''); const [loading, setLoading] = useState(false); const [disableButton, setDisableButton] = useState(false); const [countdown, setCountdown] = useState(30); const [affLink, setAffLink] = useState(''); const [systemToken, setSystemToken] = useState(''); useEffect(() => { let status = localStorage.getItem('status'); if (status) { status = JSON.parse(status); setStatus(status); if (status.turnstile_check) { setTurnstileEnabled(true); setTurnstileSiteKey(status.turnstile_site_key); } } }, []); useEffect(() => { let countdownInterval = null; if (disableButton && countdown > 0) { countdownInterval = setInterval(() => { setCountdown(countdown - 1); }, 1000); } else if (countdown === 0) { setDisableButton(false); setCountdown(30); } return () => clearInterval(countdownInterval); // Clean up on unmount }, [disableButton, countdown]); const handleInputChange = (e, { name, value }) => { setInputs((inputs) => ({ ...inputs, [name]: value })); }; const generateAccessToken = async () => { const res = await API.get('/api/user/token'); const { success, message, data } = res.data; if (success) { setSystemToken(data); setAffLink(''); await copy(data); showSuccess(`令牌已重置并已复制到剪贴板`); } else { showError(message); } }; const getAffLink = async () => { const res = await API.get('/api/user/aff'); const { success, message, data } = res.data; if (success) { let link = `${window.location.origin}/register?aff=${data}`; setAffLink(link); setSystemToken(''); await copy(link); showSuccess(`邀请链接已复制到剪切板`); } else { showError(message); } }; const handleAffLinkClick = async (e) => { e.target.select(); await copy(e.target.value); showSuccess(`邀请链接已复制到剪切板`); }; const handleSystemTokenClick = async (e) => { e.target.select(); await copy(e.target.value); showSuccess(`系统令牌已复制到剪切板`); }; const deleteAccount = async () => { if (inputs.self_account_deletion_confirmation !== userState.user.username) { showError('请输入你的账户名以确认删除!'); return; } const res = await API.delete('/api/user/self'); const { success, message } = res.data; if (success) { showSuccess('账户已删除!'); await API.get('/api/user/logout'); userDispatch({ type: 'logout' }); localStorage.removeItem('user'); navigate('/login'); } else { showError(message); } }; const bindWeChat = async () => { if (inputs.wechat_verification_code === '') return; const res = await API.get( `/api/oauth/wechat/bind?code=${inputs.wechat_verification_code}` ); const { success, message } = res.data; if (success) { showSuccess('微信账户绑定成功!'); setShowWeChatBindModal(false); } else { showError(message); } }; const sendVerificationCode = async () => { setDisableButton(true); if (inputs.email === '') return; if (turnstileEnabled && turnstileToken === '') { showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); return; } setLoading(true); const res = await API.get( `/api/verification?email=${inputs.email}&turnstile=${turnstileToken}` ); const { success, message } = res.data; if (success) { showSuccess('验证码发送成功,请检查邮箱!'); } else { showError(message); } setLoading(false); }; const bindEmail = async () => { if (inputs.email_verification_code === '') return; setLoading(true); const res = await API.get( `/api/oauth/email/bind?email=${inputs.email}&code=${inputs.email_verification_code}` ); const { success, message } = res.data; if (success) { showSuccess('邮箱账户绑定成功!'); setShowEmailBindModal(false); } else { showError(message); } setLoading(false); }; return (
{t('setting.personal.binding.wechat.description')}