Files
admin-frontend-domain/src/main.tsx
T
naibaandcloudcode f07c557029 feat(api-tokens): add PAT management UI, CSRF handling, and auth-loading fixes
Add an API tokens management route to create, list, and revoke PATs, showing
the plaintext token once on creation with scope and server-id selection.

Mirror the nz-csrf cookie into the X-CSRF-Token header on unsafe fetcher
methods (POST/PUT/PATCH/DELETE) for the server-side double-submit check, and
self-heal expired sessions via refresh-token without a recursive fetch loop.

Gate protected routes behind resolved auth state to avoid pre-auth SWR fetches,
and fix the login loading/race so stale probes cannot clobber the session.

Add i18n keys for the new screens across all locales.

Co-authored-by: cloudcode <cloudcode@users.noreply.github.com>
2026-05-30 15:56:53 +00:00

164 lines
5.2 KiB
TypeScript

// NOTE: Do not modify the import order unless absolutely necessary.
import { createRoot } from "react-dom/client"
import { RouterProvider, createBrowserRouter } from "react-router-dom"
import "./index.css"
import "./lib/i18n"
import { AuthProvider } from "./hooks/useAuth"
import { NotificationProvider } from "./hooks/useNotfication"
import { ServerProvider } from "./hooks/useServer"
import Root from "./routes/root"
import ErrorPage from "./error-page"
import ProtectedRoute from "./routes/protect"
import CronPage from "./routes/cron"
import LoginPage from "./routes/login"
import ServerPage from "./routes/server"
import ServicePage from "./routes/service"
import { TerminalPage } from "./components/terminal"
import DDNSPage from "./routes/ddns"
import NATPage from "./routes/nat"
import NotificationGroupPage from "./routes/notification-group"
import ServerGroupPage from "./routes/server-group"
import AlertRulePage from "./routes/alert-rule"
import NotificationPage from "./routes/notification"
import OnlineUserPage from "./routes/online-user"
import ProfilePage from "./routes/profile"
import SettingsPage from "./routes/settings"
import TransferPage from "./routes/transfer"
import UserPage from "./routes/user"
import WAFPage from "./routes/waf"
import ApiTokensPage from "./routes/api-tokens"
const router = createBrowserRouter([
{
path: "/dashboard",
element: (
<AuthProvider>
<ProtectedRoute>
<Root />
</ProtectedRoute>
</AuthProvider>
),
errorElement: <ErrorPage />,
children: [
{
path: "/dashboard/login",
element: <LoginPage />,
},
{
path: "/dashboard",
element: (
<ServerProvider withServerGroup>
<ServerPage />
</ServerProvider>
),
},
{
path: "/dashboard/service",
element: (
<ServerProvider withServer>
<NotificationProvider withNotifierGroup>
<ServicePage />
</NotificationProvider>
</ServerProvider>
),
},
{
path: "/dashboard/cron",
element: (
<ServerProvider withServer>
<NotificationProvider withNotifierGroup>
<CronPage />
</NotificationProvider>
</ServerProvider>
),
},
{
path: "/dashboard/alert-rule",
element: (
<NotificationProvider withNotifierGroup>
<AlertRulePage />
</NotificationProvider>
),
},
{
path: "/dashboard/ddns",
element: <DDNSPage />,
},
{
path: "/dashboard/nat",
element: <NATPage />,
},
{
path: "/dashboard/server-group",
element: (
<ServerProvider withServer>
<ServerGroupPage />
</ServerProvider>
),
},
{
path: "/dashboard/notification-group",
element: (
<NotificationProvider withNotifier>
<NotificationGroupPage />
</NotificationProvider>
),
},
{
path: "/dashboard/terminal/:id",
element: <TerminalPage />,
},
{
path: "/dashboard/notification",
element: (
<NotificationProvider withNotifierGroup>
<NotificationPage />
</NotificationProvider>
),
},
{
path: "/dashboard/profile",
element: (
<ServerProvider withServer withServerGroup>
<ProfilePage />
</ServerProvider>
),
},
{
path: "/dashboard/settings",
element: (
<NotificationProvider withNotifierGroup>
<SettingsPage />
</NotificationProvider>
),
},
{
path: "/dashboard/settings/user",
element: <UserPage />,
},
{
path: "/dashboard/settings/waf",
element: <WAFPage />,
},
{
path: "/dashboard/settings/online-user",
element: <OnlineUserPage />,
},
{
path: "/dashboard/settings/api-tokens",
element: <ApiTokensPage />,
},
{
path: "/dashboard/transfer",
element: <TransferPage />,
},
],
},
])
createRoot(document.getElementById("root")!).render(<RouterProvider router={router} />)