import React, { useState, useEffect } from 'react'; import { X } from 'lucide-react'; import Navbar from './components/Navbar'; import ProductGuide from './components/ProductGuide'; import MainTabViews, { MainTabId } from './components/MainTabViews'; import { TAB_PROMISES, PRODUCT_NAME } from './branding'; import { useHashRoute } from './services/useHashRoute'; const KNOWN_TABS = ['usersync', 'nova-act', 'datahub', 'oasis', 'graph', 'dev']; function App() { const [route, navigate] = useHashRoute('usersync'); const currentTab = (KNOWN_TABS.includes(route.tab) ? route.tab : 'usersync') as MainTabId; const setCurrentTab = (tab: MainTabId) => navigate(tab); const [showGuide, setShowGuide] = useState(false); const [user, setUser] = useState(null); const [simulationResult, setSimulationResult] = useState(null); // Deep-linkable page title per tab (spec §11 / branding). useEffect(() => { document.title = `${PRODUCT_NAME} — ${TAB_PROMISES[currentTab] || 'AI usability testing'}`; }, [currentTab]); useEffect(() => { const fetchUser = async () => { try { const response = await fetch('/api/user'); if (response.ok) setUser(await response.json()); } catch (error) { console.error('Failed to fetch user:', error); } }; fetchUser(); window.addEventListener('storage', fetchUser); return () => window.removeEventListener('storage', fetchUser); }, []); const loginWithHF = () => window.open('/login', '_blank'); const handleLogout = async () => { await fetch('/api/logout'); setUser(null); }; if (showGuide) { return (
); } return (
setShowGuide(true)} user={user} onLogin={loginWithHF} onLogout={handleLogout} simulationResult={simulationResult} setSimulationResult={setSimulationResult} />
); } export default App;