import { PDFDownloadLink } from "@react-pdf/renderer"; import { Link } from "@remix-run/react"; import { Check, Clock, Lock, X } from "lucide-react"; import { useEffect, useState } from "react"; import AgreementPDF, { type AgreementProps } from "~/components/document/aggrement-letter.client"; import { Button } from "~/components/ui/button"; import { useGetAgreementProject } from "~/services/projects/get-agreement-by-project-id"; import type { StatusData } from "~/types/constants/status-data"; import { formatImagePath } from "~/utils/prefix-file-path"; import SignContractDialog from "./modal/sign-contract"; type StatusType = "SUCCESS" | "FAILED" | "CURRENT" | "UPCOMING" | "PENDING"; export default function SecondSection({ id, data, handleClick, }: { id: string; data: StatusData[]; handleClick: () => void }) { const [contract, setContract] = useState(null); const { data: contractData } = useGetAgreementProject(data[0].id || ""); const steps = [ "Proposal Project Terkirim", "Peninjauan Proposal", "Proses Approval dari Komitee Koperasi", "Kontrak Perjanjian", "Proses Penggalangan Penyertaan Modal", ]; const getLatestStatusForStep = (step: string) => { const matchingStatuses = data.filter((status) => status.history === step); return matchingStatuses.sort( (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime(), )[0]; }; const getStepStatus = (index: number): StatusType => { const step = steps[index]; const latestStatus = getLatestStatusForStep(step); if (latestStatus) return latestStatus.status as unknown as StatusType; const lastCompletedIndex = steps.findIndex((step) => !getLatestStatusForStep(step)); if (index === lastCompletedIndex) return "CURRENT"; return "UPCOMING"; }; const getStatusColor = (status: StatusType) => { switch (status) { case "SUCCESS": return "bg-green-500 text-green-500"; case "FAILED": return "bg-red-500 text-red-500"; case "CURRENT": return "bg-blue-500 text-blue-500"; case "PENDING": return "bg-yellow-400 text-yellow-500"; default: return "bg-gray-300 text-gray-500"; } }; useEffect(() => { if (contractData) { setContract({ idProjek: contractData.idProjek, idUser: contractData.idUser, namaProyek: contractData.namaProyek, namaPetugas: contractData.namaPetugas, alamatPetugas: contractData.alamatPetugas, namaPemilikProyek: contractData.namaPemilikProyek, nik: contractData.nik, noHp: contractData.noHp, alamat: contractData.alamat, tandaTangan: formatImagePath(contractData.tandaTangan), signature: formatImagePath(contractData.signature), nominalDisetujui: contractData.nominalDisetujui, tanggal: contractData.createdAt, }); } }, [contractData]); return (

Progres Status Pengajuan Project

{steps.map((step, index) => { const stepData = getLatestStatusForStep(step); const status = getStepStatus(index); const statusColor = getStatusColor(status); return (
statusColor.split(" ")[0] }`} > {status === "SUCCESS" && } {status === "FAILED" && } {status === "CURRENT" && ( {index + 1} )} {status === "PENDING" && } {status === "UPCOMING" && }

statusColor.split(" ")[1] }`} > {step}

{stepData && ( <>

{new Date(stepData.created_at).toLocaleString()}

dangerouslySetInnerHTML={{ __html: stepData.keterangan, }} /> )} {step === "Kontrak Perjanjian" || steps.indexOf(step) > steps.indexOf("Kontrak Perjanjian") ? ( contract ? ( } fileName="agreement.pdf" > ) : ( ) ) : null} {status === "CURRENT" && step === "Peninjauan Proposal" ? ( ) : status === "FAILED" ? ( ) : (
)}
{index < steps.length - 1 && (
)}
); })}
); }