import { useEffect, useState } from 'react'; import { createModelGroup, deleteModelGroup, fetchModelGroups, updateModelGroup } from '../api'; import type { ModelGroup } from '../api'; import './ApiKeys.css'; // 复用相同样式 type EditState = { id: number; name: string; note: string }; export function ModelGroups() { const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showAdd, setShowAdd] = useState(false); const [newName, setNewName] = useState(''); const [newNote, setNewNote] = useState(''); const [addError, setAddError] = useState(null); const [adding, setAdding] = useState(false); const [editState, setEditState] = useState(null); const [editError, setEditError] = useState(null); const [saving, setSaving] = useState(false); const load = () => { setLoading(true); fetchModelGroups() .then(setGroups) .catch(() => setError('加载失败')) .finally(() => setLoading(false)); }; useEffect(() => { load(); }, []); const handleAdd = async () => { if (!newName.trim()) { setAddError('分组名称不能为空'); return; } setAdding(true); setAddError(null); try { await createModelGroup(newName.trim(), newNote.trim() || undefined); setNewName(''); setNewNote(''); setShowAdd(false); load(); } catch (e) { setAddError(e instanceof Error ? e.message : String(e)); } finally { setAdding(false); } }; const handleDelete = async (id: number, name: string) => { if (!confirm(`确认删除分组「${name}」?该分组下的模型将变为未分组状态。`)) return; try { await deleteModelGroup(id); if (editState?.id === id) setEditState(null); load(); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } }; const startEdit = (g: ModelGroup) => { if (editState?.id === g.id) { setEditState(null); return; } setEditState({ id: g.id, name: g.name, note: g.note ?? '' }); setEditError(null); }; const handleSave = async () => { if (!editState) return; if (!editState.name.trim()) { setEditError('分组名称不能为空'); return; } setSaving(true); setEditError(null); try { await updateModelGroup(editState.id, { name: editState.name.trim(), note: editState.note.trim() || null }); setEditState(null); load(); } catch (e) { setEditError(e instanceof Error ? e.message : String(e)); } finally { setSaving(false); } }; return (
模型分组管理
在此管理分组,然后在「模型管理」中批量归组
{error &&
{error}
} {showAdd && (
添加新分组
setNewName(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleAdd()} />
setNewNote(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleAdd()} />
{addError &&
{addError}
}
)} {loading ? (
加载中…
) : groups.length === 0 ? (
暂无分组,点击「添加分组」开始
) : (
{groups.map(g => (
{g.name} {g.model_count} 个模型
{g.note &&
{g.note}
}
创建于 {new Date(g.created_at).toLocaleDateString()}
{editState?.id === g.id && (
setEditState(s => s ? { ...s, name: e.target.value } : s)} />
setEditState(s => s ? { ...s, note: e.target.value } : s)} />
{editError &&
{editError}
}
)}
))}
)} {groups.length > 0 &&
共 {groups.length} 个分组
}
); }