import { AiFillSignature } from 'react-icons/ai'; import { Link, useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { LuGitGraph } from 'react-icons/lu'; import AccountNav from '../accounts/AccountNav'; import { useEffect, useState } from 'react'; import api from '../../config/api'; import SigningOrderDiagram from '../../SigningOrderDiagram '; import { IoCloseOutline } from 'react-icons/io5'; import { MdEditDocument } from "react-icons/md"; import { useSelector } from 'react-redux'; import { RootState } from '../../store/store'; import { SignTypeEnum } from '../../utlity/types'; import AuditModal from './AuditModal'; import { FaFile } from 'react-icons/fa6'; import { IoMdDownload } from 'react-icons/io'; import downloadDocumentUtils from '../../utlity/downloadDocumentsUtils'; import signSessionRedirect from '../../utlity/signSessionRedirect'; // Sample recipient data — you can replace this with actual API data later const recipients = [ { id: 1, name: "Shanu.R", email: "shanu.r@example.com", signedAt: "5/1/2025 | 04:24:35 pm", status: "Signed", viewLink: "#" }, { id: 2, name: "Amit B", email: "amit.b@example.com", signedAt: "5/1/2025 | 04:24:35 pm", status: "Signed", viewLink: "#" } ]; const TransactionView = () => { const { accountId, transactionId } = useParams<{ accountId: string, transactionId: string }>(); const navigate = useNavigate(); if (!accountId || !transactionId) { window.location.href = "/"; return null; } const [transactionDetails, setTransactionDetails] = useState(null); const [signingOrderModal, setSigningOrderModal] = useState({ open: false }); const user = useSelector((state: RootState) => state.user) const location = useLocation(); const [isModalOpen, setIsModalOpen] = useState(false); const [documentsData, setDocumentsData] = useState([]) useEffect(() => { // update whenever location changes setIsModalOpen(location.search.includes("auditStatus")); }, [location]); const handleOpenAuditModal = () => { const { pathname, search } = location; let newSearch = search ? search.includes("auditStatus") ? search : `${search}&auditStatus` : "?auditStatus"; window.history.pushState({}, "", pathname + newSearch); setIsModalOpen(true); // update state immediately }; const closeModal = () => { let search = location.search .replace(/[?&]auditStatus\b/, "") .replace(/^&/, "?") .replace(/\?$/, ""); window.history.pushState({}, "", location.pathname + search); setIsModalOpen(false); // update state immediately }; const fetchData = async () => { try { const [res1, res2] = await Promise.all([api.get(`/api/accounts/${accountId}/transactions/${transactionId}`), api.get(`/api/accounts/${accountId}/transactions/${transactionId}/recipients`)]) setTransactionDetails({ transaction: res1.data, recipients: res2.data }); } catch (error) { console.error("Error Gettign Transaction and its Recipient: ", error.message) } } console.log(transactionDetails, "transactionDetails") const fetchDocuments = async () => { try { const res = await api.get(`/api/accounts/${accountId}/transactions/${transactionId}/documents`) if (res?.status === 200) { let resDoc = res?.data setDocumentsData(resDoc) } } catch (error) { console.log(error) } } useEffect(() => { fetchData() fetchDocuments() }, [accountId, transactionId]) const handleNavigateToSign = (id: number) => { signSessionRedirect(accountId, transactionId, id+"" as string) } const getStatusBadge = (status: string) => { const statusClasses = { 'SENT': 'bg-blue-100 text-blue-800', 'COMPLETED': 'bg-green-100 text-green-800', 'FAILED': 'bg-red-100 text-red-800', 'PENDING': 'bg-yellow-100 text-yellow-800', 'VIEWED': 'bg-purple-100 text-purple-800', 'REJECTED': 'bg-red-100 text-red-800' }; return statusClasses[status as keyof typeof statusClasses] || 'bg-gray-100 text-gray-800'; }; return ( <> {transactionDetails && <>
{/* Header */}

Complete with Sign Made Easy: {transactionDetails?.transaction?.subject ?? "Untitled"}

{/* new Date(transactionDetails?.transaction?.lastModifiedAt * 1000) */}

From {transactionDetails?.transaction.createdBy.firstName + " " + transactionDetails?.transaction.createdBy.lastName}

Last Change on {(transactionDetails?.transaction?.lastModifiedAt)}

Created at {(transactionDetails?.transaction?.createdAt)}

{transactionDetails?.transaction.status}

{/* Buttons */}
{/* */} {transactionDetails.transaction.status === "CREATED" && Edit }

{/* Recipients Section */} {transactionDetails.recipients.length > 0 &&

Signers

setSigningOrderModal({ ...signingOrderModal, open: true })}> Signing Graph

{/* Recipients List */} {transactionDetails.recipients.map((recipient, index) => (
{/* Left section: recipient info */}

{recipient.name}

{recipient.email} | {recipient.type}

{recipient.hostEmail && (

Host: {recipient.hostEmail}

)}
{/* Right section: status and actions */}

{recipient.status}

{transactionDetails.transaction.status === "SENT" && recipient.email === user.email && recipient.status !== "COMPLETED" && ( )}
{recipient.status !== "PENDING" && (

on {recipient.completedAt}

)} {/* Optional signed document link */} {/* {recipient.viewLink && ( View signed location )} */}

))}
} {transactionDetails?.transaction?.subject !== "" &&

Subject

{`${transactionDetails?.transaction?.subject ? transactionDetails?.transaction?.subject : "Not Found"} `}

} {transactionDetails?.transaction?.message !== "" &&

Message

{`${transactionDetails?.transaction?.message ? transactionDetails?.transaction?.message : "Not Found"} `}

}
{documentsData.map((docsD, index) => (

{docsD.name}

{docsD?.thumbnail ? ( ) : ( )}

{/* 1 of {docsD?.pages?.length} */} downloadDocumentUtils(accountId, transactionId, docsD.id)} size={18} />

))}
{signingOrderModal.open &&

Signing Order

setSigningOrderModal({ ...signingOrderModal, open: false })} className="text-xl cursor-pointer hover:text-gray-200 transition-all">
} {isModalOpen && } } ); }; export default TransactionView;