/* Copyright (C) 2025 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { API, showError, showSuccess } from '../../helpers'; import { Button, Card, Divider, Form, Input, Typography, } from '@douyinfe/semi-ui'; import React, { useState } from 'react'; const { Title, Text, Paragraph } = Typography; const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { const [loading, setLoading] = useState(false); const [useBackupCode, setUseBackupCode] = useState(false); const [verificationCode, setVerificationCode] = useState(''); const handleSubmit = async () => { if (!verificationCode) { showError('请输入验证码'); return; } // Validate code format if (useBackupCode && verificationCode.length !== 8) { showError('备用码必须是8位'); return; } else if (!useBackupCode && !/^\d{6}$/.test(verificationCode)) { showError('验证码必须是6位数字'); return; } setLoading(true); try { const res = await API.post('/api/user/login/2fa', { code: verificationCode, }); if (res.data.success) { showSuccess('登录成功'); // 保存用户信息到本地存储 localStorage.setItem('user', JSON.stringify(res.data.data)); if (onSuccess) { onSuccess(res.data.data); } } else { showError(res.data.message); } } catch (error) { showError('验证失败,请重试'); } finally { setLoading(false); } }; const handleKeyPress = (e) => { if (e.key === 'Enter') { handleSubmit(); } }; if (isModal) { return (
请输入认证器应用显示的验证码完成登录
{onBack && ( )}
提示:
• 验证码每30秒更新一次
• 如果无法获取验证码,请使用备用码
• 每个备用码只能使用一次
); } return (
两步验证 请输入认证器应用显示的验证码完成登录
{onBack && ( )}
提示:
• 验证码每30秒更新一次
• 如果无法获取验证码,请使用备用码
• 每个备用码只能使用一次
); }; export default TwoFAVerification;