diff --git a/src/components/Dashboard/common/TemplatePreview.jsx b/src/components/Dashboard/common/TemplatePreview.jsx index 71c5988..4423a29 100644 --- a/src/components/Dashboard/common/TemplatePreview.jsx +++ b/src/components/Dashboard/common/TemplatePreview.jsx @@ -1,6 +1,6 @@ import { useState, useContext, useEffect, useRef, useCallback } from 'react' import PropTypes from 'prop-types' -import { Flex, Button, Input } from 'antd' +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' @@ -14,22 +14,26 @@ const TemplatePreview = ({ isEditing, onTestObjectOpen, onPreviewMessage, - showTestObject = false + showTestObject = false, + showPreviewSwitch = true }) => { const iframeRef = useRef(null) - const { fetchTemplatePreview } = useContext(ApiServerContext) - const [previewContent, setPreviewContent] = useState('') + 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 updatePreviewContent = (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 - setPreviewContent(html) + setPreviewContentHTML(html) // Restore scroll position after iframe loads new content const handleLoad = () => { @@ -40,6 +44,23 @@ const TemplatePreview = ({ } } + 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) @@ -54,7 +75,7 @@ const TemplatePreview = ({ // Handle error through parent component onPreviewMessage(result.error, true) } else { - updatePreviewContent(result.html) + updatePreviewContentHTML(result.html) onPreviewMessage('No issues found.', false) } } @@ -66,9 +87,13 @@ const TemplatePreview = ({ // Move useEffect to component level and use state to track objectData changes useEffect(() => { if (documentTemplate?.content) { - reloadPreview(documentTemplate.content, objectData, previewScale) + if (previewType == 'HTML') { + reloadPreview(documentTemplate.content, objectData, previewScale) + } else { + reloadPreviewPDF(documentTemplate.content, objectData) + } } - }, [objectData, documentTemplate, previewScale, reloadPreview]) + }, [objectData, documentTemplate, previewScale, previewType]) return ( @@ -98,34 +123,51 @@ const TemplatePreview = ({ /> ) : null} + + {showPreviewSwitch == true ? ( +