import { Routes, Route, Navigate } from 'react-router-dom'; import { useState, useEffect, createContext, useContext } from 'react'; import Layout from './components/layout/Layout'; import Dashboard from './pages/Dashboard'; import AgentChat from './pages/AgentChat'; import Tools from './pages/Tools'; import Cron from './pages/Cron'; import Integrations from './pages/Integrations'; import Memory from './pages/Memory'; import Config from './pages/Config'; import Cost from './pages/Cost'; import Logs from './pages/Logs'; import Doctor from './pages/Doctor'; import { AuthProvider, useAuth } from './hooks/useAuth'; import { DraftContext, useDraftStore } from './hooks/useDraft'; import { setLocale, type Locale } from './lib/i18n'; // Locale context interface LocaleContextType { locale: string; setAppLocale: (locale: string) => void; } export const LocaleContext = createContext({ locale: 'tr', setAppLocale: () => {}, }); export const useLocaleContext = () => useContext(LocaleContext); // Pairing dialog component function PairingDialog({ onPair }: { onPair: (code: string) => Promise }) { const [code, setCode] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(''); try { await onPair(code); } catch (err: unknown) { setError(err instanceof Error ? err.message : 'Pairing failed'); } finally { setLoading(false); } }; return (
{/* Ambient glow */}
{/* Top glow accent */}
ZeroClaw

ZeroClaw

Enter the pairing code from your terminal

setCode(e.target.value)} placeholder="6-digit code" className="input-electric w-full px-4 py-4 text-center text-2xl tracking-[0.3em] font-medium mb-4" maxLength={6} autoFocus /> {error && (

{error}

)}
); } function AppContent() { const { isAuthenticated, requiresPairing, loading, pair, logout } = useAuth(); const [locale, setLocaleState] = useState('tr'); const draftStore = useDraftStore(); const setAppLocale = (newLocale: string) => { setLocaleState(newLocale); setLocale(newLocale as Locale); }; // Listen for 401 events to force logout useEffect(() => { const handler = () => { logout(); }; window.addEventListener('zeroclaw-unauthorized', handler); return () => window.removeEventListener('zeroclaw-unauthorized', handler); }, [logout]); if (loading) { return (

Connecting...

); } if (!isAuthenticated && requiresPairing) { return ; } return ( }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); } export default function App() { return ( ); }