// EditorQuiz.tsx import React, { useState, useEffect, useRef, CSSProperties } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { FolderType } from '../../../Types/FolderType'; import Editor from 'src/components/Editor/Editor'; import GiftCheatSheet from 'src/components/GIFTCheatSheet/GiftCheatSheet'; import GIFTTemplatePreview from 'src/components/GiftTemplate/GIFTTemplatePreview'; import { QuizType } from '../../../Types/QuizType'; import './editorQuiz.css'; import { Button, TextField, NativeSelect, Divider, Dialog, DialogTitle, DialogActions, DialogContent, Snackbar } from '@mui/material'; import ReturnButton from 'src/components/ReturnButton/ReturnButton'; import ApiService from '../../../services/ApiService'; import { escapeForGIFT } from '../../../utils/giftUtils'; import { Upload } from '@mui/icons-material'; interface EditQuizParams { id: string; [key: string]: string | undefined; } const QuizForm: React.FC = () => { const [quizTitle, setQuizTitle] = useState(''); const [selectedFolder, setSelectedFolder] = useState(''); const [filteredValue, setFilteredValue] = useState([]); const { id } = useParams(); const [values, setValues] = useState([]); const [isNewQuiz, setNewQuiz] = useState(false); const [quiz, setQuiz] = useState(null); const navigate = useNavigate(); const [folders, setFolders] = useState([]); const [imageLinks, setImageLinks] = useState([]); const handleSelectFolder = (event: React.ChangeEvent) => { setSelectedFolder(event.target.value); }; const fileInputRef = useRef(null); const [dialogOpen, setDialogOpen] = useState(false); const [showScrollButton, setShowScrollButton] = useState(false); const [isImagesCollapsed, setIsImagesCollapsed] = useState(true); const [isCheatSheetCollapsed, setIsCheatSheetCollapsed] = useState(true); const [isUploadCollapsed, setIsUploadCollapsed] = useState(true); const [snackbarOpen, setSnackbarOpen] = useState(false); const [snackbarMessage, setSnackbarMessage] = useState(''); const scrollToTop = () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }; useEffect(() => { const handleScroll = () => { if (window.scrollY > 300) { setShowScrollButton(true); } else { setShowScrollButton(false); } }; window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); }; }, []); const scrollToImagesSection = (event: { preventDefault: () => void; }) => { event.preventDefault(); const section = document.getElementById('images-section'); if (section) { section.scrollIntoView({ behavior: 'smooth' }); } }; useEffect(() => { const fetchData = async () => { const userFolders = await ApiService.getUserFolders(); setFolders(userFolders as FolderType[]); }; fetchData(); }, []); useEffect(() => { const fetchData = async () => { try { if (!id || id === 'new') { setNewQuiz(true); return; } const quiz = await ApiService.getQuiz(id) as QuizType; if (!quiz) { window.alert(`Une erreur est survenue.\n Le quiz ${id} n'a pas été trouvé\nVeuillez réessayer plus tard`) console.error('Quiz not found for id:', id); navigate('/teacher/dashboard'); return; } setQuiz(quiz as QuizType); const { title, content, folderId } = quiz; setQuizTitle(title); setSelectedFolder(folderId); setFilteredValue(content); setValues(content); } catch (error) { window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`) console.error('Error fetching quiz:', error); navigate('/teacher/dashboard'); } }; fetchData(); }, [id]); const handleAddQuestion = () => { console.log("Adding question"); console.log("Current values:", values); // Log current state setValues([...values, '']); console.log("Updated values:", [...values, '']); // Log new state }; const handleUpdatePreview = (newValues: string[]) => { setValues(newValues); setFilteredValue(newValues.filter(value => value.trim() !== '')); }; const handleQuizTitleChange = (event: React.ChangeEvent) => { setQuizTitle(event.target.value); }; const handleQuizSave = async () => { try { if (quizTitle == '') { alert("Veuillez choisir un titre"); return; } if (selectedFolder == '') { alert("Veuillez choisir un dossier"); return; } if (isNewQuiz) { await ApiService.createQuiz(quizTitle, filteredValue, selectedFolder); } else { if (quiz) { await ApiService.updateQuiz(quiz._id, quizTitle, filteredValue); } } setSnackbarMessage('Quiz enregistré avec succès!'); setSnackbarOpen(true); } catch (error) { window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`) console.log(error) } }; // I do not know what this does but do not remove if (!isNewQuiz && !quiz) { return
Chargement...
; } const handleSnackbarClose = () => { setSnackbarOpen(false); }; const handleSaveImage = async () => { try { const inputElement = document.getElementById('file-input') as HTMLInputElement; if (!inputElement?.files || inputElement.files.length === 0) { setDialogOpen(true); return; } if (!inputElement.files || inputElement.files.length === 0) { window.alert("Veuillez d'abord choisir une image à téléverser.") return; } const imageUrl = await ApiService.uploadImage(inputElement.files[0]); // Check for errors if(imageUrl.indexOf("ERROR") >= 0) { window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`) return; } setImageLinks(prevLinks => [...prevLinks, imageUrl]); // Reset the file input element if (fileInputRef.current) { fileInputRef.current.value = ''; } } catch (error) { window.alert(`Une erreur est survenue.\n${error}\nVeuillez réessayer plus tard.`) } }; const handleCopyToClipboard = async (link: string) => { navigator.clipboard.writeText(link); } const handleFocusQuestion = (index: number) => { const previewElement = document.querySelector('.preview-column'); if (previewElement) { const questionElements = previewElement.querySelectorAll('.question-item'); if (questionElements[index]) { questionElements[index].scrollIntoView({ behavior: 'smooth', block: 'start' }); } } }; return (
Éditeur de Quiz
{/*

Éditeur

*/}
{/* Collapsible Upload Section */}
{!isUploadCollapsed && (
setDialogOpen(false)}> Erreur Veuillez d'abord choisir une image à téléverser.
)}
{/* Collapsible Images Section */}
{!isImagesCollapsed && (

Mes images :

(Voir section

9. Images

ci-dessous
)

- Cliquez sur un lien pour le copier
    {imageLinks.map((link, index) => { const imgTag = `![alt_text](${escapeForGIFT(link)} "texte de l'infobulle")`; return (
  • handleCopyToClipboard(imgTag)}> {imgTag}
  • ); })}
)}
{/* Collapsible CheatSheet Section */}
{!isCheatSheetCollapsed && }

Prévisualisation

{showScrollButton && ( )}
); }; const scrollToTopButtonStyle: CSSProperties = { position: 'fixed', bottom: '40px', right: '50px', padding: '10px', fontSize: '16px', color: 'white', backgroundColor: '#5271ff', border: 'none', cursor: 'pointer', zIndex: 1000, }; export default QuizForm;