Ohne E-Mail-System erzeugt der Admin per CLI einen Link (/reset#<token>), gültig 72 h und einmal. Gespeichert wird nur der SHA-256 des Tokens; es steht im Fragment und geht nur im POST-Body an die API. Der Reset meldet alle alten Sessions ab und loggt direkt neu ein. Passwortregeln jetzt gemeinsam in checkNewPassword. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import { StrictMode } from "react";
|
|
import { createRoot } from "react-dom/client";
|
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
import { RouterProvider, createBrowserRouter } from "react-router";
|
|
import { ApiError } from "./api";
|
|
import { Layout } from "./Layout";
|
|
import { FeedPage } from "./pages/FeedPage";
|
|
import { EntryPage } from "./pages/EntryPage";
|
|
import { UserPage } from "./pages/UserPage";
|
|
import { StatsPage } from "./pages/StatsPage";
|
|
import { ResetPage } from "./pages/ResetPage";
|
|
import "./app.css";
|
|
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
// 4xx ist eine Antwort, kein Aussetzer -- erneut fragen ändert nichts.
|
|
retry: (count, err) => !(err instanceof ApiError && err.status < 500) && count < 2,
|
|
// Beim Zurückwechseln in den Tab nicht den ganzen Feed neu laden; die
|
|
// Daten werden gezielt nach eigenen Aktionen invalidiert.
|
|
refetchOnWindowFocus: false,
|
|
staleTime: 30_000,
|
|
},
|
|
},
|
|
});
|
|
|
|
const router = createBrowserRouter([
|
|
{
|
|
element: <Layout />,
|
|
children: [
|
|
{ path: "/", element: <FeedPage /> },
|
|
{ path: "/e/:pid", element: <EntryPage /> },
|
|
{ path: "/u/:username", element: <UserPage /> },
|
|
{ path: "/stats", element: <StatsPage /> },
|
|
{ path: "/reset", element: <ResetPage /> },
|
|
],
|
|
},
|
|
]);
|
|
|
|
createRoot(document.getElementById("root")!).render(
|
|
<StrictMode>
|
|
<QueryClientProvider client={queryClient}>
|
|
<RouterProvider router={router} />
|
|
</QueryClientProvider>
|
|
</StrictMode>,
|
|
);
|