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