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 && <>
From {transactionDetails?.transaction.createdBy.firstName + " " + transactionDetails?.transaction.createdBy.lastName}
Last Change on {(transactionDetails?.transaction?.lastModifiedAt)}
Created at {(transactionDetails?.transaction?.createdAt)}
{transactionDetails?.transaction.status}
{/* Buttons */} setSigningOrderModal({ ...signingOrderModal, open: true })}>
{recipient.name}
{recipient.email} | {recipient.type}
{recipient.hostEmail && (Host: {recipient.hostEmail}
)}{recipient.status}
on {recipient.completedAt}
)} {/* Optional signed document link */} {/* {recipient.viewLink && ( View signed location )} */}{`${transactionDetails?.transaction?.subject ? transactionDetails?.transaction?.subject : "Not Found"} `}
{`${transactionDetails?.transaction?.message ? transactionDetails?.transaction?.message : "Not Found"} `}
{docsD.name}
{/* 1 of {docsD?.pages?.length} */}
Signing Order