import { useState, useContext, useEffect, useRef, useCallback } from 'react' import PropTypes from 'prop-types' import { Flex, Button, Input, Select } from 'antd' import PlusIcon from '../../Icons/PlusIcon.jsx' import MinusIcon from '../../Icons/MinusIcon.jsx' import InfoCircleIcon from '../../Icons/InfoCircleIcon.jsx' import ObjectProperty from '../common/ObjectProperty.jsx' import { ApiServerContext } from '../context/ApiServerContext.jsx' const TemplatePreview = ({ objectData, documentTemplate, loading, isEditing, onTestObjectOpen, onPreviewMessage, showTestObject = false, showPreviewSwitch = true }) => { const iframeRef = useRef(null) const { fetchTemplatePreview, fetchTemplatePDF } = useContext(ApiServerContext) const [previewContentHTML, setPreviewContentHTML] = useState('') const [pdfBlob, setPDFBlob] = useState(null) const [reloadLoading, setReloadLoading] = useState(false) const [previewScale, setPreviewScale] = useState(1) const [previewType, setPreviewType] = useState('HTML') const updatePreviewContentHTML = (html) => { if (iframeRef.current) { // Save current scroll position const scrollY = iframeRef.current.contentWindow.scrollY const scrollX = iframeRef.current.contentWindow.scrollX // Update srcDoc setPreviewContentHTML(html) // Restore scroll position after iframe loads new content const handleLoad = () => { iframeRef.current.contentWindow.scrollTo(scrollX, scrollY) iframeRef.current.removeEventListener('load', handleLoad) } iframeRef.current.addEventListener('load', handleLoad) } } const reloadPreviewPDF = (content, testObject = {}) => { setReloadLoading(true) fetchTemplatePDF(documentTemplate._id, content, testObject, (result) => { setReloadLoading(false) if (result?.error) { // Handle error through parent component onPreviewMessage(result.error, true) } else { const pdfBlob = new Blob([result.pdf], { type: 'application/pdf' }) const pdfUrl = URL.createObjectURL(pdfBlob) setPDFBlob(pdfUrl) onPreviewMessage('No issues found.', false) } }) } const reloadPreview = useCallback( (content, testObject = {}, scale = 1) => { setReloadLoading(true) fetchTemplatePreview( documentTemplate._id, content, testObject, scale, (result) => { setReloadLoading(false) if (result?.error) { // Handle error through parent component onPreviewMessage(result.error, true) } else { updatePreviewContentHTML(result.html) onPreviewMessage('No issues found.', false) } } ) }, [fetchTemplatePreview, objectData?._id, onPreviewMessage] ) // Move useEffect to component level and use state to track objectData changes useEffect(() => { if (documentTemplate?.content) { if (previewType == 'HTML') { reloadPreview(documentTemplate.content, objectData, previewScale) } else { reloadPreviewPDF(documentTemplate.content, objectData) } } }, [objectData, documentTemplate, previewScale, previewType]) return ( {showTestObject == true ? ( <> {documentTemplate?.objectType ? ( ) : (
)} {showPreviewSwitch == true ? (