import { useCallback, useEffect, useState } from 'react' import { clearSession, getSession } from './db' import { navigate, useRoute } from './router' import { LoginPage } from './pages/Login' import { HomePage } from './pages/Home' import { AddAccountPage } from './pages/AddAccount' import { LedgerPage } from './pages/Ledger' import { AddTransactionPage } from './pages/AddTransaction' import { StatusBar } from './components/Screen' type AuthState = | { status: 'loading' } | { status: 'logged-out' } | { status: 'logged-in'; user: string } export default function App() { const route = useRoute() const [auth, setAuth] = useState({ status: 'loading' }) const [reloadKey, setReloadKey] = useState(0) useEffect(() => { let alive = true getSession().then((s) => { if (!alive) return setAuth( s ? { status: 'logged-in', user: s.user } : { status: 'logged-out' }, ) }) return () => { alive = false } }, []) useEffect(() => { if (auth.status === 'loading') return if (auth.status === 'logged-out' && route.name !== 'login') { navigate('/login', { replace: true }) } else if (auth.status === 'logged-in' && route.name === 'login') { navigate('/', { replace: true }) } }, [auth, route.name]) const bumpReload = () => setReloadKey((k) => k + 1) const onLogout = useCallback(async () => { await clearSession() setAuth({ status: 'logged-out' }) navigate('/login', { replace: true }) }, []) return (
{auth.status === 'loading' ? (
Loading…
) : auth.status === 'logged-out' ? ( setAuth({ status: 'logged-in', user })} /> ) : ( renderRouteForLoggedIn(route, auth.user, bumpReload, onLogout, reloadKey) )}
) } function renderRouteForLoggedIn( route: ReturnType, user: string, bumpReload: () => void, onLogout: () => void, reloadKey: number, ) { switch (route.name) { case 'home': return ( ) case 'add-account': return case 'ledger': return ( ) case 'add-transaction': return ( ) case 'login': return null case 'not-found': default: return (
Page not found
) } }