core/panel/App.tsx

107 lines
3.3 KiB
TypeScript
Raw Normal View History

2025-05-20 22:34:02 +00:00
import { Component, Show, Suspense, createSignal, lazy, onMount, createEffect } from 'solid-js'
import { isAuthenticated, getAuthTokenFromCookie } from './auth'
2025-05-16 06:23:48 +00:00
// Ленивая загрузка компонентов
const AdminPage = lazy(() => import('./admin'))
2025-05-16 07:30:02 +00:00
const LoginPage = lazy(() => import('./login'))
2025-05-16 06:23:48 +00:00
/**
2025-05-16 07:30:02 +00:00
* Корневой компонент приложения с простой логикой отображения
2025-05-16 06:23:48 +00:00
*/
2025-05-16 07:30:02 +00:00
const App: Component = () => {
const [authenticated, setAuthenticated] = createSignal<boolean | null>(null)
const [loading, setLoading] = createSignal(true)
2025-05-20 22:34:02 +00:00
const [checkingAuth, setCheckingAuth] = createSignal(true)
2025-05-16 07:30:02 +00:00
// Проверяем авторизацию при монтировании
onMount(() => {
2025-05-20 22:34:02 +00:00
checkAuthentication()
2025-05-16 07:30:02 +00:00
})
2025-05-20 22:34:02 +00:00
// Периодическая проверка авторизации
createEffect(() => {
const authCheckInterval = setInterval(() => {
// Перепроверяем статус авторизации каждые 60 секунд
if (!checkingAuth()) {
const authed = isAuthenticated()
if (!authed && authenticated()) {
console.log('Сессия истекла, требуется повторная авторизация')
setAuthenticated(false)
}
}
}, 60000)
return () => clearInterval(authCheckInterval)
})
// Функция проверки авторизации
const checkAuthentication = async () => {
setCheckingAuth(true)
setLoading(true)
2025-05-20 22:34:02 +00:00
try {
// Проверяем состояние авторизации
const authed = isAuthenticated()
2025-05-20 22:34:02 +00:00
// Если токен есть, но он невалидный, авторизация не удалась
if (authed) {
const token = getAuthTokenFromCookie() || localStorage.getItem('auth_token')
if (!token || token.length < 10) {
setAuthenticated(false)
} else {
setAuthenticated(true)
}
} else {
setAuthenticated(false)
}
} catch (error) {
console.error('Ошибка при проверке авторизации:', error)
setAuthenticated(false)
} finally {
setLoading(false)
setCheckingAuth(false)
}
}
2025-05-16 07:30:02 +00:00
// Обработчик успешной авторизации
const handleLoginSuccess = () => {
setAuthenticated(true)
2025-05-16 06:23:48 +00:00
}
2025-05-16 07:30:02 +00:00
// Обработчик выхода из системы
const handleLogout = () => {
setAuthenticated(false)
2025-05-16 06:23:48 +00:00
}
return (
2025-05-16 07:30:02 +00:00
<div class="app-container">
<Suspense
fallback={
<div class="loading-screen">
<div class="loading-spinner" />
2025-05-20 22:34:02 +00:00
<h2>Загрузка компонентов...</h2>
2025-05-16 07:30:02 +00:00
</div>
}
>
<Show
when={!loading()}
fallback={
<div class="loading-screen">
<div class="loading-spinner" />
2025-05-20 22:34:02 +00:00
<h2>Проверка авторизации...</h2>
2025-05-16 07:30:02 +00:00
</div>
}
>
{authenticated() ? (
2025-05-20 22:34:02 +00:00
<AdminPage apiUrl={`${location.origin}/graphql`} onLogout={handleLogout} />
2025-05-16 07:30:02 +00:00
) : (
<LoginPage onLoginSuccess={handleLoginSuccess} />
)}
</Show>
2025-05-16 06:23:48 +00:00
</Suspense>
2025-05-16 07:30:02 +00:00
</div>
2025-05-16 06:23:48 +00:00
)
}
export default App