Исправления авторизации
This commit is contained in:
parent
977b0ec5e3
commit
0d958371e8
@ -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>;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user