import React, { useState, useEffect } from 'react'; import { X, Play, RefreshCw, Terminal, Code2, Trash2 } from 'lucide-react'; interface Props { isOpen: boolean; onClose: () => void; } type Language = 'javascript' | 'python'; const CodeSandboxModal: React.FC = ({ isOpen, onClose }) => { const [language, setLanguage] = useState('javascript'); const [code, setCode] = useState(''); const [output, setOutput] = useState([]); const [isRunning, setIsRunning] = useState(false); const DEFAULT_CODE = { javascript: `// Bienvenue dans le Bac à Sable JS ! const nom = "EduLab"; const annee = 2025; console.log("Bonjour " + nom); console.log("Nous sommes en " + annee); // Boucle simple for(let i = 1; i <= 3; i++) { console.log("Compteur : " + i); }`, python: `# Bienvenue dans le Bac à Sable Python ! nom = "EduLab" score = 100 print("Bonjour " + nom) print("Votre score est : " + str(score)) # Calcul simple a = 5 b = 10 print("La somme de 5 + 10 est : " + str(a + b))` }; useEffect(() => { if (isOpen) { setCode(DEFAULT_CODE[language]); setOutput(['Prêt à exécuter le code...']); } }, [isOpen, language]); if (!isOpen) return null; const runJavaScript = () => { const logs: string[] = []; // Surcharge de console.log pour capturer la sortie const originalLog = console.log; console.log = (...args) => { logs.push(args.map(arg => String(arg)).join(' ')); // originalLog(...args); // Décommenter pour voir aussi dans la console du navigateur }; try { // Exécution sécurisée via Function constructor // eslint-disable-next-line no-new-func new Function(code)(); } catch (error: any) { logs.push(`Erreur : ${error.message}`); } finally { // Restauration de console.log console.log = originalLog; setOutput(logs.length > 0 ? logs : ['Code exécuté avec succès (aucune sortie).']); } }; const runPythonMock = () => { // Simulation simple d'un interpréteur Python pour la démo // Note: Un vrai interpréteur nécessiterait Pyodide (WASM) qui est trop lourd pour cette démo. const logs: string[] = []; const variables: Record = {}; try { const lines = code.split('\n'); lines.forEach(line => { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#')) return; // Gestion simple des print() if (trimmed.startsWith('print(') && trimmed.endsWith(')')) { let content = trimmed.slice(6, -1); // Gestion basique de la concaténation de chaînes (+) const parts = content.split('+').map(p => p.trim()); let result = ''; parts.forEach(part => { if ((part.startsWith('"') && part.endsWith('"')) || (part.startsWith("'") && part.endsWith("'"))) { // C'est une string littérale result += part.slice(1, -1); } else if (part.startsWith('str(') && part.endsWith(')')) { // Conversion str() d'une variable ou expression const varName = part.slice(4, -1).trim(); // Check si c'est une expression math simple (a + b) if (varName.includes('+')) { const [v1, v2] = varName.split('+').map(v => v.trim()); const val1 = variables[v1] !== undefined ? variables[v1] : parseInt(v1); const val2 = variables[v2] !== undefined ? variables[v2] : parseInt(v2); result += (val1 + val2); } else { result += variables[varName] !== undefined ? variables[varName] : `[Err: ${varName}]`; } } else { // C'est une variable directe result += variables[part] !== undefined ? variables[part] : ''; } }); logs.push(result); } // Gestion simple des assignations (a = 5, b = "text") else if (trimmed.includes('=')) { const [varName, value] = trimmed.split('=').map(s => s.trim()); if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { variables[varName] = value.slice(1, -1); } else if (!isNaN(Number(value))) { variables[varName] = Number(value); } } }); if (logs.length === 0) logs.push("Code exécuté (simulation Python simplifiée)."); } catch (e) { logs.push("Erreur de syntaxe (Simulée)"); } setOutput(logs); }; const handleRun = () => { setIsRunning(true); setOutput([]); setTimeout(() => { if (language === 'javascript') { runJavaScript(); } else { runPythonMock(); } setIsRunning(false); }, 500); // Petit délai pour l'effet "traitement" }; return (
{/* Header */}

Bac à Sable Code

Expérimentez en JavaScript ou Python

{/* Main Area */}
{/* Editor */}
éditeur.{language === 'javascript' ? 'js' : 'py'}
{/* Output */}
Console
{output.map((line, idx) => (
{'>'} {line}
))} {output.length === 0 && (
Cliquez sur "Exécuter" pour voir le résultat ici.
)}
{/* Footer Controls */}
{language === 'python' && ( Mode simulation Supporte print(), variables et maths simples. )}
); }; export default CodeSandboxModal;