import { useState, useContext, useEffect, useRef } from 'react' import PropTypes from 'prop-types' import { Flex, Alert, Card, Spin, Splitter, Button, Modal, Input } from 'antd' import { LoadingOutlined } from '@ant-design/icons' import PlusIcon from '../../Icons/PlusIcon.jsx' import MinusIcon from '../../Icons/MinusIcon.jsx' import ExclamationOctagonIcon from '../../Icons/ExclamationOctagonIcon.jsx' import CheckCircleIcon from '../../Icons/CheckCircleIcon.jsx' import ObjectProperty from '../common/ObjectProperty.jsx' import { ApiServerContext } from '../context/ApiServerContext.jsx' import InfoCircleIcon from '../../Icons/InfoCircleIcon.jsx' const TemplateEditor = ({ objectData, loading, collapseState, isEditing, style }) => { const iframeRef = useRef(null) const { fetchTemplatePreview } = useContext(ApiServerContext) const [testObjectOpen, setTestObjectOpen] = useState(false) const [previewMessage, setPreviewMessage] = useState('No issues found.') const [previewError, setPreviewError] = useState(false) const [previewContent, setPreviewContent] = useState('') const [reloadLoading, setReloadLoading] = useState(false) const [previewScale, setPreviewScale] = useState(1) const updatePreviewContent = (html) => { if (iframeRef.current) { // Save current scroll position const scrollY = iframeRef.current.contentWindow.scrollY const scrollX = iframeRef.current.contentWindow.scrollX // Update srcDoc setPreviewContent(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) } } function reloadPreview(content, testObject = {}, scale = 1) { fetchTemplatePreview( objectData._id, content, testObject, scale, (result) => { setReloadLoading(false) if (result?.error) { setPreviewError(true) setPreviewMessage(result.error) } else { setPreviewError(false) updatePreviewContent(result.html) setPreviewMessage('No issues found.') } } ) } // Move useEffect to component level and use state to track objectData changes useEffect(() => { if (objectData) { console.log('PreviewScale', previewScale) reloadPreview(objectData.content, objectData.testObject, previewScale) } }, [objectData, previewScale]) return ( <> {collapseState.preview == true && ( } > {objectData?.objectType ? ( ) : (
)}