import { useState, useEffect } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import axios from 'axios'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; 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 { Loader2 } from 'lucide-react'; import { API_BASE_URL } from '@/constants/apiConfig'; interface Cargo { id: string; cargoReference: string; description: string; quantity: number; weight: number; status: 'PENDING' | 'LOADED' | 'IN_TRANSIT' | 'DELIVERED' | 'CANCELLED'; remarks?: string; } interface CargoFormDialogProps { open: boolean; onOpenChange: (open: boolean) => void; cargo?: Cargo | null; onSuccess?: () => void; } export default function CargoFormDialog({ open, onOpenChange, cargo, onSuccess, }: CargoFormDialogProps) { const queryClient = useQueryClient(); const [formData, setFormData] = useState>({ cargoReference: '', description: '', quantity: 0, weight: 0, status: 'PENDING', remarks: '', }); useEffect(() => { if (cargo) { setFormData(cargo); } else { setFormData({ cargoReference: '', description: '', quantity: 0, weight: 0, status: 'PENDING', remarks: '', }); } }, [cargo, open]); const createMutation = useMutation({ mutationFn: (data: Partial) => axios.post(`${API_BASE_URL}/api/cargoes`, data), onSuccess: () => { toast.success('Cargo created successfully'); onOpenChange(false); queryClient.invalidateQueries({ queryKey: ['cargoes'] }); onSuccess?.(); }, onError: (error) => { const message = axios.isAxiosError(error) ? error.response?.data?.message || 'Failed to create cargo' : 'Failed to create cargo'; toast.error(message); }, }); const updateMutation = useMutation({ mutationFn: (data: Partial) => axios.patch(`${API_BASE_URL}/api/cargoes/${cargo?.id}`, data), onSuccess: () => { toast.success('Cargo updated successfully'); onOpenChange(false); queryClient.invalidateQueries({ queryKey: ['cargoes'] }); onSuccess?.(); }, onError: (error) => { const message = axios.isAxiosError(error) ? error.response?.data?.message || 'Failed to update cargo' : 'Failed to update cargo'; toast.error(message); }, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!formData.cargoReference || !formData.description) { toast.error('Please fill in all required fields'); return; } if (cargo?.id) { updateMutation.mutate(formData); } else { createMutation.mutate(formData); } }; const isLoading = createMutation.isPending || updateMutation.isPending; return ( {cargo ? 'Edit Cargo' : 'Create New Cargo'}
setFormData({ ...formData, cargoReference: e.target.value }) } placeholder="e.g., CRG001" required />