|
|
import { useState, useEffect } from 'react'; |
|
|
import { UserProvider, useUser } from './context/UserContext'; |
|
|
import { ProjectProvider, useProject } from './context/ProjectContext'; |
|
|
import { LoginPage } from './pages/LoginPage'; |
|
|
import { ProjectSelectionPage } from './pages/ProjectSelectionPage'; |
|
|
import { TaskSetupPage } from './pages/TaskSetupPage'; |
|
|
import { ActivityPage } from './pages/ActivityPage'; |
|
|
import { TaskSolverPage } from './pages/TaskSolverPage'; |
|
|
import { api } from './api/client'; |
|
|
import type { Task } from './types'; |
|
|
|
|
|
function AppContent() { |
|
|
const { user, isLoading: userLoading } = useUser(); |
|
|
const { currentProject } = useProject(); |
|
|
const [taskSetupComplete, setTaskSetupComplete] = useState<boolean | null>(null); |
|
|
const [checkingTasks, setCheckingTasks] = useState(false); |
|
|
const [activeTask, setActiveTask] = useState<Task | null>(null); |
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
if (!currentProject || !user) { |
|
|
setTaskSetupComplete(null); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
if (currentProject.role !== 'owner') { |
|
|
setTaskSetupComplete(true); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
const checkTasks = async () => { |
|
|
setCheckingTasks(true); |
|
|
try { |
|
|
const result = await api.listTasks(currentProject.id); |
|
|
setTaskSetupComplete((result.tasks?.length || 0) > 0); |
|
|
} catch { |
|
|
|
|
|
setTaskSetupComplete(false); |
|
|
} finally { |
|
|
setCheckingTasks(false); |
|
|
} |
|
|
}; |
|
|
|
|
|
checkTasks(); |
|
|
}, [currentProject, user]); |
|
|
|
|
|
|
|
|
if (userLoading) { |
|
|
return ( |
|
|
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900 flex items-center justify-center"> |
|
|
<div className="text-white text-xl">Loading...</div> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
if (!user) { |
|
|
return <LoginPage />; |
|
|
} |
|
|
|
|
|
|
|
|
if (!currentProject) { |
|
|
return <ProjectSelectionPage />; |
|
|
} |
|
|
|
|
|
|
|
|
if (checkingTasks || taskSetupComplete === null) { |
|
|
return ( |
|
|
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900 flex items-center justify-center"> |
|
|
<div className="text-white text-xl">Loading project...</div> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
if (currentProject.role === 'owner' && !taskSetupComplete) { |
|
|
return <TaskSetupPage onComplete={() => setTaskSetupComplete(true)} />; |
|
|
} |
|
|
|
|
|
|
|
|
if (activeTask) { |
|
|
return ( |
|
|
<TaskSolverPage |
|
|
task={activeTask} |
|
|
onBack={() => setActiveTask(null)} |
|
|
onTaskCompleted={() => setActiveTask(null)} |
|
|
/> |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
return <ActivityPage onStartTask={setActiveTask} />; |
|
|
} |
|
|
|
|
|
function App() { |
|
|
return ( |
|
|
<UserProvider> |
|
|
<ProjectProvider> |
|
|
<AppContent /> |
|
|
</ProjectProvider> |
|
|
</UserProvider> |
|
|
); |
|
|
} |
|
|
|
|
|
export default App; |
|
|
|