EvalueTonSavoir/client/src/components/GiftTemplate/GIFTTemplatePreview.tsx

89 lines
3.4 KiB
TypeScript
Raw Normal View History

2024-03-29 20:08:34 -04:00
// GIFTTemplatePreview.tsx
import React, { useEffect, useState } from 'react';
import Template, { ErrorTemplate, UnsupportedQuestionTypeError } from './templates';
2024-03-29 20:08:34 -04:00
import { parse } from 'gift-pegjs';
import './styles.css';
import { FormattedTextTemplate } from './templates/TextTypeTemplate';
2024-03-29 20:08:34 -04:00
interface GIFTTemplatePreviewProps {
questions: string[];
hideAnswers?: boolean;
}
const GIFTTemplatePreview: React.FC<GIFTTemplatePreviewProps> = ({
questions,
2025-03-26 14:52:09 -04:00
hideAnswers = false,
2024-03-29 20:08:34 -04:00
}) => {
const [error, setError] = useState('');
const [isPreviewReady, setIsPreviewReady] = useState(false);
2025-03-26 14:52:09 -04:00
const [questionItems, setQuestionItems] = useState<string[]>([]); // Array of HTML strings for each question
2024-03-29 20:08:34 -04:00
useEffect(() => {
try {
2025-03-26 14:52:09 -04:00
const previewItems: string[] = [];
questions.forEach((giftQuestion, index) => {
2024-03-29 20:08:34 -04:00
try {
const question = parse(giftQuestion);
2025-03-26 14:52:09 -04:00
const html = Template(question[0], {
2024-03-29 20:08:34 -04:00
preview: true,
2025-03-26 14:52:09 -04:00
theme: 'light',
2024-03-29 20:08:34 -04:00
});
2025-03-26 14:52:09 -04:00
previewItems.push(html);
2024-03-29 20:08:34 -04:00
} catch (error) {
let errorMsg: string;
if (error instanceof UnsupportedQuestionTypeError) {
errorMsg = ErrorTemplate(giftQuestion, `Erreur: ${error.message}`);
} else if (error instanceof Error) {
2025-03-26 14:52:09 -04:00
errorMsg = ErrorTemplate(giftQuestion, `Erreur GIFT: ${error.message}`);
2024-03-29 20:08:34 -04:00
} else {
2025-03-26 14:52:09 -04:00
errorMsg = ErrorTemplate(giftQuestion, 'Erreur inconnue');
2024-03-29 20:08:34 -04:00
}
2025-03-26 14:52:09 -04:00
previewItems.push(`<div label="error-message">${errorMsg}</div>`);
2024-03-29 20:08:34 -04:00
}
});
if (hideAnswers) {
2025-03-26 14:52:09 -04:00
previewItems.forEach((item, index) => {
const svgRegex = /<svg[^>]*>([\s\S]*?)<\/svg>/gi;
const placeholderRegex = /(placeholder=")[^"]*(")/gi;
previewItems[index] = item
.replace(svgRegex, '')
.replace(placeholderRegex, '$1$2');
});
2024-03-29 20:08:34 -04:00
}
2025-03-26 14:52:09 -04:00
setQuestionItems(previewItems);
2024-03-29 20:08:34 -04:00
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.');
}
}
2025-03-26 14:52:09 -04:00
}, [questions, hideAnswers]);
2024-03-29 20:08:34 -04:00
const PreviewComponent = () => (
<React.Fragment>
{error ? (
<div className="error">{error}</div>
) : isPreviewReady ? (
<div data-testid="preview-container">
2025-03-26 14:52:09 -04:00
{questionItems.map((item, index) => (
<div
key={index}
className="question-item"
dangerouslySetInnerHTML={{ __html: FormattedTextTemplate({ format: 'html', text: item }) }}
/>
))}
2024-03-29 20:08:34 -04:00
</div>
) : (
<div className="loading">Chargement de la prévisualisation...</div>
)}
</React.Fragment>
);
return <PreviewComponent />;
};
2025-03-26 14:52:09 -04:00
export default GIFTTemplatePreview;