|
|
@@ -1,13 +1,14 @@ |
|
|
"use client"; |
|
|
"use client"; |
|
|
|
|
|
|
|
|
import { useSession } from "next-auth/react"; |
|
|
|
|
|
|
|
|
import { getSession } from "next-auth/react"; |
|
|
import { useSearchParams } from "next/navigation"; |
|
|
import { useSearchParams } from "next/navigation"; |
|
|
import { useRouter } from "next/navigation"; |
|
|
import { useRouter } from "next/navigation"; |
|
|
import { useEffect, type ReactNode } from "react"; |
|
|
|
|
|
|
|
|
import { useEffect, useState, type ReactNode } from "react"; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Client-side only: redirect to "/" when user is authenticated and this page |
|
|
* Client-side only: redirect to "/" when user is authenticated and this page |
|
|
* was not opened after a 401 (session=expired). Relies on useSearchParams() so |
|
|
|
|
|
|
|
|
* was not opened after a 401 (session=expired). Uses getSession() so it works |
|
|
|
|
|
* without SessionProvider (login page is outside (main)). useSearchParams() so |
|
|
* it works in production where server searchParams can be undefined. |
|
|
* it works in production where server searchParams can be undefined. |
|
|
*/ |
|
|
*/ |
|
|
export default function LoginRedirectIfAuthenticated({ |
|
|
export default function LoginRedirectIfAuthenticated({ |
|
|
@@ -15,17 +16,26 @@ export default function LoginRedirectIfAuthenticated({ |
|
|
}: { |
|
|
}: { |
|
|
children: ReactNode; |
|
|
children: ReactNode; |
|
|
}) { |
|
|
}) { |
|
|
const { status } = useSession(); |
|
|
|
|
|
const searchParams = useSearchParams(); |
|
|
const searchParams = useSearchParams(); |
|
|
const router = useRouter(); |
|
|
const router = useRouter(); |
|
|
|
|
|
const [checked, setChecked] = useState(false); |
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
useEffect(() => { |
|
|
if (status !== "authenticated") return; |
|
|
|
|
|
const sessionExpired = searchParams.get("session") === "expired"; |
|
|
|
|
|
if (!sessionExpired) { |
|
|
|
|
|
router.replace("/"); |
|
|
|
|
|
} |
|
|
|
|
|
}, [status, searchParams, router]); |
|
|
|
|
|
|
|
|
let cancelled = false; |
|
|
|
|
|
getSession().then((session) => { |
|
|
|
|
|
if (cancelled) return; |
|
|
|
|
|
setChecked(true); |
|
|
|
|
|
if (!session) return; |
|
|
|
|
|
const sessionExpired = searchParams.get("session") === "expired"; |
|
|
|
|
|
if (!sessionExpired) { |
|
|
|
|
|
router.replace("/"); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
return () => { |
|
|
|
|
|
cancelled = true; |
|
|
|
|
|
}; |
|
|
|
|
|
}, [searchParams, router]); |
|
|
|
|
|
|
|
|
|
|
|
if (!checked) return <>{children}</>; |
|
|
return <>{children}</>; |
|
|
return <>{children}</>; |
|
|
} |
|
|
} |