useAuth.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { useEffect, useState } from 'react';
  2. import { User, Session } from '@supabase/supabase-js';
  3. import { supabase } from '@/integrations/supabase/client';
  4. export function useAuth() {
  5. const [user, setUser] = useState<User | null>(null);
  6. const [session, setSession] = useState<Session | null>(null);
  7. const [loading, setLoading] = useState(true);
  8. useEffect(() => {
  9. let isMounted = true;
  10. // Set up auth state listener
  11. const { data: { subscription } } = supabase.auth.onAuthStateChange(
  12. (event, session) => {
  13. if (isMounted) {
  14. setSession(session);
  15. setUser(session?.user ?? null);
  16. setLoading(false);
  17. }
  18. }
  19. );
  20. // Check for existing session
  21. supabase.auth.getSession().then(({ data: { session } }) => {
  22. if (isMounted) {
  23. setSession(session);
  24. setUser(session?.user ?? null);
  25. setLoading(false);
  26. }
  27. });
  28. return () => {
  29. isMounted = false;
  30. subscription.unsubscribe();
  31. };
  32. }, []);
  33. const signIn = async (email: string, password: string) => {
  34. const { error } = await supabase.auth.signInWithPassword({
  35. email,
  36. password,
  37. });
  38. return { error };
  39. };
  40. const signUp = async (email: string, password: string) => {
  41. const redirectUrl = `${window.location.origin}/`;
  42. const { error } = await supabase.auth.signUp({
  43. email,
  44. password,
  45. options: {
  46. emailRedirectTo: redirectUrl
  47. }
  48. });
  49. return { error };
  50. };
  51. const signOut = async () => {
  52. const { error } = await supabase.auth.signOut();
  53. return { error };
  54. };
  55. return {
  56. user,
  57. session,
  58. loading,
  59. signIn,
  60. signUp,
  61. signOut,
  62. };
  63. }