import React, { useState, useEffect } from 'react'; import { KnowledgeGroup, CreateGroupData, UpdateGroupData } from '../types'; import { knowledgeGroupService } from '../services/knowledgeGroupService'; import { useToast } from '../contexts/ToastContext'; import { useConfirm } from '../contexts/ConfirmContext'; import { useLanguage } from '../contexts/LanguageContext'; 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 { showSuccess, showError } = useToast(); const { confirm } = useConfirm(); const { t } = useLanguage(); 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(); showSuccess(t('successNoteCreated')); // Note: Should probably have a more specific translation for group } catch (error) { showError(t('createFailed')); } 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(); showSuccess(t('successNoteUpdated')); } catch (error) { showError(t('updateFailedRetry')); } finally { setLoading(false); } }; const handleDelete = async (group: KnowledgeGroup) => { if (!(await confirm(t('confirmDeleteGroup').replace('$1', group.name)))) return; try { await knowledgeGroupService.deleteGroup(group.id); onGroupsChange(groups.filter(g => g.id !== group.id)); showSuccess(t('successNoteDeleted')); } catch (error) { showError(t('deleteFailed')); } }; 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 ? t('editNotebookTitle') : t('createNotebookTitle')}

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={t('namePlaceholder')} required />