/* 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 React from 'react'; import { Button, Card, Input, Space, Typography, Avatar, Tabs, TabPane, Popover, Modal, } from '@douyinfe/semi-ui'; import { IconMail, IconShield, IconGithubLogo, IconKey, IconLock, IconDelete, } from '@douyinfe/semi-icons'; import { SiTelegram, SiWechat, SiLinux } from 'react-icons/si'; import { UserPlus, ShieldCheck } from 'lucide-react'; import TelegramLoginButton from 'react-telegram-login'; import { onGitHubOAuthClicked, onOIDCClicked, onLinuxDOOAuthClicked, } from '../../../../helpers'; import TwoFASetting from '../components/TwoFASetting'; const AccountManagement = ({ t, userState, status, systemToken, setShowEmailBindModal, setShowWeChatBindModal, generateAccessToken, handleSystemTokenClick, setShowChangePasswordModal, setShowAccountDeleteModal, passkeyStatus, passkeySupported, passkeyRegisterLoading, passkeyDeleteLoading, onPasskeyRegister, onPasskeyDelete, }) => { const renderAccountInfo = (accountId, label) => { if (!accountId || accountId === '') { return {t('未绑定')}; } const popContent = (
{accountId} {label ? (
{label}
) : null}
); return ( {accountId} ); }; const isBound = (accountId) => Boolean(accountId); const [showTelegramBindModal, setShowTelegramBindModal] = React.useState(false); const passkeyEnabled = passkeyStatus?.enabled; const lastUsedLabel = passkeyStatus?.last_used_at ? new Date(passkeyStatus.last_used_at).toLocaleString() : t('尚未使用'); return ( {/* 卡片头部 */}
{t('账户管理')}
{t('账户绑定、安全设置和身份验证')}
{/* 账户绑定 Tab */} {t('账户绑定')} } itemKey='binding' >
{/* 邮箱绑定 */}
{t('邮箱')}
{renderAccountInfo( userState.user?.email, t('邮箱地址'), )}
{/* 微信绑定 */}
{t('微信')}
{!status.wechat_login ? t('未启用') : isBound(userState.user?.wechat_id) ? t('已绑定') : t('未绑定')}
{/* GitHub绑定 */}
{t('GitHub')}
{renderAccountInfo( userState.user?.github_id, t('GitHub ID'), )}
{/* OIDC绑定 */}
{t('OIDC')}
{renderAccountInfo( userState.user?.oidc_id, t('OIDC ID'), )}
{/* Telegram绑定 */}
{t('Telegram')}
{renderAccountInfo( userState.user?.telegram_id, t('Telegram ID'), )}
{status.telegram_oauth ? ( isBound(userState.user?.telegram_id) ? ( ) : ( ) ) : ( )}
setShowTelegramBindModal(false)} footer={null} >
{t('点击下方按钮通过 Telegram 完成绑定')}
{/* LinuxDO绑定 */}
{t('LinuxDO')}
{renderAccountInfo( userState.user?.linux_do_id, t('LinuxDO ID'), )}
{/* 安全设置 Tab */} {t('安全设置')} } itemKey='security' >
{/* 系统访问令牌 */}
{t('系统访问令牌')} {t('用于API调用的身份验证令牌,请妥善保管')} {systemToken && (
} />
)}
{/* 密码管理 */}
{t('密码管理')} {t('定期更改密码可以提高账户安全性')}
{/* Passkey 设置 */}
{t('Passkey 登录')} {passkeyEnabled ? t('已启用 Passkey,无需密码即可登录') : t('使用 Passkey 实现免密且更安全的登录体验')}
{t('最后使用时间')}:{lastUsedLabel}
{/*{passkeyEnabled && (*/} {/*
*/} {/* {t('备份支持')}:*/} {/* {passkeyStatus?.backup_eligible*/} {/* ? t('支持备份')*/} {/* : t('不支持')}*/} {/* ,{t('备份状态')}:*/} {/* {passkeyStatus?.backup_state ? t('已备份') : t('未备份')}*/} {/*
*/} {/*)}*/} {!passkeySupported && (
{t('当前设备不支持 Passkey')}
)}
{/* 两步验证设置 */} {/* 危险区域 */}
{t('删除账户')} {t('此操作不可逆,所有数据将被永久删除')}
); }; export default AccountManagement;