Files
alva/src/hooks/useAuth.ts
T
gpt-engineer-app[bot] 2ea67737c3 Changes
2026-01-27 23:05:30 +00:00

79 lines
1.9 KiB
TypeScript

import { useState, useEffect } from "react";
import { User, Session } from "@supabase/supabase-js";
import { supabase } from "@/integrations/supabase/client";
export function useAuth() {
const [user, setUser] = useState<User | null>(null);
const [session, setSession] = useState<Session | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
// Set up auth state listener BEFORE getting session
const { data: { subscription } } = supabase.auth.onAuthStateChange(
(_event, session) => {
setSession(session);
setUser(session?.user ?? null);
setLoading(false);
}
);
// Get initial session
supabase.auth.getSession().then(({ data: { session } }) => {
setSession(session);
setUser(session?.user ?? null);
setLoading(false);
});
return () => subscription.unsubscribe();
}, []);
const signUp = async (email: string, password: string) => {
const { error } = await supabase.auth.signUp({
email,
password,
options: {
emailRedirectTo: window.location.origin,
},
});
return { error };
};
const signIn = async (email: string, password: string) => {
const { error } = await supabase.auth.signInWithPassword({
email,
password,
});
return { error };
};
const signOut = async () => {
const { error } = await supabase.auth.signOut();
return { error };
};
const resetPassword = async (email: string) => {
const { error } = await supabase.auth.resetPasswordForEmail(email, {
redirectTo: `${window.location.origin}/reset-password`,
});
return { error };
};
const updatePassword = async (newPassword: string) => {
const { error } = await supabase.auth.updateUser({
password: newPassword,
});
return { error };
};
return {
user,
session,
loading,
signUp,
signIn,
signOut,
resetPassword,
updatePassword,
};
}