// EditorQuiz.tsx import React, { useState, useEffect, 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 } from '@mui/material'; import ReturnButton from 'src/components/ReturnButton/ReturnButton'; import ImageGalleryModal from 'src/components/ImageGallery/ImageGalleryModal/ImageGalleryModal'; import ApiService from '../../../services/ApiService'; import { escapeForGIFT } from '../../../utils/giftUtils'; import { ENV_VARIABLES } from 'src/constants'; 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 [showScrollButton, setShowScrollButton] = useState(false); 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); 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); } // split value when there is at least one blank line const linesArray = value.split(/\n{2,}/); // if the first item in linesArray is blank, remove it if (linesArray[0] === '') linesArray.shift(); 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 handleCopyToClipboard = async (link: string) => { navigator.clipboard.writeText(link); } const handleCopyImage = (id: string) => { const escLink = `${ENV_VARIABLES.BACKEND_URL}/api/image/get/${id}`; setImageLinks(prevLinks => [...prevLinks, escLink]); } return (
Éditeur de quiz
{/*

Éditeur

*/}

Mes images :

(Voir section

9. Images

ci-dessous
)

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

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;