// GIFTTemplatePreview.tsx import React, { useEffect, useState } from 'react'; import Template, { ErrorTemplate, UnsupportedQuestionTypeError } from './templates'; import { parse } from 'gift-pegjs'; import './styles.css'; import { FormattedTextTemplate } from './templates/TextTypeTemplate'; interface GIFTTemplatePreviewProps { questions: string[]; hideAnswers?: boolean; } const GIFTTemplatePreview: React.FC = ({ questions, hideAnswers = false, }) => { const [error, setError] = useState(''); const [isPreviewReady, setIsPreviewReady] = useState(false); const [questionItems, setQuestionItems] = useState([]); // Array of HTML strings for each question useEffect(() => { try { const previewItems: string[] = []; questions.forEach((giftQuestion, index) => { try { const question = parse(giftQuestion); const html = Template(question[0], { preview: true, theme: 'light', }); previewItems.push(html); } catch (error) { let errorMsg: string; if (error instanceof UnsupportedQuestionTypeError) { errorMsg = ErrorTemplate(giftQuestion, `Erreur: ${error.message}`); } else if (error instanceof Error) { errorMsg = ErrorTemplate(giftQuestion, `Erreur GIFT: ${error.message}`); } else { errorMsg = ErrorTemplate(giftQuestion, 'Erreur inconnue'); } previewItems.push(`
${errorMsg}
`); } }); if (hideAnswers) { previewItems.forEach((item, index) => { const svgRegex = /]*>([\s\S]*?)<\/svg>/gi; const placeholderRegex = /(placeholder=")[^"]*(")/gi; previewItems[index] = item .replace(svgRegex, '') .replace(placeholderRegex, '$1$2'); }); } setQuestionItems(previewItems); setIsPreviewReady(true); } catch (error: unknown) { if (error instanceof Error) { setError(error.message); } else { setError('Une erreur est survenue durant le chargement de la prévisualisation.'); } } }, [questions, hideAnswers]); const PreviewComponent = () => ( {error ? (
{error}
) : isPreviewReady ? (
{questionItems.map((item, index) => (
))}
) : (
Chargement de la prévisualisation...
)} ); return ; }; export default GIFTTemplatePreview;