"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { useParams } from "next/navigation"; import { Card, CardHeader, CardContent } from "@/components/ui/Card"; import Button from "@/components/ui/Button"; import Badge from "@/components/ui/Badge"; import PageContainer from "@/components/ui/PageContainer"; import PageHeader from "@/components/ui/PageHeader"; import { LoadingState } from "@/components/ui/States"; import { formatDate } from "@/lib/utils"; import FileUploadModal from "@/components/FileUploadModal"; import FileAttachmentsList from "@/components/FileAttachmentsList"; import { useTranslation } from "@/lib/i18n"; export default function ContractDetailsPage() { const params = useParams(); const contractId = params.id; const [contract, setContract] = useState(null); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [showUploadModal, setShowUploadModal] = useState(false); const [attachments, setAttachments] = useState([]); const { t } = useTranslation(); useEffect(() => { async function fetchContractDetails() { setLoading(true); try { // Fetch contract details const contractRes = await fetch(`/api/contracts/${contractId}`); if (contractRes.ok) { const contractData = await contractRes.json(); setContract(contractData); } // Fetch projects for this contract const projectsRes = await fetch( `/api/projects?contract_id=${contractId}` ); if (projectsRes.ok) { const projectsData = await projectsRes.json(); // Sort projects by project_id in descending order (newest first) const sortedProjects = projectsData.sort( (a, b) => b.project_id - a.project_id ); setProjects(sortedProjects); } } catch (error) { console.error("Error fetching contract details:", error); } finally { setLoading(false); } } if (contractId) { fetchContractDetails(); } }, [contractId]); const handleFileUploaded = (newFile) => { setAttachments(prev => [newFile, ...prev]); }; const handleFilesChange = (files) => { setAttachments(files); }; if (loading) { return ( ); } if (!contract) { return (

{t('contracts.contractNotFound')}

); } return ( } /> {/* Contract Details */}

{t('contracts.contractInformation')}

{t('contracts.contractNumber')}

{contract.contract_number}

{contract.contract_name && (
{t('contracts.contractName')}

{contract.contract_name}

)} {contract.customer_contract_number && (
{t('contracts.customerContractNumber')}

{contract.customer_contract_number}

)} {contract.customer && (
{t('contracts.customer')}

{contract.customer}

)} {contract.investor && (
{t('contracts.investor')}

{contract.investor}

)}{" "} {contract.date_signed && (
{t('contracts.dateSigned')}

{formatDate(contract.date_signed)}

)} {contract.finish_date && (
{t('contracts.finishDate')}

{formatDate(contract.finish_date)}

)}
{/* Contract Summary Sidebar */}

{t('contracts.summary')}

{t('contracts.projectsCount')} {projects.length} {t('contracts.projects')}
{contract.finish_date && (
{t('contracts.contractStatus')} new Date() ? "success" : "warning" } size="md" > {new Date(contract.finish_date) > new Date() ? t('contracts.active') : t('contracts.expired')}
)}
{/* Contract Documents */}

{t('contracts.contractDocuments')} ({attachments.length})

{/* Associated Projects */}

{t('contracts.associatedProjects')} ({projects.length})

{projects.length === 0 ? (

{t('contracts.noProjectsYet')}

{t('contracts.getStartedMessage')}

) : (
{projects.map((project) => (

{project.project_name}

{project.project_number}
{project.address && (
{project.address}
)} {project.finish_date && (
{" "} {formatDate(project.finish_date)}
)}
{project.project_status === "registered" ? t('projectStatus.registered') : project.project_status === "in_progress_design" ? t('projectStatus.in_progress_design') : project.project_status === "in_progress_construction" ? t('projectStatus.in_progress_construction') : project.project_status === "fulfilled" ? t('projectStatus.fulfilled') : t('projectStatus.unknown')}
))}
)}
{/* File Upload Modal */} setShowUploadModal(false)} entityType="contract" entityId={contractId} onFileUploaded={handleFileUploaded} />
); }