import React, { useState, useEffect, useRef } from "react"; import "../../styles/opensigndrive.css"; import axios from "axios"; import * as ContextMenu from "@radix-ui/react-context-menu"; import { useNavigate } from "react-router"; import Table from "react-bootstrap/Table"; import * as HoverCard from "@radix-ui/react-hover-card"; import ModalUi from "../../primitives/ModalUi"; import FolderModal from "../shared/fields/FolderModal"; import { useTranslation } from "react-i18next"; import { handleDownloadPdf, isMobile } from "../../constant/Utils"; import Parse from "parse"; function DriveBody(props) { const { t } = useTranslation(); const [rename, setRename] = useState(""); const [renameValue, setRenameValue] = useState(""); const inputRef = useRef(null); const [isOpenMoveModal, setIsOpenMoveModal] = useState(false); const [selectDoc, setSelectDoc] = useState(); const [isDeleteDoc, setIsDeleteDoc] = useState({}); const contextMenu = [ { type: "Download", icon: "fa-light fa-arrow-down" }, { type: "Rename", icon: "fa-light fa-font" }, { type: "Move", icon: "fa-light fa-file-export" }, { type: "Delete", icon: "fa-light fa-trash" } ]; const navigate = useNavigate(); //to focus input box on press rename to change doc name useEffect(() => { if (rename && inputRef.current) { setTimeout(() => { inputRef.current.focus(); }, 10); } }, [rename]); //function to handle folder component const handleOnclikFolder = (data) => { const folderData = { name: data.Name, objectId: data.objectId }; props.setFolderName((prev) => [...prev, folderData]); props.setIsLoading({ isLoad: true, message: t("loading-mssg") }); props.setDocId(data.objectId); props.setPdfData([]); props.setSkip(0); }; //function for change doc name and update doc name in _document class const handledRenameDoc = async (data) => { setRename(""); const trimmedValue = renameValue.trim(); if (trimmedValue.length > 0) { const updateName = { Name: renameValue }; const docId = data.objectId; const docData = props.pdfData; const updatedData = docData.map((item) => { if (item.objectId === docId) { // If the item's ID matches the target ID, update the name return { ...item, Name: renameValue }; } // If the item's ID doesn't match, keep it unchanged return item; }); props.setPdfData(updatedData); props.sortingData(null, null, updatedData); await axios .put( `${localStorage.getItem( "baseUrl" )}classes/contracts_Document/${docId}`, updateName, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), "X-Parse-Session-Token": localStorage.getItem("accesstoken") } } ) .then(() => { // const res = result.data; // console.log("res", res); }) .catch((err) => { console.log("Err ", err); props.setIsAlert({ isShow: true, alertMessage: t("something-went-wrong-mssg") }); }); } }; //function for navigate user to microapp-signature component const checkPdfStatus = async (data) => { const signerExist = data?.Signers; const isDecline = data?.IsDeclined; const isPlaceholder = data?.Placeholders; const signedUrl = data?.SignedUrl; const isSignYourself = data?.IsSignyourself; //checking if document has completed and request signature flow if (data?.IsCompleted && signerExist?.length > 0) { navigate(`/recipientSignPdf/${data.objectId}`); } //checking if document has completed and signyour-self flow else if ((!signerExist && !isPlaceholder) || isSignYourself) { navigate(`/signaturePdf/${data.objectId}`); } //checking if document has declined by someone else if (isDecline) { navigate(`/recipientSignPdf/${data.objectId}`); //checking draft type document } else if ( signerExist?.length > 0 && isPlaceholder?.length > 0 && !signedUrl ) { navigate(`/placeHolderSign/${data.objectId}`); } //Inprogress document else if (isPlaceholder?.length > 0 && signedUrl) { navigate(`/recipientSignPdf/${data.objectId}`); } //placeholder draft document else if ( (signerExist?.length > 0 && (!isPlaceholder || isPlaceholder?.length === 0)) || ((!signerExist || signerExist?.length === 0) && isPlaceholder?.length > 0) ) { navigate(`/placeHolderSign/${data.objectId}`); } }; const handleMenuItemClick = async (selectType, data, deleteType) => { switch (selectType) { case "Download": { await handleDownloadPdf([data]); break; } case "Rename": { setRenameValue(data.Name); setRename(data.objectId); break; } case "Delete": { setIsDeleteDoc({ status: true, deleteType }); setSelectDoc(data); break; } case "Move": { handleMoveDocument(data); break; } default: null; } }; //function for delete document const handleDeleteDocument = async (docData) => { setIsDeleteDoc({}); const docId = docData.objectId; const data = { IsArchive: true }; await axios .put( `${localStorage.getItem("baseUrl")}classes/contracts_Document/${docId}`, data, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), "X-Parse-Session-Token": localStorage.getItem("accesstoken") } } ) .then((result) => { const res = result.data; if (res) { const updatedData = props.pdfData.filter((x) => x.objectId !== docId); props.setPdfData(updatedData); } }) .catch((err) => { console.log("Err ", err); props.setIsAlert({ isShow: true, alertMessage: t("something-went-wrong-mssg") }); }); }; const handleMoveDocument = async (docData) => { setIsOpenMoveModal(true); setSelectDoc(docData); }; //function for move document from one folder to another folder const handleMoveFolder = async (selectFolderData) => { const selecFolderId = selectDoc?.Folder?.objectId; const moveFolderId = selectFolderData?.ObjectId; let updateDocId = selectDoc?.objectId; let updateData; const checkExist = moveFolderId ? selecFolderId === moveFolderId ? true : false : selecFolderId ? false : true; if (!checkExist) { if (moveFolderId) { updateData = { Folder: { __type: "Pointer", className: "contracts_Document", objectId: moveFolderId } }; } else { updateData = { Folder: { __op: "Delete" } }; } await axios .put( `${localStorage.getItem( "baseUrl" )}classes/contracts_Document/${updateDocId}`, updateData, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), "X-Parse-Session-Token": localStorage.getItem("accesstoken") } } ) .then((Listdata) => { // console.log("Listdata ", Listdata); const res = Listdata.data; if (res) { const updatedData = props.pdfData.filter( (x) => x.objectId !== updateDocId ); props.setPdfData(updatedData); } }) .catch((err) => { console.log("err", err); }); setIsOpenMoveModal(false); } else { alert(t("folder-already-exist!")); setIsOpenMoveModal(false); } }; const handleEnterPress = (e, data) => { if (e.key === "Enter") { handledRenameDoc(data); } }; const checkFolderEmpty = async (docData) => { let isEmptyFolder = true; const query = new Parse.Query("contracts_Document"); query.equalTo("Folder", { __type: "Pointer", className: "contracts_Document", objectId: docData.objectId }); query.notEqualTo("IsArchive", true); const res = await query.find(); const jsonRes = JSON.parse(JSON.stringify(res)); if (jsonRes && jsonRes.length > 0) { isEmptyFolder = false; return isEmptyFolder; } else { return isEmptyFolder; } }; const handleDeleteFolder = async (docData) => { setIsDeleteDoc({}); const isEmptyFolder = await checkFolderEmpty(docData); if (isEmptyFolder) { const docId = docData?.objectId; try { const updateQuery = new Parse.Query("contracts_Document"); const updateObj = await updateQuery.get(docId); updateObj.set("IsArchive", true); const res = await updateObj.save(); if (res) { const updatedData = props.pdfData.filter((x) => x.objectId !== docId); props.setPdfData(updatedData); } } catch (err) { console.log("Err ", err); props.setIsAlert({ isShow: true, alertMessage: t("something-went-wrong-mssg") }); } } else { alert(t("delete-folder-alert-1")); } }; //component to handle type of document and render according to type const handleFolderData = (data, ind, listType) => { let createddate, status, isDecline, signerExist, isComplete; if (data.Type !== "Folder") { const expireDate = data.ExpiryDate && data.ExpiryDate.iso; const createdDate = data.createdAt && data.createdAt; createddate = new Date(createdDate).toLocaleDateString(); isComplete = data.IsCompleted && data.IsCompleted ? true : false; isDecline = data.IsDeclined && data.IsDeclined; signerExist = data.Signers && data.Signers; const signedUrl = data.SignedUrl; const expireUpdateDate = new Date(expireDate).getTime(); const currDate = new Date().getTime(); let isExpire = false; if (currDate > expireUpdateDate) { isExpire = true; } if (isComplete) { status = "Completed"; } else if (isDecline) { status = "Declined"; } else if (!signedUrl) { status = "Draft"; } else if (isExpire) { status = "Expired"; } else { status = "In Progress"; } } const signersName = () => { const getSignersName = signerExist.map((data) => data.Name); const signerName = getSignersName.join(", "); return ( {signerName} ); }; return listType === "table" ? ( data.Type === "Folder" ? ( handleOnclikFolder(data)}> {data.Name} _ Folder _ _ ) : ( checkPdfStatus(data)}> {data.Name} {createddate} Pdf {t(`drive-document-status.${status}`)} { e.stopPropagation(); handleMenuItemClick("Download", data); }} className="fa-light fa-download mr-[8px] op-text-primary cursor-pointer" aria-hidden="true" > ) ) : listType === "list" && data.Type === "Folder" ? (
{/* folder */}
{ if (!rename) { handleOnclikFolder(data); } }} className="cursor-pointer" > {rename === data.objectId ? ( { const input = inputRef.current; if (input) { input.select(); } }} autoFocus={true} type="text" onBlur={() => handledRenameDoc(data)} onKeyDown={(e) => handleEnterPress(e, data)} ref={inputRef} defaultValue={renameValue} onChange={(e) => setRenameValue(e.target.value)} className="op-input op-input-bordered op-input-xs w-[100px] focus:outline-none hover:border-base-content text-[10px]" /> ) : ( {data.Name} )}
handleMenuItemClick("Rename", data)} className="ContextMenuItem" > Rename handleMenuItemClick("Delete", data, data.Type)} className="ContextMenuItem" > Delete
) : (
{/* pdf */}
{ if (!rename) { checkPdfStatus(data); } }} className="cursor-pointer" > {rename === data.objectId ? ( { const input = inputRef.current; if (input) { input.select(); } }} onBlur={() => handledRenameDoc(data)} onKeyDown={(e) => handleEnterPress(e, data, data.Type)} ref={inputRef} defaultValue={renameValue} onChange={(e) => setRenameValue(e.target.value)} className="op-input op-input-bordered op-input-xs w-[100px] focus:outline-none hover:border-base-content text-[10px]" /> ) : ( {data.Name} )}
{status === "Completed" ? (
) : status === "Declined" ? (
) : status === "Expired" ? (
) : status === "Draft" ? (
) : ( status === "In Progress" && (
) )}
{contextMenu.map((menu, ind) => { return ( handleMenuItemClick(menu.type, data)} className="ContextMenuItem" > {t(`context-menu.${menu.type}`)} ); })}
{t("report-heading.Title")}:{" "} {data.Name}
{t("report-heading.Status")}:{" "} {t(`drive-document-status.${status}`)}
{t("report-heading.created-date")}:{" "} {createddate}
{signerExist && ( <> {t("report-heading.Signers")}:{" "} {signersName()} )}
); }; //component to handle type of document and render according to type return ( <> {props.isList ? (
{props.pdfData.map((data, ind) => { return ( {handleFolderData(data, ind, "table")} ); })}
{t("report-heading.Name")} {t("report-heading.created-date")} {t("report-heading.Type")} {t("report-heading.Status")} {t("action")}
) : (
{props.pdfData.map((data, ind) => { return
{handleFolderData(data, ind, "list")}
; })}
)} {isOpenMoveModal && ( )} setIsDeleteDoc({})} >
{isDeleteDoc.deleteType ? (

{t("delete-folder-alert")}

) : (

{t("delete-document-alert")}

)}
); } export default DriveBody;