"use client"; import { useState, useEffect } from "react"; import { Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet"; import { Switch } from "@/components/ui/switch"; import { Project, ProjectStatus, ProjectFormData, STATUS_CONFIG, projectToFormData, formDataToCreateProject, formDataToUpdateProject, } from "@/types/project"; import { createProject, updateProject } from "@/lib/projectsService"; interface ProjectFormSheetProps { open: boolean; onOpenChange: (open: boolean) => void; mode: "create" | "edit"; project?: Project | null; onSuccess?: (project: Project) => void; } const defaultFormData: ProjectFormData = { name: "", description: "", status: "0", progress: 0, budget: 0, startDate: "", endDate: "", isPublic: true, }; export function ProjectFormSheet({ open, onOpenChange, mode, project, onSuccess, }: ProjectFormSheetProps) { const [formData, setFormData] = useState(defaultFormData); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); // Initialize form data when project changes (for edit mode) useEffect(() => { if (mode === "edit" && project) { setFormData(projectToFormData(project)); } else { setFormData(defaultFormData); } setError(null); }, [mode, project, open]); const handleInputChange = ( e: React.ChangeEvent ) => { const { name, value, type } = e.target; setFormData((prev) => ({ ...prev, [name]: type === "number" ? parseFloat(value) || 0 : value, })); }; const handleSelectChange = (name: string, value: string) => { setFormData((prev) => ({ ...prev, [name]: value, })); }; const handleSwitchChange = (name: string, checked: boolean) => { setFormData((prev) => ({ ...prev, [name]: checked, })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); setError(null); try { let result: Project; if (mode === "create") { const createData = formDataToCreateProject(formData); result = await createProject(createData); } else { if (!project) { throw new Error("No hay proyecto para editar"); } const updateData = formDataToUpdateProject(formData); result = await updateProject(project.id, updateData); } onSuccess?.(result); onOpenChange(false); } catch (err) { console.error("Error submitting project:", err); setError( err instanceof Error ? err.message : "Error al guardar el proyecto" ); } finally { setIsSubmitting(false); } }; const isFormValid = formData.name.trim().length > 0; return ( {mode === "create" ? "Nuevo Proyecto" : "Editar Proyecto"} {mode === "create" ? "Crea un nuevo proyecto para gestionar tus tareas." : "Modifica los detalles del proyecto."}
{/* Nombre */}
{/* Descripción */}