"use client" import { useState, useEffect } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Loader2, CheckCircle2, Package, FolderKanban, Globe } from "lucide-react" import { SidebarNavigation } from "@/components/sidebar-navigation" import { DataTable } from "@/components/data-table" import { PageHeader } from "@/components/page-header" import { fetchProjects, fetchAllPackages, createPackage, updatePackage, deletePackage, type Project, type Package as PackageType, type PackageCreate, type PackageUpdate } from "@/lib/api" import { toast } from "sonner" export default function CreatePackagePage() { const [packages, setPackages] = useState([]) const [projects, setProjects] = useState([]) const [isLoading, setIsLoading] = useState(true) const [isModalOpen, setIsModalOpen] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState(null) const [loadingProjects, setLoadingProjects] = useState(false) // Editing state const [isEditing, setIsEditing] = useState(false) const [currentPackage, setCurrentPackage] = useState(null) // Form fields const [selectedProjectId, setSelectedProjectId] = useState("") const [name, setName] = useState("") const [region, setRegion] = useState("") // Load packages and projects const loadPackages = async () => { try { setIsLoading(true) setError(null) const data = await fetchAllPackages() setPackages(data) } catch (err) { setError("Failed to load packages. Please check if the backend is running.") } finally { setIsLoading(false) } } const loadProjects = async () => { try { setLoadingProjects(true) const data = await fetchProjects() setProjects(data) } catch (err) { setError("Failed to load projects.") } finally { setLoadingProjects(false) } } useEffect(() => { loadPackages() loadProjects() }, []) const resetForm = () => { setSelectedProjectId("") setName("") setRegion("") setError(null) setIsEditing(false) setCurrentPackage(null) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!selectedProjectId) { setError("Please select a project first") return } if (!name.trim()) { setError("Package name is required") return } setIsSubmitting(true) setError(null) try { if (isEditing && currentPackage) { const data: PackageUpdate = { name: name.trim(), region: region.trim() || null, } await updatePackage(currentPackage.id, data) toast.success("Package updated successfully!") } else { const data: PackageCreate = { project_id: selectedProjectId, name: name.trim(), region: region.trim() || null, } await createPackage(data) toast.success("Package created successfully!") } // Refresh packages list await loadPackages() // Close modal and reset form immediately setIsModalOpen(false) resetForm() } catch (err) { setError(err instanceof Error ? err.message : `Failed to ${isEditing ? 'update' : 'create'} package`) } finally { setIsSubmitting(false) } } const handleEdit = (pkg: PackageType) => { setIsEditing(true) setCurrentPackage(pkg) setSelectedProjectId(pkg.project_id) setName(pkg.name || "") setRegion(pkg.region || "") setIsModalOpen(true) } const handleDelete = async (pkg: PackageType) => { if (!confirm(`Are you sure you want to delete package "${pkg.name}"?`)) return try { setIsLoading(true) await deletePackage(pkg.id) toast.success("Package deleted successfully!") await loadPackages() } catch (err) { setError("Failed to delete package") } finally { setIsLoading(false) } } const getProjectName = (projectId: string) => { return projects.find(p => p.id === projectId)?.name || projectId } const columns = [ { key: "name", header: "Package Name", render: (pkg: PackageType) => (
{pkg.name}
) }, { key: "project_id", header: "Project", render: (pkg: PackageType) => getProjectName(pkg.project_id) }, { key: "project_state", header: "Project State", render: (pkg: PackageType) => { const project = projects.find(p => p.id === pkg.project_id) if (!project?.state) return return (
{project.state.split(',').map((item, idx) => ( {item.trim()} ))}
) } }, { key: "region", header: "Region", }, ] return (
{/* Refined Header */}
{/* Error Message */} {error && !isModalOpen && (
!

{error}

)} {/* Data Table */}
{ setIsEditing(false); setIsModalOpen(true); }} onEdit={handleEdit} onDelete={handleDelete} addButtonText="Add New Package" isLoading={isLoading} />
{/* Footer */}

Sentient Geeks Pvt. Ltd.

{/* Modal Dialog */} { if (!open) { setIsModalOpen(false); resetForm(); } else { setIsModalOpen(true); } }}> e.preventDefault()} > {isEditing ? 'Edit Package' : 'Create New Package'} {isEditing ? 'Update disclosure details for your road infrastructure package' : 'Select a project and fill in the package details'} {/* Error Message in Modal */} {error && (
!

{error}

)}
{/* Step 1: Select Project */} {!isEditing && (
1

Select Project

)} {/* Step 2: Package Info */}
{!isEditing && (
2

Package Information

)}
setName(e.target.value)} placeholder="Package Name" className="h-10 text-sm" required />
setRegion(e.target.value)} placeholder="Region" className="h-10 text-sm focus-visible:ring-blue-500" />
{/* Submit Button */}
) }