// EditorQuiz.tsx import React, { useState, useEffect, useRef } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { FolderType } from '../../../Types/FolderType'; import Editor from '../../../components/Editor/Editor'; import GiftCheatSheet from '../../../components/GIFTCheatSheet/GiftCheatSheet'; import GIFTTemplatePreview from '../../../components/GiftTemplate/GIFTTemplatePreview'; import { QuizType } from '../../../Types/QuizType'; import './editorQuiz.css'; import { Button, TextField, NativeSelect, Divider, Dialog, DialogTitle, DialogActions, DialogContent } from '@mui/material'; import ReturnButton from '../../../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 [value, setValue] = 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); 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); setValue(quiz.content.join('\n\n')); } 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]); function handleUpdatePreview(value: string) { if (value !== '') { setValue(value); } const linesArray = value.split(/(?<=^|[^\\]}.*)[\n]+/); if (linesArray[linesArray.length - 1] === '') linesArray.pop(); setFilteredValue(linesArray); } const handleQuizTitleChange = (event: React.ChangeEvent) => { setQuizTitle(event.target.value); }; const handleQuizSave = async () => { try { // check if everything is there 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); } } navigate('/teacher/dashboard'); } 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 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 = ''; } // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`) } }; const handleCopyToClipboard = async (link: string) => { navigator.clipboard.writeText(link); } return (
Éditeur de quiz
{/*

Éditeur

*/}
setDialogOpen(false)} > Erreur Veuillez d'abord choisir une image à téléverser.

Mes images :

(Voir section ci-dessous :

9. Images

)

- 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}
  • ); })}

Prévisualisation

); }; export default QuizForm;