import React, { useState, useEffect, useRef } 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 { Button, TextField, NativeSelect, Divider, Dialog, DialogTitle, DialogActions, DialogContent } 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'; import 'bootstrap/dist/css/bootstrap.min.css'; 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 fileInputRef = useRef(null); const [dialogOpen, setDialogOpen] = useState(false); const [showScrollButton, setShowScrollButton] = useState(false); const scrollToTop = () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }; useEffect(() => { const handleScroll = () => { setShowScrollButton(window.scrollY > 300); }; window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, []); const scrollToImagesSection = (event: { preventDefault: () => void; }) => { event.preventDefault(); document.getElementById('images-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`); navigate('/teacher/dashboard'); return; } setQuiz(quiz); setQuizTitle(quiz.title); setSelectedFolder(quiz.folderId); setFilteredValue(quiz.content); setValue(quiz.content.join('\n\n')); } catch (error) { window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`); navigate('/teacher/dashboard'); } }; fetchData(); }, [id, navigate]); function handleUpdatePreview(value: string) { if (value !== '') { setValue(value); const linesArray = value.split(/\n{2,}/); if (linesArray[0] === '') linesArray.shift(); if (linesArray[linesArray.length - 1] === '') linesArray.pop(); setFilteredValue(linesArray); } } const handleQuizTitleChange = (event: React.ChangeEvent) => { setQuizTitle(event.target.value); }; const handleSelectFolder = (event: React.ChangeEvent) => { setSelectedFolder(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); } navigate('/teacher/dashboard'); } catch (error) { window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`); } }; const handleSaveImage = async () => { try { const inputElement = document.getElementById('file-input') as HTMLInputElement; if (!inputElement?.files || inputElement.files.length === 0) { setDialogOpen(true); return; } const imageUrl = await ApiService.uploadImage(inputElement.files[0]); if (imageUrl.indexOf("ERROR") >= 0) { window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`); return; } setImageLinks(prevLinks => [...prevLinks, imageUrl]); 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); } if (!isNewQuiz && !quiz) { return
Chargement...
; } return (
{/* Header */}

Éditeur de quiz

{/* Spacer for balance */}
{/* Quiz Info */}
{folders.map((folder: FolderType) => ( ))}
{/* Editor Section */}
{/* Editor Column */}
{/* Images Section */}
setDialogOpen(false)}> Erreur Veuillez d'abord choisir une image à téléverser.

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)} className="p-1 bg-light rounded" style={{ cursor: 'pointer' }} > {imgTag}
  • ); })}
{/* Preview Column */}

Prévisualisation

{/* Scroll to Top Button */} {showScrollButton && ( )}
); }; export default QuizForm;