import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Plus, Folder, Pencil, Trash2, Loader2, Database } from 'lucide-react'; import { useProjectStore, type Project } from '@/store/projectStore'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { useNavigate } from 'react-router-dom'; export function Projects() { const { t } = useTranslation(); const { projects, loading, fetchProjects, addProject, updateProject, deleteProject, setCurrentProject } = useProjectStore(); const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [isEditDialogOpen, setIsEditDialogOpen] = useState(false); const [editingProject, setEditingProject] = useState(null); const [formData, setFormData] = useState({ name: '', description: '' }); const [isSubmitting, setIsSubmitting] = useState(false); const navigate = useNavigate(); useEffect(() => { fetchProjects(); }, [fetchProjects]); const handleCreate = async () => { if (!formData.name.trim()) return; setIsSubmitting(true); try { await addProject(formData.name, formData.description); setFormData({ name: '', description: '' }); setIsCreateDialogOpen(false); } catch (error) { console.error('Failed to create project:', error); } finally { setIsSubmitting(false); } }; const handleUpdate = async () => { if (!editingProject || !formData.name.trim()) return; setIsSubmitting(true); try { await updateProject(editingProject.id, formData.name, formData.description); setEditingProject(null); setFormData({ name: '', description: '' }); setIsEditDialogOpen(false); } catch (error) { console.error('Failed to update project:', error); } finally { setIsSubmitting(false); } }; const handleDelete = async (id: number) => { if (!window.confirm(t('confirmDeleteProject'))) return; try { await deleteProject(id); } catch (error) { console.error('Failed to delete project:', error); } }; const openEditDialog = (project: Project) => { setEditingProject(project); setFormData({ name: project.name, description: project.description || '' }); setIsEditDialogOpen(true); }; const goToDataSources = (project: Project) => { setCurrentProject(project); navigate('/datasources'); }; return (
{t('projectManagement')}
{t('projectList')} {t('manageProjectsDesc')} {loading && projects.length === 0 ? (

{t('loading')}

) : projects.length === 0 ? (

{t('noProjectsCreateOne')}

) : ( {t('name')} {t('description')} {t('createdAt')} {t('actions')} {projects.map((project) => ( {project.name} {project.description || '-'} {new Date(project.created_at).toLocaleDateString()}
))}
)}
{/* Create Dialog */} {t('newProject')}
setFormData({ ...formData, name: e.target.value })} placeholder={t('enterProjectName')} />