// Caririaçu Guincho — App Root const { useState: useStateApp, useEffect: useEffectApp } = React; const App = () => { const [session, setSession] = useStateApp(null); const [authReady, setAuthReady] = useStateApp(false); const [page, setPage] = useStateApp('dashboard'); const [sidebarOpen, setSidebarOpen] = useStateApp(false); const [isMobile, setIsMobile] = useStateApp(window.innerWidth < 768); const [selectedGuincho, setSelectedGuincho] = useStateApp(null); useEffectApp(() => { window.abrirGuincho = (id) => { setSelectedGuincho(id); setPage('guincho-detalhe'); }; return () => { delete window.abrirGuincho; }; }, []); useEffectApp(() => { const handler = () => setIsMobile(window.innerWidth < 768); window.addEventListener('resize', handler); return () => window.removeEventListener('resize', handler); }, []); useEffectApp(() => { auth.session().then(s => { setSession(s); setAuthReady(true); }); const { data: sub } = auth.onChange((_event, s) => setSession(s)); return () => sub?.subscription?.unsubscribe?.(); }, []); if (!authReady) { return (
); } if (!session) return {/* session será atualizada via listener */}} />; const renderScreen = () => { switch (page) { case 'dashboard': return ; case 'assistencias': return ; case 'vistoria': return ; case 'frota': return ; case 'motoristas': return ; case 'seguradoras': return ; case 'financeiro': return ; case 'relatorios': return ; case 'configuracoes': return ; case 'guincho-detalhe': return { setPage('frota'); setSelectedGuincho(null); }} />; case 'lembretes': return ; default: return ; } }; const handleLogout = async () => { await auth.signOut(); showToast('Sessão encerrada', 'info'); }; return (
{!isMobile && ( )} {isMobile && ( setSidebarOpen(false)} active={page} onNav={setPage} session={session} onLogout={handleLogout} /> )}
setSidebarOpen(!sidebarOpen)} isMobile={isMobile} onNav={setPage} session={session} />
{renderScreen()}
); }; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <> );