diff --git a/apps/web/src/routes/_protected/layout.tsx b/apps/web/src/routes/_protected/layout.tsx index 3bf4e9d4..70509fd6 100644 --- a/apps/web/src/routes/_protected/layout.tsx +++ b/apps/web/src/routes/_protected/layout.tsx @@ -61,10 +61,10 @@ function RouteComponent() { } - active={pathname.startsWith("/dashboard")} + active={pathname.startsWith("/portal")} /> - {/* {data.user.role === "admin" ? : } */} -

Dashboard

+

Event Portal

diff --git a/apps/web/src/routes/admin/events-management.tsx b/apps/web/src/routes/admin/events-management.tsx new file mode 100644 index 00000000..54c5815d --- /dev/null +++ b/apps/web/src/routes/admin/events-management.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/admin/events-management")({ + component: RouteComponent, +}); + +function RouteComponent() { + return
Hello "/admin/events-management"!
; +} diff --git a/apps/web/src/routes/admin/layout.tsx b/apps/web/src/routes/admin/layout.tsx new file mode 100644 index 00000000..087e6a61 --- /dev/null +++ b/apps/web/src/routes/admin/layout.tsx @@ -0,0 +1,123 @@ +import { AppShell } from "@/components/AppShell/AppShell"; +import { NavLink } from "@/components/AppShell/NavLink"; +import { + createFileRoute, + Outlet, + redirect, + useLocation, + useRouter, +} from "@tanstack/react-router"; +import TablerDashboard from "~icons/tabler/dashboard"; +import TablerCalendarSearch from "~icons/tabler/calendar-search"; +import TablerUsers from "~icons/tabler/users"; +import TablerListDetails from "~icons/tabler/list-details"; +import TablerSettings2 from "~icons/tabler/settings-2"; +import { Button } from "@/components/ui/Button"; + +export const Route = createFileRoute("/admin")({ + beforeLoad: async ({ context }) => { + const { user, error } = await context.userQuery.promise; + + if (!user && !user) { + console.log("You aren't authenticated, redirecting to login."); + throw redirect({ + to: "/", + search: { redirect: location.pathname }, + }); + } + + if (error) { + // TODO: Display a friendly error to the user? + console.error("Auth error in beforeLoad in layout.tsx:", error); + console.log( + "authentication error occurred while accessing protected page, redirecting to login.", + ); + throw redirect({ + to: "/", + search: { redirect: location.pathname }, + }); + } + + // If not superuser + if (user.role !== "superuser") { + console.log("You aren't a superuser, redirecting to event portal."); + throw redirect({ + to: "/portal", + }); + } + + if (location.pathname === "/admin") { + throw redirect({ to: "/admin/overview" }); + } + }, + component: RouteComponent, +}); + +function RouteComponent() { + const pathname = useLocation({ select: (loc) => loc.pathname }); + const router = useRouter(); + + return ( + + +
+

Admin Portal

+ +
+ + +
+
+
+ + + } + active={pathname.startsWith("/admin/overview")} + /> + + } + active={pathname.startsWith("/admin/events-management")} + /> + + } + active={pathname.startsWith("/admin/users-management")} + /> + + } + active={pathname.startsWith("/admin/logs")} + /> + + } + active={pathname.startsWith("/admin/settings")} + /> + + + + + +
+ ); +} diff --git a/apps/web/src/routes/admin/logs.tsx b/apps/web/src/routes/admin/logs.tsx new file mode 100644 index 00000000..24c8d1c0 --- /dev/null +++ b/apps/web/src/routes/admin/logs.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/admin/logs")({ + component: RouteComponent, +}); + +function RouteComponent() { + return
Hello "/admin/logs"!
; +} diff --git a/apps/web/src/routes/admin/overview.tsx b/apps/web/src/routes/admin/overview.tsx new file mode 100644 index 00000000..a1254180 --- /dev/null +++ b/apps/web/src/routes/admin/overview.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/admin/overview")({ + component: RouteComponent, +}); + +function RouteComponent() { + return
Hello "/admin/overview"!
; +} diff --git a/apps/web/src/routes/admin/settings.tsx b/apps/web/src/routes/admin/settings.tsx new file mode 100644 index 00000000..2ec962bb --- /dev/null +++ b/apps/web/src/routes/admin/settings.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/admin/settings")({ + component: RouteComponent, +}); + +function RouteComponent() { + return
Hello "/admin/settings"!
; +} diff --git a/apps/web/src/routes/admin/users-management.tsx b/apps/web/src/routes/admin/users-management.tsx new file mode 100644 index 00000000..cefda7e9 --- /dev/null +++ b/apps/web/src/routes/admin/users-management.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/admin/users-management")({ + component: RouteComponent, +}); + +function RouteComponent() { + return
Hello "/admin/users-management"!
; +} diff --git a/apps/web/src/routes/events/$eventId/index.tsx b/apps/web/src/routes/events/$eventId/index.tsx new file mode 100644 index 00000000..70fad662 --- /dev/null +++ b/apps/web/src/routes/events/$eventId/index.tsx @@ -0,0 +1,11 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/events/$eventId/")({ + component: RouteComponent, +}); + +function RouteComponent() { + const { eventId } = Route.useParams(); + + return
This is the info page for {eventId}
; +} diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx index 8ed251dd..a2fda4cd 100644 --- a/apps/web/src/routes/index.tsx +++ b/apps/web/src/routes/index.tsx @@ -12,9 +12,9 @@ export const Route = createFileRoute("/")({ console.log("Loaded user in beforeLoad:", user); if (user) { - console.log("User is already authenticated, redirecting to dashboard."); + console.log("User is already authenticated, redirecting to portal."); throw redirect({ - to: "/dashboard", + to: "/portal", }); } },