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 ? (
) : (
)}
}
disabled={objectData?.global}
onClick={() => {
setTestObjectOpen(true)
}}
/>
}
onClick={() => {
setPreviewScale((prev) => prev + 0.05)
}}
/>
}
onClick={() => {
setPreviewScale((prev) => prev - 0.05)
}}
/>
)}
{collapseState.editor == true && (
}>
) : (
)
}
type={previewError ? 'error' : 'success'}
/>
)}
{
setTestObjectOpen(false)
}}
>
Close
}
>
>
)
}
TemplateEditor.propTypes = {
loading: PropTypes.bool,
objectData: PropTypes.object,
collapseState: PropTypes.object,
isEditing: PropTypes.bool,
style: PropTypes.object
}
export default TemplateEditor