import { useEffect, useState } from 'react' import { Redirect, Route, Switch, useLocation } from 'wouter' import { ApiError, api, onUnauthorized, read } from './api.ts' import { messageOf } from './components/useAction.ts' import { ChatPage } from './pages/ChatPage.tsx' import { LoginPage } from './pages/LoginPage.tsx' import { SettingsPage } from './pages/SettingsPage.tsx' import { SharedPage } from './pages/SharedPage.tsx' import { type Me, MeContext } from './session.tsx' import { openStore } from './store/client.ts' import { StoreProvider } from './store/react.tsx' type Session = | { state: 'loading' } | { state: 'signed-out' } | { state: 'signed-in'; me: Me } | { state: 'error'; message: string } export function useSession(): Session { const [session, setSession] = useState({ state: 'loading' }) useEffect(() => { read(api.auth.me.$get()) .then((me) => setSession({ state: 'signed-in', me: me as Me })) .catch((err: unknown) => setSession( err instanceof ApiError && err.status === 401 ? { state: 'signed-out' } : { state: 'error', message: messageOf(err) }, ), ) }, []) return session } function SignedIn({ me }: { me: Me }) { const store = openStore(me.did) useEffect(() => { const ended = () => // Use a full page load, since the signed-in routes redirect /login to /. store .deleteLocalCopy() .catch((err: unknown) => console.error('Could not delete the local copy', err)) .finally(() => location.assign('/login')) const stopApi = onUnauthorized(ended) const stopStore = store.onChange((change) => change.type === 'unauthorized' && ended()) return () => { stopApi() stopStore() } }, [store]) return ( {(params) => } ) } export function App() { const session = useSession() if (session.state === 'loading') return

Loading...

if (session.state === 'error') return

Could not reach the server: {session.message}

const signedIn = session.state === 'signed-in' return ( {(params) => ( )} {signedIn ? : } ) } function SignedOut() { const [location] = useLocation() if (location !== '/login') return return }