You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.7 KiB
110 lines
2.7 KiB
import { createRoute, redirect } from "@tanstack/react-router";
|
|
import { Dashboard } from "@pages/Dashboard/index.tsx";
|
|
import MessagesPage from "@pages/Messages.tsx";
|
|
import MapPage from "@pages/Map/index.tsx";
|
|
import ConfigPage from "@pages/Config/index.tsx";
|
|
import ChannelsPage from "@pages/Channels.tsx";
|
|
import NodesPage from "@pages/Nodes/index.tsx";
|
|
import { createRootRoute } from "@tanstack/react-router";
|
|
import { App } from "./App.tsx";
|
|
import { DialogManager } from "@components/Dialog/DialogManager.tsx";
|
|
import { z } from "zod";
|
|
|
|
const rootRoute = createRootRoute({
|
|
component: App,
|
|
});
|
|
|
|
const indexRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/",
|
|
component: Dashboard,
|
|
loader: () => {
|
|
// Redirect to the broadcast messages page on initial load
|
|
return redirect({ to: `/messages/broadcast/0`, replace: true });
|
|
},
|
|
});
|
|
|
|
const messagesRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/messages",
|
|
component: MessagesPage,
|
|
beforeLoad: ({ params }) => {
|
|
const DEFAULT_CHANNEL = 0;
|
|
|
|
if (Object.values(params).length === 0) {
|
|
throw redirect({
|
|
to: `/messages/broadcast/${DEFAULT_CHANNEL}`,
|
|
replace: true,
|
|
});
|
|
}
|
|
},
|
|
});
|
|
|
|
const chatIdSchema = z.string().refine((val) => {
|
|
const num = Number(val);
|
|
if (isNaN(num) || !Number.isInteger(num)) {
|
|
return false;
|
|
}
|
|
|
|
const isChannelId = num >= 0 && num <= 10;
|
|
const isNodeId = num >= 1000000000 && num <= 9999999999;
|
|
|
|
return isChannelId || isNodeId;
|
|
}, {
|
|
message: "Chat ID must be a channel (0-10) or a valid node ID.",
|
|
});
|
|
|
|
export const messagesWithParamsRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/messages/$type/$chatId",
|
|
component: MessagesPage,
|
|
parseParams: (params) => ({
|
|
type: z.enum(["direct", "broadcast"], {
|
|
errorMap: () => ({ message: 'Type must be "direct" or "broadcast".' }),
|
|
}).parse(params.type),
|
|
chatId: chatIdSchema.parse(params.chatId),
|
|
}),
|
|
});
|
|
|
|
const mapRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/map",
|
|
component: MapPage,
|
|
});
|
|
|
|
const configRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/config",
|
|
component: ConfigPage,
|
|
});
|
|
|
|
const channelsRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/channels",
|
|
component: ChannelsPage,
|
|
});
|
|
|
|
const nodesRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/nodes",
|
|
component: NodesPage,
|
|
});
|
|
|
|
const dialogWithParamsRoute = createRoute({
|
|
getParentRoute: () => rootRoute,
|
|
path: "/dialog/$dialogId",
|
|
component: DialogManager,
|
|
});
|
|
|
|
export const routeTree = rootRoute.addChildren([
|
|
indexRoute,
|
|
messagesRoute,
|
|
messagesWithParamsRoute,
|
|
mapRoute,
|
|
configRoute,
|
|
channelsRoute,
|
|
nodesRoute,
|
|
dialogWithParamsRoute,
|
|
]);
|
|
|
|
export { rootRoute };
|
|
|