This commit is contained in:
@@ -66,24 +66,33 @@ interface AuthProviderProps {
|
|||||||
|
|
||||||
export const AuthProvider: Component<AuthProviderProps> = (props) => {
|
export const AuthProvider: Component<AuthProviderProps> = (props) => {
|
||||||
console.log('[AuthProvider] Initializing...')
|
console.log('[AuthProvider] Initializing...')
|
||||||
const [isAuthenticated, setIsAuthenticated] = createSignal(checkAuthStatus())
|
// Начинаем с false чтобы избежать мерцания, реальная проверка будет в onMount
|
||||||
|
const [isAuthenticated, setIsAuthenticated] = createSignal(false)
|
||||||
const [isReady, setIsReady] = createSignal(false)
|
const [isReady, setIsReady] = createSignal(false)
|
||||||
|
|
||||||
|
// Флаг для предотвращения повторных инициализаций
|
||||||
|
let isInitializing = false
|
||||||
|
|
||||||
console.log(
|
console.log('[AuthProvider] Initial auth state: not authenticated (will check via GraphQL)')
|
||||||
`[AuthProvider] Initial auth state: ${isAuthenticated() ? 'authenticated' : 'not authenticated'}`
|
|
||||||
)
|
|
||||||
|
|
||||||
// Инициализация авторизации при монтировании
|
// Инициализация авторизации при монтировании
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
|
// Защита от повторных вызовов
|
||||||
|
if (isInitializing) {
|
||||||
|
console.log('[AuthProvider] Already initializing, skipping...')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
isInitializing = true
|
||||||
console.log('[AuthProvider] Performing auth initialization...')
|
console.log('[AuthProvider] Performing auth initialization...')
|
||||||
|
|
||||||
// 🍪 Для httpOnly cookies проверяем авторизацию через GraphQL запрос
|
// 🍪 Для httpOnly cookies проверяем авторизацию через GraphQL запрос
|
||||||
try {
|
try {
|
||||||
console.log('[AuthProvider] Checking authentication via GraphQL...')
|
console.log('[AuthProvider] Checking authentication via GraphQL...')
|
||||||
|
|
||||||
// Добавляем таймаут для запроса
|
// Добавляем таймаут для запроса (5 секунд для лучшего UX)
|
||||||
const timeoutPromise = new Promise((_, reject) =>
|
const timeoutPromise = new Promise((_, reject) =>
|
||||||
setTimeout(() => reject(new Error('Auth check timeout')), 10000)
|
setTimeout(() => reject(new Error('Auth check timeout')), 5000)
|
||||||
)
|
)
|
||||||
|
|
||||||
const authPromise = query<{ me: { id: string } | null }>(
|
const authPromise = query<{ me: { id: string } | null }>(
|
||||||
@@ -118,6 +127,7 @@ export const AuthProvider: Component<AuthProviderProps> = (props) => {
|
|||||||
// Всегда устанавливаем ready в true, даже при ошибке
|
// Всегда устанавливаем ready в true, даже при ошибке
|
||||||
console.log('[AuthProvider] Auth initialization complete, ready for requests')
|
console.log('[AuthProvider] Auth initialization complete, ready for requests')
|
||||||
setIsReady(true)
|
setIsReady(true)
|
||||||
|
isInitializing = false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -149,6 +159,10 @@ export const AuthProvider: Component<AuthProviderProps> = (props) => {
|
|||||||
|
|
||||||
const logout = async () => {
|
const logout = async () => {
|
||||||
console.log('[AuthProvider] Attempting logout...')
|
console.log('[AuthProvider] Attempting logout...')
|
||||||
|
|
||||||
|
// Предотвращаем повторные инициализации во время logout
|
||||||
|
isInitializing = true
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Сначала очищаем токены на клиенте
|
// Сначала очищаем токены на клиенте
|
||||||
clearAuthTokens()
|
clearAuthTokens()
|
||||||
@@ -174,6 +188,8 @@ export const AuthProvider: Component<AuthProviderProps> = (props) => {
|
|||||||
console.error('[AuthProvider] Logout error:', error)
|
console.error('[AuthProvider] Logout error:', error)
|
||||||
// При любой ошибке редиректим на страницу входа
|
// При любой ошибке редиректим на страницу входа
|
||||||
window.location.href = '/login'
|
window.location.href = '/login'
|
||||||
|
} finally {
|
||||||
|
isInitializing = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user