import { useState } from 'react' import { CheckCircle, Edit2, Plus, Star, Trash2, XCircle } from 'lucide-react' import { Button, Card, FormItem, Input, Modal, Table, Textarea, toast } from '../../../shared/components' import type { TableColumn } from '../../../shared/components/Table' import type { BrowserCore, BrowserCoreInput, BrowserSettings } from '../types' import { deleteBrowserCore, saveBrowserCore, saveBrowserSettings, setDefaultBrowserCore, validateBrowserCorePath, } from '../api' interface BrowserSettingsModalProps { open: boolean onClose: () => void settings: BrowserSettings cores: BrowserCore[] onCoresChange: (cores: BrowserCore[]) => void } export function BrowserSettingsModal({ open, onClose, settings: initSettings, cores, onCoresChange }: BrowserSettingsModalProps) { const [settings, setSettings] = useState(initSettings) const [fingerprintText, setFingerprintText] = useState((initSettings.defaultFingerprintArgs || []).join('\n')) const [launchText, setLaunchText] = useState((initSettings.defaultLaunchArgs || []).join('\n')) const [saving, setSaving] = useState(false) // 内核编辑弹窗 const [coreModalOpen, setCoreModalOpen] = useState(false) const [coreForm, setCoreForm] = useState({ coreId: '', coreName: '', corePath: '', isDefault: false }) const [coreValidation, setCoreValidation] = useState<{ valid: boolean; message: string } | null>(null) const [savingCore, setSavingCore] = useState(false) const handleSave = async () => { setSaving(true) try { await saveBrowserSettings({ ...settings, defaultFingerprintArgs: fingerprintText.split('\n').map(s => s.trim()).filter(Boolean), defaultLaunchArgs: launchText.split('\n').map(s => s.trim()).filter(Boolean), }) toast.success('配置已保存') onClose() } catch (error: any) { toast.error(error?.message || '保存失败') } finally { setSaving(false) } } const handleOpenCoreModal = (core?: BrowserCore) => { setCoreForm(core ? { ...core } : { coreId: '', coreName: '', corePath: '', isDefault: false }) setCoreValidation(null) setCoreModalOpen(true) } const handleValidateCorePath = async () => { if (!coreForm.corePath.trim()) { setCoreValidation({ valid: false, message: '请输入路径' }); return } setCoreValidation(await validateBrowserCorePath(coreForm.corePath)) } const handleSaveCore = async () => { if (!coreForm.coreName.trim()) { toast.error('请输入内核名称'); return } if (!coreForm.corePath.trim()) { toast.error('请输入内核路径'); return } setSavingCore(true) try { await saveBrowserCore(coreForm) toast.success('内核已保存') setCoreModalOpen(false) // 刷新 cores 列表 const { fetchBrowserCores } = await import('../api') onCoresChange(await fetchBrowserCores()) } catch (error: any) { toast.error(error?.message || '保存失败') } finally { setSavingCore(false) } } const handleDeleteCore = async (coreId: string) => { if (cores.length <= 1) { toast.error('至少保留一个内核'); return } await deleteBrowserCore(coreId) toast.success('内核已删除') const { fetchBrowserCores } = await import('../api') onCoresChange(await fetchBrowserCores()) } const handleSetDefaultCore = async (coreId: string) => { await setDefaultBrowserCore(coreId) toast.success('已设为默认') const { fetchBrowserCores } = await import('../api') onCoresChange(await fetchBrowserCores()) } const coreColumns: TableColumn[] = [ { key: 'coreName', title: '名称' }, { key: 'corePath', title: '路径' }, { key: 'isDefault', title: '默认', render: (v) => v ? : null }, { key: 'actions', title: '操作', align: 'right', render: (_, record) => (
{!record.isDefault && }
), }, ] return ( <> }>
内核管理
setSettings(p => ({ ...p, userDataRoot: e.target.value }))} placeholder="data" />