Исправления авторизации
This commit is contained in:
parent
977b0ec5e3
commit
0d958371e8
@ -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 {
|
console.log('AuthProvider: Загрузка профиля пользователя:', userId);
|
||||||
const { data: { session }, error: sessionError } = await supabase.auth.getSession();
|
const { data: profile, error: profileError } = await supabase
|
||||||
if (sessionError) throw sessionError;
|
.from('users')
|
||||||
|
.select('*')
|
||||||
|
.eq('id', userId)
|
||||||
|
.single();
|
||||||
|
|
||||||
if (session?.user) {
|
if (profileError) {
|
||||||
setCurrentUser(session.user);
|
if (profileError.code === 'PGRST116') {
|
||||||
// Загружаем профиль пользователя
|
// Если профиль не найден, создаем новый
|
||||||
const { data: profile, error: profileError } = await supabase
|
console.log('AuthProvider: Профиль не найден, создаем новый');
|
||||||
|
const { data: newProfile, error: createError } = await supabase
|
||||||
.from('users')
|
.from('users')
|
||||||
.select('*')
|
.insert([
|
||||||
.eq('id', session.user.id)
|
{
|
||||||
|
id: userId,
|
||||||
|
username: `user_${userId.slice(0, 8)}`,
|
||||||
|
role: 'user'
|
||||||
|
}
|
||||||
|
])
|
||||||
|
.select()
|
||||||
.single();
|
.single();
|
||||||
|
|
||||||
if (profileError) throw profileError;
|
if (createError) throw createError;
|
||||||
setUserProfile(profile);
|
console.log('AuthProvider: Новый профиль создан:', newProfile);
|
||||||
|
setUserProfile(newProfile);
|
||||||
|
} else {
|
||||||
|
throw profileError;
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} else {
|
||||||
console.error('Error checking session:', err);
|
console.log('AuthProvider: Профиль загружен:', profile);
|
||||||
setError('Ошибка проверки сессии');
|
setUserProfile(profile);
|
||||||
} finally {
|
|
||||||
setLoading(false);
|
|
||||||
}
|
}
|
||||||
};
|
} 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 });
|
||||||
|
|
||||||
// Подписываемся на изменения состояния авторизации
|
if (sessionError) throw sessionError;
|
||||||
const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => {
|
|
||||||
if (event === 'SIGNED_IN' && session?.user) {
|
if (session?.user) {
|
||||||
|
console.log('AuthProvider: Пользователь найден в сессии');
|
||||||
setCurrentUser(session.user);
|
setCurrentUser(session.user);
|
||||||
try {
|
await loadUserProfile(session.user.id);
|
||||||
const { data: profile, error: profileError } = await supabase
|
} else {
|
||||||
.from('users')
|
console.log('AuthProvider: Пользователь не найден в сессии');
|
||||||
.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') {
|
|
||||||
setCurrentUser(null);
|
setCurrentUser(null);
|
||||||
setUserProfile(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 () => {
|
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>
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user