Files
core/panel/ui/ProtectedRoute.tsx

57 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-07-25 12:27:04 +03:00
import { createEffect, Show } from 'solid-js'
2025-07-02 22:30:21 +03:00
import { useAuth } from '../context/auth'
import { DataProvider } from '../context/data'
import { TableSortProvider } from '../context/sort'
import AdminPage from '../routes/admin'
/**
* Компонент защищенного маршрута
*/
export const ProtectedRoute = () => {
const auth = useAuth()
2025-07-25 12:26:31 +03:00
createEffect(() => {
if (auth.isReady() && !auth.isAuthenticated()) {
window.location.href = '/login'
}
})
2025-07-25 09:42:43 +03:00
2025-07-02 22:30:21 +03:00
return (
2025-07-25 12:26:31 +03:00
<Show
when={auth.isReady()}
fallback={
<div class="loading-screen">
<div class="loading-spinner" />
<div>Инициализация авторизации...</div>
</div>
}
>
<Show
when={auth.isAuthenticated()}
fallback={
2025-09-29 15:54:22 +03:00
<div class="auth-error-screen">
<div class="auth-error-content">
<h2>Доступ запрещен</h2>
<p>У вас нет прав доступа к админ-панели или ваша сессия истекла.</p>
<div class="auth-error-actions">
<button class="btn btn-primary" onClick={() => (window.location.href = '/login')}>
Войти в аккаунт
</button>
<button class="btn btn-secondary" onClick={() => auth.logout()}>
Выйти из текущего аккаунта
</button>
</div>
</div>
2025-07-25 12:26:31 +03:00
</div>
}
>
<DataProvider>
<TableSortProvider>
<AdminPage apiUrl={`${location.origin}/graphql`} />
</TableSortProvider>
</DataProvider>
</Show>
</Show>
2025-07-02 22:30:21 +03:00
)
}