From 81a0c2c6c81a558081689115eeb5ef91251227e3 Mon Sep 17 00:00:00 2001 From: arifal Date: Thu, 21 May 2026 12:20:28 +0700 Subject: [PATCH] fix oauth google sign --- app/(public)/login/layout.tsx | 14 +++++++++++++- app/(public)/login/page.tsx | 17 ++++++++++------- app/(public)/register/layout.tsx | 14 +++++++++++++- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/app/(public)/login/layout.tsx b/app/(public)/login/layout.tsx index d4f4e98..0ede5ab 100644 --- a/app/(public)/login/layout.tsx +++ b/app/(public)/login/layout.tsx @@ -1,4 +1,7 @@ import type { Metadata } from "next"; +import { redirect } from "next/navigation"; +import { getServerSession } from "next-auth"; +import { authOptions } from "@/lib/auth"; export const metadata: Metadata = { title: "Masuk", @@ -8,6 +11,15 @@ export const metadata: Metadata = { robots: { index: false, follow: true }, }; -export default function LoginLayout({ children }: { children: React.ReactNode }) { +export default async function LoginLayout({ + children, +}: { + children: React.ReactNode; +}) { + // User yang sudah login tidak boleh mengakses halaman login lagi. + const session = await getServerSession(authOptions); + if (session?.user) { + redirect(session.user.isAdmin ? "/admin" : "/"); + } return children; } diff --git a/app/(public)/login/page.tsx b/app/(public)/login/page.tsx index dc0003e..70e448d 100644 --- a/app/(public)/login/page.tsx +++ b/app/(public)/login/page.tsx @@ -38,13 +38,16 @@ function LoginForm() { if (result?.error) { setError(result.error); } else { - const rawCallback = searchParams.get("callbackUrl"); - let next = safeInternalPath(rawCallback); - // Tanpa callbackUrl eksplisit, arahkan admin ke dashboard /admin. - if (!rawCallback) { - const session = await getSession(); - if (session?.user?.isAdmin) next = "/admin"; - } + const callbackPath = safeInternalPath(searchParams.get("callbackUrl")); + const session = await getSession(); + // Admin selalu diarahkan ke dashboard /admin setelah login — kecuali + // callbackUrl memang menuju sub-halaman admin (deep link dari /admin/...). + // callbackUrl non-admin (mis. "/" sisa dari percobaan login Google) tidak + // boleh membuat admin "nyangkut" di halaman publik. + const next = + session?.user?.isAdmin && !callbackPath.startsWith("/admin") + ? "/admin" + : callbackPath; router.push(next); router.refresh(); } diff --git a/app/(public)/register/layout.tsx b/app/(public)/register/layout.tsx index cfefd41..d84edec 100644 --- a/app/(public)/register/layout.tsx +++ b/app/(public)/register/layout.tsx @@ -1,4 +1,7 @@ import type { Metadata } from "next"; +import { redirect } from "next/navigation"; +import { getServerSession } from "next-auth"; +import { authOptions } from "@/lib/auth"; export const metadata: Metadata = { title: "Daftar Akun", @@ -7,6 +10,15 @@ export const metadata: Metadata = { alternates: { canonical: "/register" }, }; -export default function RegisterLayout({ children }: { children: React.ReactNode }) { +export default async function RegisterLayout({ + children, +}: { + children: React.ReactNode; +}) { + // User yang sudah login tidak boleh mengakses halaman daftar lagi. + const session = await getServerSession(authOptions); + if (session?.user) { + redirect(session.user.isAdmin ? "/admin" : "/"); + } return children; }