"use client"; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Upload, Plus, FileText } from 'lucide-react'; import { ScriptUploadItem, StatsOverview } from '@/lib/types'; import { PlatformSelector, OwnerSelector, StatusSelector } from '@/components/shared'; interface AccountUploadProps { onUpload: (accounts: ScriptUploadItem[], ownerId: string) => Promise; stats?: StatsOverview | null; } export function AccountUpload({ onUpload, stats }: AccountUploadProps) { const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const [ownerId, setOwnerId] = useState(''); // 文本上传 const [textData, setTextData] = useState(''); const [defaultStatus, setDefaultStatus] = useState('available'); const [defaultPlatform, setDefaultPlatform] = useState(''); // 单个添加 const [singleAccount, setSingleAccount] = useState({ customId: '', data: '' }); const parseTextData = (text: string): ScriptUploadItem[] => { const lines = text.trim().split('\n').filter(line => line.trim()); const accounts: ScriptUploadItem[] = []; for (const line of lines) { try { // 支持多种格式 if (line.includes('----')) { // ---- 分隔格式:customId----data(data中可能包含更多的----) const firstSeparatorIndex = line.indexOf('----'); if (firstSeparatorIndex > 0) { const customId = line.substring(0, firstSeparatorIndex).trim(); const data = line.substring(firstSeparatorIndex + 4).trim(); // 跳过第一个---- accounts.push({ platform: defaultPlatform, customId, data, status: defaultStatus }); } } else if (line.includes('\t')) { // 制表符分隔:platform\tcustomId\tdata\tstatus const parts = line.split('\t'); if (parts.length >= 3) { accounts.push({ platform: parts[0].trim(), customId: parts[1].trim(), data: parts[2].trim(), status: parts[3]?.trim() || defaultStatus }); } } else if (line.includes(',')) { // 逗号分隔:platform,customId,data,status const parts = line.split(','); if (parts.length >= 3) { accounts.push({ platform: parts[0].trim(), customId: parts[1].trim(), data: parts[2].trim(), status: parts[3]?.trim() || defaultStatus }); } } else if (line.startsWith('{') && line.endsWith('}')) { // JSON格式 const parsed = JSON.parse(line); if (parsed.platform && parsed.customId && parsed.data) { accounts.push({ platform: parsed.platform, customId: parsed.customId, data: typeof parsed.data === 'string' ? parsed.data : JSON.stringify(parsed.data), status: parsed.status || defaultStatus }); } } else { // 默认格式:整行作为ID和data const trimmedLine = line.trim(); if (trimmedLine) { accounts.push({ platform: defaultPlatform, customId: trimmedLine, data: trimmedLine, status: defaultStatus }); } } } catch (error) { console.warn('Failed to parse line:', line, error); } } return accounts; }; const handleTextUpload = async () => { if (!ownerId.trim()) { alert('请输入所有者ID'); return; } if (!textData.trim()) { alert('请输入账户数据'); return; } const accounts = parseTextData(textData); if (accounts.length === 0) { alert('未解析到有效的账户数据'); return; } setLoading(true); try { await onUpload(accounts, ownerId); setOpen(false); setTextData(''); setOwnerId(''); } finally { setLoading(false); } }; const handleSingleUpload = async () => { if (!ownerId.trim()) { alert('请输入所有者ID'); return; } if (!singleAccount.customId || !singleAccount.data) { alert('请填写完整的账户信息'); return; } setLoading(true); try { const accountToUpload = { platform: defaultPlatform, customId: singleAccount.customId, data: singleAccount.data, status: defaultStatus }; await onUpload([accountToUpload], ownerId); setOpen(false); setSingleAccount({ customId: '', data: '' }); setOwnerId(''); } finally { setLoading(false); } }; return ( 上传账户 支持批量上传和单个添加账户
批量上传 单个添加