Spaces:
Runtime error
Runtime error
| import { useRouter } from "next/router"; | |
| import type { Session } from "next-auth"; | |
| import { signIn, signOut, useSession } from "next-auth/react"; | |
| import { useEffect } from "react"; | |
| type Provider = "google" | "github" | "discord"; | |
| interface Auth { | |
| signIn: (provider?: Provider) => Promise<void>; | |
| signOut: () => Promise<void>; | |
| status: "authenticated" | "unauthenticated" | "loading"; | |
| session: Session | null; | |
| } | |
| interface UseAuthOptions { | |
| protectedRoute?: boolean; | |
| isAllowed?: (user: Session) => boolean; | |
| } | |
| export function useAuth( | |
| { protectedRoute, isAllowed }: UseAuthOptions = { protectedRoute: false, isAllowed: () => true } | |
| ): Auth { | |
| const { data: session, status } = useSession(); | |
| const { push } = useRouter(); | |
| useEffect(() => { | |
| if (protectedRoute && status === "unauthenticated") { | |
| handleSignIn().catch(console.error); | |
| } | |
| if (protectedRoute && status === "authenticated" && isAllowed && !isAllowed(session)) { | |
| void push("/404").catch(console.error); | |
| } | |
| }, [protectedRoute, isAllowed, status, session, push]); | |
| const handleSignIn = async () => { | |
| await signIn(); | |
| }; | |
| const handleSignOut = async () => { | |
| await signOut({ | |
| callbackUrl: "/", | |
| }).catch(); | |
| }; | |
| return { | |
| signIn: handleSignIn, | |
| signOut: handleSignOut, | |
| status, | |
| session, | |
| }; | |
| } | |