'use client'; import { useState, useEffect } from 'react'; import { QRCodeSVG } from 'qrcode.react'; import { PageHeader } from '@/components/layout/page-header'; import { useConfigs, useUpdateConfig, useTransferEnabled, useSetTransferEnabled, useMiningStatus, useActivateMining, useDeactivateMining, useP2pTransferFee, useSetP2pTransferFee, usePoolAccounts, usePoolAccountBalance, usePoolAccountBlockchainWithdraw, usePoolAccountCentralizedDeposit } from '@/features/configs/hooks/use-configs'; import type { PoolAccountInfo, PoolAccountBalance } from '@/features/configs/api/configs.api'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Switch } from '@/components/ui/switch'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogFooter, DialogTrigger, } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; import { Skeleton } from '@/components/ui/skeleton'; import { Badge } from '@/components/ui/badge'; import { Pencil, Save, X, Play, Pause, AlertCircle, CheckCircle2, Loader2, Wallet, PlusCircle, MinusCircle, Copy, Check, Flame, HardHat } from 'lucide-react'; import type { SystemConfig } from '@/types/config'; // 根据 blockchainPoolType 映射视觉属性 const poolVisualMap: Record = { BURN_POOL: { icon: Flame, color: 'orange' }, MINING_POOL: { icon: HardHat, color: 'blue' }, }; const categoryLabels: Record = { mining: '挖矿配置', trading: '交易配置', distribution: '分配配置', system: '系统配置', }; // 池账户卡片子组件 function PoolAccountCard({ pool }: { pool: PoolAccountInfo }) { const { data: balance, isLoading } = usePoolAccountBalance(pool.walletName); const blockchainWithdrawMutation = usePoolAccountBlockchainWithdraw(); const centralizedDepositMutation = usePoolAccountCentralizedDeposit(); const [withdrawAddress, setWithdrawAddress] = useState(''); const [withdrawAmount, setWithdrawAmount] = useState(''); const [depositAmount, setDepositAmount] = useState(''); const [copiedAddress, setCopiedAddress] = useState(null); const visual = poolVisualMap[pool.blockchainPoolType] || { icon: Wallet, color: 'gray' }; const Icon = visual.icon; const colorClass = visual.color === 'orange' ? 'text-orange-500' : visual.color === 'blue' ? 'text-blue-500' : 'text-gray-500'; const handleCopyAddress = async (address: string) => { await navigator.clipboard.writeText(address); setCopiedAddress(address); setTimeout(() => setCopiedAddress(null), 2000); }; const formatBalance = (value: string | undefined, decimals: number = 2) => { if (!value) return '0'; const num = parseFloat(value); if (isNaN(num)) return '0'; return num.toLocaleString(undefined, { minimumFractionDigits: decimals, maximumFractionDigits: decimals }); }; return (
{pool.name} 2-of-3 门限
钱包: {pool.walletName}
{isLoading ? ( ) : (

总余额

{formatBalance(balance?.balance)}

可用余额

{formatBalance(balance?.availableBalance)}

冻结中

{formatBalance(balance?.frozenBalance)}

)}
{/* 充值(中心化 + 区块链) */} 充值 — {pool.name} 选择充值方式向{pool.name}充值 中心化充值 区块链充值
setDepositAmount(e.target.value)} placeholder="请输入金额" />
向以下地址转入 fUSDT(积分值代币)
{balance?.walletAddress ? (
{balance.walletAddress}
转账后系统将自动检测并入账(约需12个区块确认)
) : (

钱包地址未配置

)}
{/* 区块链提现 */} 区块链提现 — {pool.name} 转账 fUSDT(积分值代币)到指定地址
setWithdrawAddress(e.target.value)} placeholder="0x..." />
setWithdrawAmount(e.target.value)} placeholder="请输入金额" />
区块链提现将通过 2-of-3 门限签名从{pool.name}钱包转账到目标地址
); } export default function ConfigsPage() { const { data: configs, isLoading } = useConfigs(); const { data: transferEnabled, isLoading: transferLoading } = useTransferEnabled(); const { data: miningStatus, isLoading: miningLoading } = useMiningStatus(); const updateConfig = useUpdateConfig(); const setTransferEnabled = useSetTransferEnabled(); const activateMining = useActivateMining(); const deactivateMining = useDeactivateMining(); const { data: feeConfig, isLoading: feeLoading } = useP2pTransferFee(); const setP2pTransferFee = useSetP2pTransferFee(); const { data: poolAccounts, isLoading: poolAccountsLoading } = usePoolAccounts(); const [editingConfig, setEditingConfig] = useState(null); const [editValue, setEditValue] = useState(''); const [feeValue, setFeeValue] = useState(''); const [minAmountValue, setMinAmountValue] = useState(''); useEffect(() => { if (feeConfig) { setFeeValue(feeConfig.fee); setMinAmountValue(feeConfig.minTransferAmount); } }, [feeConfig]); const handleEdit = (config: SystemConfig) => { setEditingConfig(config); setEditValue(config.configValue); }; const handleSave = () => { if (editingConfig) { updateConfig.mutate({ key: editingConfig.configKey, value: editValue }); setEditingConfig(null); } }; const handleTransferToggle = (checked: boolean) => { setTransferEnabled.mutate(checked); }; const groupedConfigs = configs?.reduce( (acc, config) => { const category = config.category || 'system'; if (!acc[category]) { acc[category] = []; } acc[category].push(config); return acc; }, {} as Record ); const formatNumber = (value: string) => { return parseFloat(value).toLocaleString(); }; return (
{/* 挖矿状态卡片 */}
挖矿系统状态 控制挖矿分配系统的运行状态
{miningLoading ? ( ) : miningStatus?.error ? ( 连接失败 ) : miningStatus?.isActive ? ( 运行中 ) : ( 已停用 )}
{miningLoading ? ( ) : miningStatus?.error ? (

无法连接到挖矿服务

{miningStatus.error}

) : !miningStatus?.initialized ? (

挖矿系统未初始化

请运行 seed 脚本初始化挖矿配置

) : (

当前时代

第 {miningStatus.currentEra} 时代

剩余分配量

{formatNumber(miningStatus.remainingDistribution)}

每秒分配

{formatNumber(miningStatus.secondDistribution)}

挖矿账户数

{miningStatus.accountCount}

{/* 算力同步状态提示 */} {miningStatus.contributionSyncStatus && !miningStatus.contributionSyncStatus.isSynced && (

全网算力同步中...

mining-service 全网理论算力: {formatNumber(miningStatus.contributionSyncStatus.miningNetworkTotal)} / contribution-service 全网理论算力: {formatNumber(miningStatus.contributionSyncStatus.networkTotalContribution)}

)}
{miningStatus.isActive ? ( ) : ( )}
)}
{/* 池账户管理 — 动态渲染 */} {poolAccountsLoading ? (
) : poolAccounts && poolAccounts.length > 0 ? (
{poolAccounts.map((pool) => ( ))}
) : null} 划转开关 控制用户是否可以进行挖矿账户到交易账户的划转

允许用户划转

开启后用户可以将挖矿获得的积分股划转到交易账户

{transferLoading ? ( ) : ( )}
{/* P2P划转手续费设置 */} P2P划转手续费设置 配置用户间划转(P2P转账)的手续费和最小划转金额 {feeLoading ? ( ) : (
setFeeValue(e.target.value)} />
setMinAmountValue(e.target.value)} />
{parseFloat(minAmountValue) <= parseFloat(feeValue) && feeValue !== '' && minAmountValue !== '' && (

最小划转金额必须大于手续费

)}
)}
{isLoading ? ( ) : ( Object.entries(groupedConfigs || {}).map(([category, configs]) => ( {categoryLabels[category] || category} 配置项 描述 当前值 操作 {configs.map((config) => ( {config.configKey} {config.description} {config.configValue} {config.isEditable && ( )} ))}
)) )} setEditingConfig(null)}> 编辑配置

{editingConfig?.description}

setEditValue(e.target.value)} />
); }