feat: add base path configuration

This commit is contained in:
2025-03-19 05:36:01 +07:00
parent 04a10eadfd
commit 2aaaf87dfd
11 changed files with 125 additions and 44 deletions
+42 -36
View File
@@ -2,6 +2,7 @@ import { createBrowserRouter, RouterProvider } from "react-router-dom";
import { lazy, Suspense } from "react";
import AuthLayout from "@/components/layouts/auth-layout";
import MainLayout from "@/components/layouts/main-layout";
import { BASE_PATH } from "@/lib/consts";
const LoginPage = lazy(() => import("@/pages/auth/login"));
const ClusterPage = lazy(() => import("@/pages/cluster/page"));
@@ -10,43 +11,48 @@ const BucketsPage = lazy(() => import("@/pages/buckets/page"));
const ManageBucketPage = lazy(() => import("@/pages/buckets/manage/page"));
const KeysPage = lazy(() => import("@/pages/keys/page"));
const router = createBrowserRouter([
const router = createBrowserRouter(
[
{
path: "/auth",
Component: AuthLayout,
children: [
{
path: "login",
Component: LoginPage,
},
],
},
{
path: "/",
Component: MainLayout,
children: [
{
index: true,
Component: HomePage,
},
{
path: "cluster",
Component: ClusterPage,
},
{
path: "buckets",
children: [
{ index: true, Component: BucketsPage },
{ path: ":id", Component: ManageBucketPage },
],
},
{
path: "keys",
Component: KeysPage,
},
],
},
],
{
path: "/auth",
Component: AuthLayout,
children: [
{
path: "login",
Component: LoginPage,
},
],
},
{
path: "/",
Component: MainLayout,
children: [
{
index: true,
Component: HomePage,
},
{
path: "cluster",
Component: ClusterPage,
},
{
path: "buckets",
children: [
{ index: true, Component: BucketsPage },
{ path: ":id", Component: ManageBucketPage },
],
},
{
path: "keys",
Component: KeysPage,
},
],
},
]);
basename: BASE_PATH,
}
);
const Router = () => {
return (
+2 -1
View File
@@ -15,6 +15,7 @@ import appStore from "@/stores/app-store";
import garageLogo from "@/assets/garage-logo.svg";
import { useMutation } from "@tanstack/react-query";
import api from "@/lib/api";
import * as utils from "@/lib/utils";
import { toast } from "sonner";
import { useAuth } from "@/hooks/useAuth";
@@ -93,7 +94,7 @@ const LogoutButton = () => {
const logout = useMutation({
mutationFn: () => api.post("/auth/logout"),
onSuccess: () => {
window.location.href = "/auth/login";
window.location.href = utils.url("/auth/login");
},
onError: (err) => {
toast.error(err?.message || "Unknown error");
+7
View File
@@ -0,0 +1,7 @@
export {};
declare global {
interface Window {
__BASE_PATH?: string;
}
}
+5 -2
View File
@@ -1,10 +1,13 @@
import * as utils from "@/lib/utils";
import { BASE_PATH } from "./consts";
type FetchOptions = Omit<RequestInit, "headers" | "body"> & {
params?: Record<string, any>;
headers?: Record<string, string>;
body?: any;
};
export const API_URL = "/api";
export const API_URL = BASE_PATH + "/api";
export class APIError extends Error {
status!: number;
@@ -47,7 +50,7 @@ const api = {
const data = isJson ? await res.json() : await res.text();
if (res.status === 401 && !url.startsWith("/auth")) {
window.location.href = "/auth/login";
window.location.href = utils.url("/auth/login");
throw new APIError("unauthorized", res.status);
}
+6
View File
@@ -0,0 +1,6 @@
// consts.ts
export const BASE_PATH =
(import.meta.env.PROD ? window.__BASE_PATH : null) ||
import.meta.env.VITE_BASE_PATH ||
"";
+5
View File
@@ -3,6 +3,7 @@ import { toast } from "sonner";
import { twMerge } from "tailwind-merge";
import dayjsRelativeTime from "dayjs/plugin/relativeTime";
import dayjs from "dayjs";
import { BASE_PATH } from "./consts";
dayjs.extend(dayjsRelativeTime);
export { dayjs };
@@ -53,3 +54,7 @@ export const copyToClipboard = async (text: string) => {
textArea?.remove();
}
};
export const url = (...paths: unknown[]) => {
return BASE_PATH + paths.join("/");
};