diff --git a/src/app/admin/[type]/page.js b/src/app/admin/[type]/page.js index 82dec4c2b..35f74757e 100644 --- a/src/app/admin/[type]/page.js +++ b/src/app/admin/[type]/page.js @@ -1,4 +1,3 @@ -"use client"; import ProtectedPage from "@/components/ProtectedPage"; import Admins from "@/components/admin/dashboards/Admins"; import Events from "@/components/admin/services/calendar"; diff --git a/src/components/ProtectedPage.jsx b/src/components/ProtectedPage.jsx index 0d9b51b19..7fcfefeb9 100644 --- a/src/components/ProtectedPage.jsx +++ b/src/components/ProtectedPage.jsx @@ -1,67 +1,50 @@ -"use client"; -import { useEffect, useState } from "react"; -import { signIn, useSession } from "next-auth/react"; -import Loading from "@/components/Loading"; -import { usePathname } from "next/navigation"; import RELEASES from "@/data/Releases"; import Fault from "@/utils/error"; import Navigation from "@/components/Navigation"; +import { headers } from "next/headers"; +import { getSession } from "@/utils/auth"; +import SignIn from "./SignIn"; + +const ProtectedPage = async ({ children, restrictions, title }) => { + const session = await getSession(); + const header = headers(); + const pathName = header.get("x-url") || ""; + + if (!session) { + return ; + } + + if (RELEASES[pathName] > new Date()) { + throw new Fault( + 423, + "Locked Resource", + "This resource has not been released", + ); + } -const ProtectedPage = ({ children, restrictions, title }) => { - const { data: session, status } = useSession(); - const [confirmed, setConfirmed] = useState(false); - - const pathName = usePathname(); - - useEffect(() => { - if (RELEASES[pathName] > new Date()) { - throw new Fault( - 423, - "Locked Resource", - "This resource has not been released", - ); - } - - if (status === "loading") return; - if (status !== "authenticated") { - void signIn("google"); - return; - } - - if (!session.user.roles && Object.keys(restrictions).length > 0) { - throw new Fault( - 403, - "Unauthorized", - "You do not have any assigned roles", - ); - } + if (!session.user.roles && Object.keys(restrictions).length > 0) { + throw new Fault(403, "Unauthorized", "You do not have any assigned roles"); + } - const authorized = Object.entries(restrictions).some(([key, values]) => - Array.isArray(values) - ? values.includes(session.user.roles[key]) - : session.user.roles[key] === values, - ); + const authorized = Object.entries(restrictions).some(([key, values]) => + Array.isArray(values) + ? values.includes(session.user.roles[key]) + : session.user.roles[key] === values, + ); - if (!authorized && Object.keys(restrictions).length > 0) { - throw new Fault(403, "Unauthorized", "You do not have access this page"); - } - setConfirmed(true); - }, [status]); + if (!authorized && Object.keys(restrictions).length > 0) { + throw new Fault(403, "Unauthorized", "You do not have access this page"); + } const navigation = RegExp(/user\/|admin\//).test(pathName); return ( <> - {status === "loading" && } - {confirmed && ( - <> - {title} - {navigation && } -
-
{children}
-
- - )} + {title} + {navigation && } +
+
{children}
+
); }; diff --git a/src/components/SignIn.tsx b/src/components/SignIn.tsx new file mode 100644 index 000000000..f36a3632b --- /dev/null +++ b/src/components/SignIn.tsx @@ -0,0 +1,11 @@ +"use client"; +import { signIn } from "next-auth/react"; + +interface props { + callback: string; +} + +const SignIn = ({ callback }: props) => + void signIn("google", { callbackUrl: callback }); + +export default SignIn; diff --git a/src/components/admin/services/timer/Timer.tsx b/src/components/admin/services/timer/Timer.tsx index 16106ef6c..6b3c59f74 100644 --- a/src/components/admin/services/timer/Timer.tsx +++ b/src/components/admin/services/timer/Timer.tsx @@ -1,3 +1,4 @@ +"use client"; import { useState } from "react"; import Clock from "./Clock"; import { v4 as uuidv4 } from "uuid"; diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 000000000..919c75e6d --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,13 @@ +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; + +export function middleware(request: NextRequest) { + const requestHeaders = new Headers(request.headers); + requestHeaders.set("x-url", request.nextUrl.pathname); + + return NextResponse.next({ + request: { + headers: requestHeaders, + }, + }); +}