import { useState, useEffect } from 'react' import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom' import { useAuth } from '@/hooks/useAuth' import Sidebar from '@/components/Sidebar' import LoginPage from '@/pages/LoginPage' import SetupWizardPage from '@/pages/SetupWizardPage' import DashboardPage from '@/pages/DashboardPage' import TasksPage from '@/pages/TasksPage' import TaskDetailPage from '@/pages/TaskDetailPage' import ProjectsPage from '@/pages/ProjectsPage' import ProjectDetailPage from '@/pages/ProjectDetailPage' import MilestonesPage from '@/pages/MilestonesPage' import MilestoneDetailPage from '@/pages/MilestoneDetailPage' import NotificationsPage from '@/pages/NotificationsPage' import RoleEditorPage from '@/pages/RoleEditorPage' import MonitorPage from '@/pages/MonitorPage' import ProposalsPage from '@/pages/ProposalsPage' import ProposalDetailPage from '@/pages/ProposalDetailPage' import UsersPage from '@/pages/UsersPage' import CalendarPage from '@/pages/CalendarPage' import SupportDetailPage from '@/pages/SupportDetailPage' import MeetingDetailPage from '@/pages/MeetingDetailPage' import axios from 'axios' const WIZARD_PORT = Number(import.meta.env.VITE_WIZARD_PORT) || 18080 const WIZARD_BASE = `http://127.0.0.1:${WIZARD_PORT}` const getApiBase = () => { return localStorage.getItem('HF_BACKEND_BASE_URL') || import.meta.env.VITE_API_BASE || 'http://127.0.0.1:8000' } type AppState = 'checking' | 'setup' | 'ready' export default function App() { const [appState, setAppState] = useState('checking') const { user, loading, login, logout } = useAuth() useEffect(() => { checkInitialized() }, []) const checkInitialized = async () => { // First try the backend /config/status endpoint (reads from config volume directly) try { const res = await axios.get(`${getApiBase()}/config/status`, { timeout: 5000 }) const cfg = res.data || {} if (cfg.backend_url) { localStorage.setItem('HF_BACKEND_BASE_URL', cfg.backend_url) } if (cfg.initialized === true) { setAppState('ready') return } } catch { // Backend unreachable — fall through to wizard check } // Fallback: try the wizard directly (needed during initial setup before backend starts) try { const res = await axios.get(`${WIZARD_BASE}/api/v1/config/harborforge.json`, { timeout: 5000, }) const cfg = res.data || {} if (cfg.backend_url) { localStorage.setItem('HF_BACKEND_BASE_URL', cfg.backend_url) } if (cfg.initialized === true) { setAppState('ready') } else { setAppState('setup') } } catch { // Neither backend nor wizard reachable → setup needed setAppState('setup') } } if (appState === 'checking') { return
Checking configuration status...
} if (appState === 'setup') { return } if (loading) return
Loading...
if (!user) { return (
} /> } /> } /> } /> } />
) } return (
} /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Legacy routes for backward compatibility */} } /> } /> } /> } /> } /> } /> } /> } /> } />
) }