import React, { useState, useEffect } from 'react'; import { KnowledgeGroup, CreateGroupData, UpdateGroupData } from '../types'; import { knowledgeGroupService } from '../services/knowledgeGroupService'; import { useToast } from '../contexts/ToastContext'; import { Folder, Plus, Edit2, Trash2, X } from 'lucide-react'; interface GroupManagerProps { groups: KnowledgeGroup[]; onGroupsChange: (groups: KnowledgeGroup[]) => void; } const DEFAULT_COLORS = [ '#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#84CC16', '#F97316' ]; export const GroupManager: React.FC = ({ groups, onGroupsChange }) => { const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [editingGroup, setEditingGroup] = useState(null); const [formData, setFormData] = useState({ name: '', description: '', color: DEFAULT_COLORS[0], }); const [loading, setLoading] = useState(false); const { showToast } = useToast(); const resetForm = () => { setFormData({ name: '', description: '', color: DEFAULT_COLORS[0], }); }; const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.name.trim()) return; setLoading(true); try { const newGroup = await knowledgeGroupService.createGroup(formData); onGroupsChange([...groups, newGroup]); setIsCreateModalOpen(false); resetForm(); showToast('分组创建成功', 'success'); } catch (error) { showToast('创建分组失败', 'error'); } finally { setLoading(false); } }; const handleUpdate = async (e: React.FormEvent) => { e.preventDefault(); if (!editingGroup || !formData.name.trim()) return; setLoading(true); try { const updatedGroup = await knowledgeGroupService.updateGroup(editingGroup.id, formData); onGroupsChange(groups.map(g => g.id === editingGroup.id ? updatedGroup : g)); setEditingGroup(null); resetForm(); showToast('分组更新成功', 'success'); } catch (error) { showToast('更新分组失败', 'error'); } finally { setLoading(false); } }; const handleDelete = async (group: KnowledgeGroup) => { if (!confirm(`确定要删除分组"${group.name}"吗?`)) return; try { await knowledgeGroupService.deleteGroup(group.id); onGroupsChange(groups.filter(g => g.id !== group.id)); showToast('分组删除成功', 'success'); } catch (error) { showToast('删除分组失败', 'error'); } }; const openEditModal = (group: KnowledgeGroup) => { setEditingGroup(group); setFormData({ name: group.name, description: group.description || '', color: group.color, }); }; const closeModal = () => { setIsCreateModalOpen(false); setEditingGroup(null); resetForm(); }; const isModalOpen = isCreateModalOpen || editingGroup !== null; return (
{/* 分组列表 */}
{groups.map((group) => (
{group.name}
{group.description && (
{group.description}
)}
{group.fileCount} 个文件
))}
{/* 创建按钮 */} {/* 创建/编辑模态框 */} {isModalOpen && (

{editingGroup ? '编辑分组' : '创建分组'}

setFormData({ ...formData, name: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="输入分组名称" required />