diff --git a/src/contexts/AuthContext.jsx b/src/contexts/AuthContext.jsx index e0581a2..b15b766 100644 --- a/src/contexts/AuthContext.jsx +++ b/src/contexts/AuthContext.jsx @@ -29,116 +29,156 @@ export const AuthProvider = ({ children }) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); - useEffect(() => { - // Проверяем текущую сессию при загрузке - const checkSession = async () => { - try { - const { data: { session }, error: sessionError } = await supabase.auth.getSession(); - if (sessionError) throw sessionError; + // Функция для загрузки профиля пользователя + const loadUserProfile = async (userId) => { + try { + console.log('AuthProvider: Загрузка профиля пользователя:', userId); + const { data: profile, error: profileError } = await supabase + .from('users') + .select('*') + .eq('id', userId) + .single(); - if (session?.user) { - setCurrentUser(session.user); - // Загружаем профиль пользователя - const { data: profile, error: profileError } = await supabase + if (profileError) { + if (profileError.code === 'PGRST116') { + // Если профиль не найден, создаем новый + console.log('AuthProvider: Профиль не найден, создаем новый'); + const { data: newProfile, error: createError } = await supabase .from('users') - .select('*') - .eq('id', session.user.id) + .insert([ + { + id: userId, + username: `user_${userId.slice(0, 8)}`, + role: 'user' + } + ]) + .select() .single(); - - if (profileError) throw profileError; - setUserProfile(profile); + + if (createError) throw createError; + console.log('AuthProvider: Новый профиль создан:', newProfile); + setUserProfile(newProfile); + } else { + throw profileError; } - } catch (err) { - console.error('Error checking session:', err); - setError('Ошибка проверки сессии'); - } finally { - setLoading(false); + } else { + console.log('AuthProvider: Профиль загружен:', profile); + setUserProfile(profile); } - }; + } catch (error) { + console.error('AuthProvider: Ошибка загрузки профиля:', error); + setError(error.message); + } + }; - checkSession(); + // Проверка сессии при загрузке + const checkSession = async () => { + try { + console.log('AuthProvider: Проверка сессии...'); + const { data: { session }, error: sessionError } = await supabase.auth.getSession(); + console.log('AuthProvider: Результат проверки сессии:', { session, error: sessionError }); - // Подписываемся на изменения состояния авторизации - const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => { - if (event === 'SIGNED_IN' && session?.user) { + if (sessionError) throw sessionError; + + if (session?.user) { + console.log('AuthProvider: Пользователь найден в сессии'); setCurrentUser(session.user); - try { - const { data: profile, error: profileError } = await supabase - .from('users') - .select('*') - .eq('id', session.user.id) - .single(); - - if (profileError) throw profileError; - setUserProfile(profile); - } catch (err) { - console.error('Error loading user profile:', err); - setError('Ошибка загрузки профиля'); - } - } else if (event === 'SIGNED_OUT') { + await loadUserProfile(session.user.id); + } else { + console.log('AuthProvider: Пользователь не найден в сессии'); setCurrentUser(null); setUserProfile(null); } + } catch (error) { + console.error('AuthProvider: Ошибка проверки сессии:', error); + setError(error.message); + setCurrentUser(null); + setUserProfile(null); + } finally { + console.log('AuthProvider: Завершение проверки сессии'); + setLoading(false); + } + }; + + useEffect(() => { + console.log('AuthProvider: Инициализация...'); + checkSession(); + + const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => { + console.log('AuthProvider: Изменение состояния авторизации:', { event, session }); + setLoading(true); + + if (event === 'SIGNED_IN') { + console.log('AuthProvider: Пользователь вошел в систему'); + setCurrentUser(session.user); + await loadUserProfile(session.user.id); + } else if (event === 'SIGNED_OUT') { + console.log('AuthProvider: Пользователь вышел из системы'); + setCurrentUser(null); + setUserProfile(null); + } + + setLoading(false); }); return () => { + console.log('AuthProvider: Отписка от изменений состояния авторизации'); subscription.unsubscribe(); }; }, []); const signIn = async (email, password) => { try { + setLoading(true); setError(null); const { data, error } = await supabase.auth.signInWithPassword({ email, password }); - if (error) throw error; return data; - } catch (err) { - console.error('Error signing in:', err); - setError(err.message || 'Ошибка входа'); - throw err; + } catch (error) { + setError(error.message); + throw error; + } finally { + setLoading(false); } }; - const signUp = async (email, password, username) => { + const signUp = async (email, password) => { try { + setLoading(true); setError(null); const { data, error } = await supabase.auth.signUp({ email, - password, - options: { - data: { username } - } + password }); - if (error) throw error; return data; - } catch (err) { - console.error('Error signing up:', err); - setError(err.message || 'Ошибка регистрации'); - throw err; + } catch (error) { + setError(error.message); + throw error; + } finally { + setLoading(false); } }; const signOut = async () => { try { + setLoading(true); setError(null); const { error } = await supabase.auth.signOut(); if (error) throw error; - setCurrentUser(null); - setUserProfile(null); - } catch (err) { - console.error('Error signing out:', err); - setError('Ошибка при выходе'); - throw err; + } catch (error) { + setError(error.message); + throw error; + } finally { + setLoading(false); } }; const value = { - currentUser, + user: currentUser, userProfile, loading, error, @@ -147,13 +187,16 @@ export const AuthProvider = ({ children }) => { signOut }; - if (loading) { - return
Загрузка...
; + console.log('AuthProvider: Текущее состояние:', value); + + if (loading || (currentUser && !userProfile)) { + console.log('AuthProvider: Отображение состояния загрузки'); + return ( +
+
Загрузка...
+
+ ); } - return ( - - {children} - - ); + return {children}; };