import React, { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { toast } from "@/lib/custom-toast"; import { format, parseISO } from "date-fns"; // UI Components import Layout from "@/components/layout/layout"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { cn } from "@/lib/utils"; // Types & API import { Deliverable, DeliverableUpdateRequest, ProjectApi } from "@/types"; import { deliverablesApi, projectService } from "@/lib/api"; // Form schema const formSchema = z.object({ name: z.string().min(1, "Name is required"), description: z.string().min(1, "Description is required"), deliveryDate: z.string().min(1, "Delivery date is required"), projectId: z.string().min(1, "Project is required"), }); type FormData = z.infer; const DeliverableEdit = () => { const { id } = useParams<{ id: string }>(); const deliverableId = parseInt(id || "0", 10); const navigate = useNavigate(); const queryClient = useQueryClient(); // Add debug log for ID console.log(`Editing deliverable with ID: ${deliverableId}, raw ID param: ${id}`); const [deliverable, setDeliverable] = useState(null); const [projects, setProjects] = useState([]); const [isLoadingDeliverable, setIsLoadingDeliverable] = useState(true); const [isLoadingProjects, setIsLoadingProjects] = useState(true); const [error, setError] = useState(null); // Form setup const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: "", description: "", deliveryDate: format(new Date(), "yyyy-MM-dd"), projectId: "", }, }); // Fetch deliverable data useEffect(() => { const fetchDeliverable = async () => { if (!deliverableId) return; try { setIsLoadingDeliverable(true); const data = await deliverablesApi.getById(deliverableId); setDeliverable(data); // Set form values form.reset({ name: data.name, description: data.description, deliveryDate: format(parseISO(data.deliveryDate), "yyyy-MM-dd"), projectId: data.projectId.toString(), }); } catch (err) { console.error("Error fetching deliverable:", err); setError("Failed to load deliverable data"); } finally { setIsLoadingDeliverable(false); } }; fetchDeliverable(); }, [deliverableId, form]); // Fetch projects useEffect(() => { const fetchProjects = async () => { try { setIsLoadingProjects(true); const fetchedProjects = await projectService.getAll(); setProjects(fetchedProjects); } catch (err) { console.error("Error fetching projects:", err); // Don't set an error here, as we can still edit without projects list } finally { setIsLoadingProjects(false); } }; fetchProjects(); }, []); // Update deliverable mutation const updateDeliverableMutation = useMutation({ mutationFn: (data: DeliverableUpdateRequest) => deliverablesApi.update(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["deliverables"] }); queryClient.invalidateQueries({ queryKey: ["deliverable", deliverableId] }); toast.success("Deliverable updated successfully"); navigate("/deliverables"); }, onError: (error) => { console.error("Update error:", error); toast.error("Failed to update deliverable"); }, }); // Form submission handler const onSubmit = (data: FormData) => { const deliverableData: DeliverableUpdateRequest = { id: deliverableId, name: data.name, description: data.description, deliveryDate: new Date(data.deliveryDate).toISOString(), projectId: parseInt(data.projectId, 10), }; updateDeliverableMutation.mutate(deliverableData); }; if (isLoadingDeliverable) { return (

Loading deliverable data...

); } if (error) { return (

{error}

); } // Get today's date formatted for the date input const today = format(new Date(), "yyyy-MM-dd"); return (

Edit Deliverable

( Name )} /> ( Description