import { useEffect, useRef, useState } from 'react'; import { useLocation, useNavigate, useParams } from 'react-router'; import { useMutation } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { adminEmailTemplatesApi } from '../api/adminEmailTemplates'; import { BackIcon } from '../components/admin'; interface PreviewState { subject: string; body_html: string; } export default function AdminEmailTemplatePreview() { const { t } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); const { type, lang } = useParams<{ type: string; lang: string }>(); const iframeRef = useRef(null); const [previewHtml, setPreviewHtml] = useState(''); // Get data from navigation state const state = location.state as PreviewState | null; // Preview mutation const { mutate: loadPreview, isPending: previewPending, isError: previewError, } = useMutation({ mutationFn: () => { if (!type || !lang || !state) { throw new Error('Missing required data'); } return adminEmailTemplatesApi.previewTemplate(type, { language: lang, subject: state.subject, body_html: state.body_html, }); }, onSuccess: (data) => { setPreviewHtml(data.body_html); }, }); // Load preview on mount useEffect(() => { if (!type || !lang || !state) { navigate('/admin/email-templates'); return; } loadPreview(); }, [type, lang, state, navigate, loadPreview]); // Write preview HTML into iframe useEffect(() => { if (previewHtml && iframeRef.current) { const doc = iframeRef.current.contentDocument; if (doc) { doc.open(); doc.write(previewHtml); doc.close(); } } }, [previewHtml]); if (!type || !lang || !state) { return null; } return (
{/* Header */}

{t('admin.emailTemplates.preview')}

{type} / {lang.toUpperCase()}

{/* Preview content */}
{previewPending ? (
) : previewError ? (

{t('common.error')}

) : (