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

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 [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 <div className="flex justify-center items-center h-screen">Загрузка...</div>;
console.log('AuthProvider: Текущее состояние:', value);
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 (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
);
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};