File size: 2,624 Bytes
81ff144
 
 
 
ad68e43
81ff144
 
 
 
ad68e43
81ff144
 
ad68e43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81ff144
 
 
 
 
ad68e43
81ff144
 
 
 
 
 
ad68e43
81ff144
 
 
 
 
 
 
 
 
 
 
 
ad68e43
81ff144
 
 
 
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import React, { useEffect, useState } from 'react';
import { supabase } from '../services/supabase';
import type { Session, User } from '@supabase/supabase-js';
import { AuthContext } from './authContextValue';
import type { UserProfile } from './authContextValue';

export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
  const [session, setSession] = useState<Session | null>(null);
  const [user, setUser] = useState<User | null>(null);
  const [profile, setProfile] = useState<UserProfile | null>(null);
  const [loading, setLoading] = useState(true);

  const ensureProfile = async (currentUser: User | null) => {
    if (!currentUser) {
      setProfile(null);
      return;
    }

    const fallbackProfile: UserProfile = {
      id: currentUser.id,
      role: 'user',
      full_name: currentUser.user_metadata?.full_name ?? currentUser.user_metadata?.name ?? null,
      avatar_url: currentUser.user_metadata?.avatar_url ?? null,
    };

    const { data: existingProfile, error: selectError } = await supabase
      .from('profiles')
      .select('id,role,full_name,avatar_url')
      .eq('id', currentUser.id)
      .maybeSingle();

    if (selectError && selectError.code !== 'PGRST116') {
      setProfile(fallbackProfile);
      return;
    }

    if (existingProfile) {
      setProfile(existingProfile);
      return;
    }

    const { data: insertedProfile, error: insertError } = await supabase
      .from('profiles')
      .upsert(fallbackProfile, { onConflict: 'id' })
      .select('id,role,full_name,avatar_url')
      .single();

    if (insertError) {
      setProfile(fallbackProfile);
      return;
    }

    setProfile(insertedProfile);
  };

  const refreshProfile = async () => {
    await ensureProfile(user);
  };

  useEffect(() => {
    // Get initial session
    supabase.auth.getSession().then(({ data: { session } }) => {
      setSession(session);
      setUser(session?.user ?? null);
      ensureProfile(session?.user ?? null).finally(() => setLoading(false));
    });

    // Listen for changes
    const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => {
      setSession(session);
      setUser(session?.user ?? null);
      ensureProfile(session?.user ?? null).finally(() => setLoading(false));
    });

    return () => {
      subscription.unsubscribe();
    };
  }, []);

  const signOut = async () => {
    await supabase.auth.signOut();
  };

  return (
    <AuthContext.Provider value={{ session, user, profile, loading, signOut, refreshProfile }}>
      {children}
    </AuthContext.Provider>
  );
};