import React, { useState, DragEvent, useRef, useEffect } from 'react'; import './importModal.css'; import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton } from '@mui/material'; import { Clear, Download } from '@mui/icons-material'; import ApiService from '../../services/ApiService'; type DroppedFile = { id: number; name: string; icon: string; file: File; }; interface Props { handleOnClose: () => void; handleOnImport: () => void; open: boolean; selectedFolder: string; } const DragAndDrop: React.FC = ({ handleOnClose, handleOnImport, open, selectedFolder }) => { const [droppedFiles, setDroppedFiles] = useState([]); const fileInputRef = useRef(null); useEffect(() => { return () => { setDroppedFiles([]); }; }, []); const handleDragEnter = (e: DragEvent) => { e.preventDefault(); }; const handleDragOver = (e: DragEvent) => { e.preventDefault(); }; const handleDrop = (e: DragEvent) => { e.preventDefault(); const files = e.dataTransfer.files; handleFiles(files); }; const handleFiles = (files: FileList) => { const newDroppedFiles = Array.from(files) .filter((file) => file.name.endsWith('.txt')) .map((file, index) => ({ id: index, name: file.name, icon: '📄', file })); setDroppedFiles((prevFiles) => [...prevFiles, ...newDroppedFiles]); }; const handleOnSave = async () => { const storedQuizzes = JSON.parse(localStorage.getItem('quizzes') || '[]'); const quizzesToImportPromises = droppedFiles.map((droppedFile) => { return new Promise((resolve) => { const reader = new FileReader(); reader.onload = async (event) => { if (event.target && event.target.result) { const fileContent = event.target.result as string; //console.log(fileContent); if (fileContent.trim() === '') { resolve(null); } const questions = fileContent.split(/}/) .map(question => { // Remove trailing and leading spaces return question.trim()+"}"; }) .filter(question => question.trim() !== '').slice(0, -1); // Filter out lines with only whitespace characters try { // const folders = await ApiService.getUserFolders(); // Assuming you want to use the first folder // const selectedFolder = folders.length > 0 ? folders[0]._id : null; await ApiService.createQuiz(droppedFile.name.slice(0, -4) || 'Untitled quiz', questions, selectedFolder); resolve('success'); } catch (error) { console.error('Error saving quiz:', error); } } }; reader.readAsText(droppedFile.file); }); }); Promise.all(quizzesToImportPromises).then((quizzesToImport) => { const verifiedQuizzesToImport = quizzesToImport.filter((quiz) => { return quiz !== null; }); const updatedQuizzes = [...storedQuizzes, ...verifiedQuizzesToImport]; localStorage.setItem('quizzes', JSON.stringify(updatedQuizzes)); setDroppedFiles([]); handleOnImport(); handleOnClose(); window.location.reload(); }); }; const handleRemoveFile = (id: number) => { setDroppedFiles((prevFiles) => prevFiles.filter((file) => file.id !== id)); }; const handleFileInputChange = (e: React.ChangeEvent) => { const files = e.target.files; if (files) { handleFiles(files); } }; const handleBrowseButtonClick = () => { if (fileInputRef.current) { fileInputRef.current.click(); } }; const handleOnCancel = () => { setDroppedFiles([]); handleOnClose(); }; return ( <> {'Importation de quiz'}
Déposer des fichiers ici ou
cliquez pour ouvrir l'explorateur des fichiers
{droppedFiles.map((file) => (
{file.icon} {file.name} handleRemoveFile(file.id)} >
))}
); }; export default DragAndDrop;