import { useState } from 'react' import MapComponent from './MapComponent' import JobForm from './JobForm' import StatusMonitor from './StatusMonitor' import Welcome from './Welcome' import Login from './Login' import Admin from './Admin' import TechnicalDocs from './TechnicalDocs' type ViewState = 'welcome' | 'login' | 'app' | 'admin' | 'portfolio' // App entry point for GeoCrop Web function App() { const [view, setView] = useState('welcome') const [isAdmin, setIsAdmin] = useState(localStorage.getItem('isAdmin') === 'true') const [token, setToken] = useState(localStorage.getItem('token')) const [jobs, setJobs] = useState([]) const [selectedCoords, setSelectedCoords] = useState<{lat: string, lon: string} | null>(null) const [finishedJobs, setFinishedJobs] = useState>({}) const [activeResultUrl, setActiveResultUrl] = useState(undefined) const [activeROI, setActiveROI] = useState<{lat: number, lon: number, radius_m: number} | undefined>(undefined) const handleWelcomeContinue = () => { if (token) { setView('app') } else { setView('login') } } const handleViewPortfolio = () => { setView('portfolio') } const handleLoginSuccess = (newToken: string, isUserAdmin: boolean) => { localStorage.setItem('token', newToken) localStorage.setItem('isAdmin', isUserAdmin ? 'true' : 'false') setToken(newToken) setIsAdmin(isUserAdmin) setView('app') } const handleLogout = () => { localStorage.removeItem('token') localStorage.removeItem('isAdmin') setToken(null) setIsAdmin(false) setView('welcome') } const handleJobSubmitted = (jobId: string) => { setJobs(prev => [...prev, jobId]) } const handleCoordsSelected = (lat: number, lon: number) => { setSelectedCoords({ lat: lat.toFixed(6), lon: lon.toFixed(6) }) } const handleJobFinished = (jobId: string, data: any) => { setFinishedJobs(prev => ({ ...prev, [jobId]: data.result })) // Auto-overlay if it's the latest finished job if (data.result && (data.result.refined_url || data.result.refined_geotiff)) { setActiveResultUrl(data.result.refined_url || data.result.refined_geotiff) setActiveROI(data.roi) } } if (view === 'welcome') { return
} if (view === 'portfolio') { return
setView('welcome')} />
} if (view === 'login') { return
} if (view === 'admin') { return (
) } return (

GeoCrop

Crop Classification Zimbabwe

{isAdmin && ( )}

Current View:

Classification (2021-2022)

Tip: Click map to set coordinates

{jobs.length > 0 && (

Job History

{jobs.map(id => ( ))}
)} {Object.keys(finishedJobs).length > 0 && (

Completed Results

Predicted maps are being uploaded to the tiler. Check result URLs in the browser console for direct access.

)}
) } export default App