import { QueryCache, QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { StrictMode, type ReactNode } from "react"; import { createRoot } from "react-dom/client"; import { Redirect, Route, Switch } from "wouter"; import { ApiError } from "./api.ts"; import { friendlyError } from "./format.ts"; import { Shell } from "./components/Shell.tsx"; import { useMe } from "./hooks.ts"; import { Changes } from "./routes/changes.tsx"; import { Library } from "./routes/library.tsx"; import { Lists } from "./routes/lists.tsx"; import { Log } from "./routes/log.tsx"; import { Login } from "./routes/login.tsx"; import { NotYet } from "./routes/not-yet.tsx"; import { Register } from "./routes/register.tsx"; import { SourceDetail, Sources } from "./routes/sources.tsx"; const queryClient: QueryClient = new QueryClient({ queryCache: new QueryCache({ // A 401 anywhere means the session ended: re-check who we are, which sends the user to sign in. onError: (e, query) => { if (e instanceof ApiError && e.status === 401 && query.queryKey[0] !== "me") void queryClient.invalidateQueries({ queryKey: ["me"] }); }, }), defaultOptions: { queries: { staleTime: 15_000, retry: (n, e) => !(e instanceof ApiError && e.status > 0 && e.status < 500) && n < 2, }, }, }); function RequireAuth({ children }: { children: ReactNode }) { const me = useMe(); if (me.isPending) return
STTracker
; if (me.error instanceof ApiError && me.error.status === 401) return ; if (me.error) { return (
STTracker

Can't load your library

{friendlyError(me.error)}

); } return <>{children}; } function App() { return ( {() => } {(p) => } {() => } {(p) => } {(p) => } {(p) => } ); } createRoot(document.getElementById("root")!).render( , );