Spaces:
Runtime error
Runtime error
File size: 1,332 Bytes
cd6f98e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
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,
};
}
|