import React, { useState } from 'react'; import Sidebar from './components/Sidebar'; import PipelineStudio from './components/PipelineStudio'; import ChallengeMode from './components/ChallengeMode'; import CustomFunctionEditor from './components/CustomFunctionEditor'; import CodeCorrector from './components/CodeCorrector'; import { ViewState, NodeDefinition, Language, Challenge } from './types'; import { CHALLENGES } from './constants'; const App: React.FC = () => { const [currentView, setCurrentView] = useState('STUDIO'); const [language, setLanguage] = useState('en'); const [customNodes, setCustomNodes] = useState([]); const [activeChallenge, setActiveChallenge] = useState(null); const [userChallenges, setUserChallenges] = useState([]); const [completedChallenges, setCompletedChallenges] = useState>({}); const handleCustomNodeCreated = (node: NodeDefinition) => { setCustomNodes(prev => [...prev, node]); setCurrentView('STUDIO'); }; const handleImportCommunityNode = (node: NodeDefinition) => { // Clone the node to avoid reference issues const importedNode = { ...node, id: `imported_${Date.now()}` }; setCustomNodes(prev => [...prev, importedNode]); }; const handleEnterChallengeWorkspace = (challenge: Challenge) => { setActiveChallenge(challenge); setCurrentView('CHALLENGE_WORKSPACE'); }; const handleExitChallenge = () => { setActiveChallenge(null); setCurrentView('CHALLENGES'); }; const handleChallengeComplete = (challengeId: string) => { setCompletedChallenges(prev => ({ ...prev, [challengeId]: { date: new Date().toISOString() } })); }; const getChallengesWithStatus = () => { return [...CHALLENGES, ...userChallenges].map(c => ({ ...c, isCompleted: !!completedChallenges[c.id], completionDate: completedChallenges[c.id]?.date || null })); }; const renderContent = () => { switch (currentView) { case 'STUDIO': return ; case 'CHALLENGES': return c.isUserCreated)} allChallengesWithStatus={getChallengesWithStatus()} // Pass full list with status onSaveChallenge={(c) => setUserChallenges([...userChallenges, c])} />; case 'EDITOR': return ; case 'CORRECTOR': return ; case 'CHALLENGE_WORKSPACE': return ( ); default: return ; } }; return (
{ if (currentView === 'CHALLENGE_WORKSPACE' && view !== 'CHALLENGES') { setActiveChallenge(null); } setCurrentView(view); }} language={language} onToggleLanguage={() => setLanguage(l => l === 'en' ? 'fr' : 'en')} />
{renderContent()}
); }; export default App;