import React, { useEffect, useRef, useState } from 'react'; import { Button, Grid, InputLabel, TextField } from '@mui/material'; import { GeneralConfirmWindow, notifySaveSuccess } from "../../../utils/CommonFunction"; import axios from 'axios'; import {apiPath, adobeAPIKey} from "../../../auth/utils"; import { GET_PDF_TEMPLATE_PATH, GET_PDF_PATH, POST_PDF_PATH } from "../../../utils/ApiPathConst"; import {LIONER_BUTTON_THEME} from "../../../themes/colorConst"; import {ThemeProvider} from "@emotion/react"; import {useNavigate} from "react-router-dom"; import {useForm} from "react-hook-form"; import {useLocation, useParams} from "react-router-dom"; import { base64ToBinary } from "../../../utils/CommonFunction"; import { CollectionsBookmarkRounded } from '../../../../node_modules/@mui/icons-material/index'; import LoadingComponent from "../../extra-pages/LoadingComponent"; import { fill } from 'lodash'; function PDF() { const viewerRef = useRef(null); // Ref for the DOM element where PDF will render const [pdfLoaded, setPdfLoaded] = useState(false); const [viewerLoaded, setViewerLoaded] = useState(false); const [isSaving, setIsSaving] = useState(false); const [viewInstance,setViewInstance] = useState(); const [adobeDCView,setAdobeDCView] = useState(); const [pdfUrl, setPdfUrl] = useState(); const [record, setRecord] = useState(); const [formName, setFormName] = useState(); const navigate = useNavigate() const params = useParams(); const location = useLocation(); const queryParams = new URLSearchParams(location.search); const refId = queryParams.get("refId"); const loadPdfForm = async (id, templateId = 0, clientId = 0) => { if (!pdfLoaded) { if (id > 0) { // axios.get(`${apiPath}${GET_PDF_TEMPLATE_PATH}`, { axios.get(`${apiPath}${GET_PDF_PATH}/${id}`, { // responseType: 'arraybuffer', // Essential for binary data }) .then((response) => { if (response.status === 200) { const res = response.data; setRecord({ // WIP - allow to update all record id : res.id, clientId: res.clientId, templateId: res.templateId, }) setFormName(res.filename); //Convert Base64 to binary data handlePdfUrl(base64ToBinary(res.blobValue)); setPdfLoaded(true); } }) .catch(error => { console.log(error); return false; }); } else { axios.get(`${apiPath}${GET_PDF_TEMPLATE_PATH}`, { // responseType: 'arraybuffer', // Essential for binary data params: { templateId: templateId, clientId: clientId, }, }) .then((response) => { if (response.status === 200) { const res = response.data; setFormName(res.filename); //Convert Base64 to binary data handlePdfUrl(base64ToBinary(res.blobValue)); setPdfLoaded(true); } }) .catch(error => { console.log(error); return false; }); } } }; const handlePdfUrl = (pdfBytes) => { const pdfBlob = new Blob([pdfBytes], { type: 'application/pdf' }); // const pdfFile = new File([pdfBlob], 'document.pdf', { type: 'application/pdf' }); console.log(pdfBlob); const pdfUrl = URL.createObjectURL(pdfBlob); setPdfUrl(pdfUrl); } const loadPdfViewer = async () => { if (pdfLoaded && viewerRef.current && !viewerLoaded && !adobeDCView) { try { loadAdobeSDK(); } catch (error) { console.error('Error loading PDF:', error); } } }; const loadAdobeSDK = async() => { // const token = localStorage.getItem('accessToken'); if (window.AdobeDC) { const DCViewer = (new window.AdobeDC.View({ clientId: `${adobeAPIKey}`, divId: 'adobe-dc-view', })); setAdobeDCView(DCViewer); await DCViewer.previewFile( { content: { location: { url: pdfUrl, // headers: [{ key: 'Authorization', value: `Bearer ${token}` }], }, }, metaData: { fileName: formName }, }, { embedMode: 'FULL_WINDOW', showAnnotationTools: true, enableFormFilling: true, } ).catch(error => { console.error('Preview error:', error); setError('Failed to load PDF: ' + error.message); }).then(instance => { URL.revokeObjectURL(pdfUrl); setViewInstance(instance); console.log('Instance: ', instance); setViewerLoaded(true); }); DCViewer.registerCallback( window.AdobeDC.View.Enum.CallbackType.SAVE_API, handleSavePdf, { autoSaveFrequency: 0, enableFormFilling: true } ); console.log("viewer: ", DCViewer); } else { console.error('AdobeDC not available'); setError('Adobe SDK not loaded'); } }; useEffect(() => { if (params.id !== null) { const pdfData = (params.id).split("T"); if (pdfData[0] > 0) { // Existing Record loadPdfForm(pdfData[0]); } else { // New Record const clientId = pdfData[0] * -1; const templateId = pdfData[1] * 1; setRecord({ id: -1, clientId: clientId, //If PDF ID is negative, convert it to client ID templateId: templateId}); loadPdfForm(-1, templateId, clientId); // Load new Template } } }, [params.id]); useEffect(() => { // Update Save function callback after record is updated console.log("Record Updated: ",record); if (record && adobeDCView) { adobeDCView.registerCallback( window.AdobeDC.View.Enum.CallbackType.SAVE_API, handleSavePdf, { autoSaveFrequency: 0, enableFormFilling: true } ); } }, [record]); useEffect(() => { loadPdfViewer(); }, [viewerRef.current, pdfLoaded]); const handleSavePdf = async (metaData, content, options) => { try { const filledPdfBlob = new Blob([content], { type: 'application/pdf' }); // Create FormData to send the file to Spring Boot const formData = new FormData(); formData.append('file', filledPdfBlob, 'filled_form.pdf'); formData.append('record', JSON.stringify(record)); setIsSaving(true); // Send the filled PDF to your Spring Boot backend's save endpoint await axios.post(`${apiPath}${POST_PDF_PATH}`, formData, { headers: { 'Content-Type': 'multipart/form-data' // Important for file uploads }, }) .then(response => { setIsSaving(false); console.log('PDF saved on server:', response.data); setRecord({ id: response.data.data.id, clientId: record.clientId, templateId: record.templateId }); notifySaveSuccess()}); return { code: window.AdobeDC.View.Enum.ApiResponseCode.SUCCESS, data: { metaData } // Return metaData to prevent t.data undefined }; } catch (error) { console.error('Error saving PDF:', error); alert('Failed to save PDF.'); return { code: window.AdobeDC.View.Enum.ApiResponseCode.FAIL }; } }; const handlePrintPdf = () => { if (viewInstance.current) { // Trigger the SDK's built-in print functionality viewInstance.current.print(); } }; // Confirmation Window // const [isWindowOpen, setIsWindowOpen] = useState(false); const handleClose = () => { setIsWindowOpen(false); }; const handleBackClick = () => { setIsWindowOpen(true); }; const handleBack = async () => { navigate(`/pdf/${record.clientId}`); }; return (
{/* This is your 'pdfForm' page */}
{/* */} {/* Remarks */} {/* {pdfLoaded ? (
) : (

Loading PDF viewer...

)} */}
{!pdfLoaded && ()} ); } export default PDF;