import { Session, User } from "@supabase/supabase-js";
import { useContext, useState, useEffect, createContext } from "react";
import supabaseClient from "@/utils/supabase";
import { useRouter } from "@tanstack/react-router";
export interface IAuthContext {
session: Session | null;
user: User | null;
signOut: () => void;
}
// create a context for authentication
const AuthContext = createContext<{
session: Session | null | undefined;
user: User | null | undefined;
signOut: () => void;
}>({ session: null, user: null, signOut: () => {} });
export const AuthProvider = ({ children }: any) => {
const [user, setUser] = useState<User>();
const [session, setSession] = useState<Session | null>();
const [loading, setLoading] = useState(true);
const router = useRouter();
useEffect(() => {
const setData = async () => {
const {
data: { session },
error,
} = await supabaseClient.auth.getSession();
if (error) throw error;
setSession(session);
setUser(session?.user);
setLoading(false);
};
const { data: listener } = supabaseClient.auth.onAuthStateChange(
(_event, session) => {
setSession(session);
setUser(session?.user);
setLoading(false);
// invalidate fails because it's not inside Router Provider
router.invalidate()
}
);
setData();
return () => {
listener?.subscription.unsubscribe();
};
}, []);
const value = {
session,
user,
signOut: () => supabaseClient.auth.signOut(),
};
// use a provider to pass down the value
return (
<AuthContext.Provider value={value}>
{!loading && children}
</AuthContext.Provider>
);
};
// export the useAuth hook
export const useAuth = () => {
return useContext(AuthContext);
};
import { Session, User } from "@supabase/supabase-js";
import { useContext, useState, useEffect, createContext } from "react";
import supabaseClient from "@/utils/supabase";
import { useRouter } from "@tanstack/react-router";
export interface IAuthContext {
session: Session | null;
user: User | null;
signOut: () => void;
}
// create a context for authentication
const AuthContext = createContext<{
session: Session | null | undefined;
user: User | null | undefined;
signOut: () => void;
}>({ session: null, user: null, signOut: () => {} });
export const AuthProvider = ({ children }: any) => {
const [user, setUser] = useState<User>();
const [session, setSession] = useState<Session | null>();
const [loading, setLoading] = useState(true);
const router = useRouter();
useEffect(() => {
const setData = async () => {
const {
data: { session },
error,
} = await supabaseClient.auth.getSession();
if (error) throw error;
setSession(session);
setUser(session?.user);
setLoading(false);
};
const { data: listener } = supabaseClient.auth.onAuthStateChange(
(_event, session) => {
setSession(session);
setUser(session?.user);
setLoading(false);
// invalidate fails because it's not inside Router Provider
router.invalidate()
}
);
setData();
return () => {
listener?.subscription.unsubscribe();
};
}, []);
const value = {
session,
user,
signOut: () => supabaseClient.auth.signOut(),
};
// use a provider to pass down the value
return (
<AuthContext.Provider value={value}>
{!loading && children}
</AuthContext.Provider>
);
};
// export the useAuth hook
export const useAuth = () => {
return useContext(AuthContext);
};