Исправления авторизации

This commit is contained in:
degradin 2025-05-07 15:20:17 +03:00
parent 977b0ec5e3
commit 0d958371e8

View File

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