core/panel/admin.tsx
Untone 41395eb7c6
All checks were successful
Deploy on push / deploy (push) Successful in 7s
0.5.10-invites-crud
2025-06-30 22:19:46 +03:00

202 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Компонент страницы администратора
* @module AdminPage
*/
import { useNavigate, useParams } from '@solidjs/router'
import { Component, createEffect, createSignal, onMount, Show } from 'solid-js'
import publyLogo from './assets/publy.svg?url'
import { logout } from './context/auth'
// Прямой импорт компонентов вместо ленивой загрузки
import AuthorsRoute from './routes/authors'
import CollectionsRoute from './routes/collections'
import CommunitiesRoute from './routes/communities'
import EnvRoute from './routes/env'
import InvitesRoute from './routes/invites'
import ShoutsRoute from './routes/shouts'
import TopicsRoute from './routes/topics'
import styles from './styles/Admin.module.css'
import Button from './ui/Button'
/**
* Интерфейс свойств компонента AdminPage
*/
export interface AdminPageProps {
apiUrl: string
onLogout?: () => void
}
/**
* Компонент страницы администратора
*/
const AdminPage: Component<AdminPageProps> = (props) => {
console.log('[AdminPage] Initializing...')
const navigate = useNavigate()
const params = useParams()
const [error, setError] = createSignal<string | null>(null)
const [successMessage, setSuccessMessage] = createSignal<string | null>(null)
const [currentTab, setCurrentTab] = createSignal<string>('authors')
onMount(() => {
console.log('[AdminPage] Component mounted')
console.log('[AdminPage] Initial params:', params)
// Если мы на корневом пути /admin, редиректим на /admin/authors
if (!params.tab) {
navigate('/admin/authors', { replace: true })
} else {
setCurrentTab(params.tab)
}
})
// Отслеживаем изменения параметров роута
createEffect(() => {
console.log('[AdminPage] Params changed:', params)
console.log('[AdminPage] Current tab param:', params.tab)
const newTab = params.tab || 'authors'
setCurrentTab(newTab)
console.log('[AdminPage] Updated currentTab to:', newTab)
})
// Определяем активную вкладку
const activeTab = () => {
const tab = currentTab()
console.log('[AdminPage] activeTab() returning:', tab)
return tab
}
/**
* Обрабатывает выход из системы
*/
const handleLogout = async () => {
try {
await logout()
if (props.onLogout) {
props.onLogout()
}
navigate('/login')
} catch (error) {
setError(`Ошибка при выходе: ${(error as Error).message}`)
}
}
/**
* Обработчик ошибок
*/
const handleError = (error: string) => {
setError(error)
// Скрываем ошибку через 5 секунд
setTimeout(() => setError(null), 5000)
}
/**
* Обработчик успешных операций
*/
const handleSuccess = (message: string) => {
setSuccessMessage(message)
// Скрываем сообщение через 3 секунды
setTimeout(() => setSuccessMessage(null), 3000)
}
return (
<div class={styles['admin-panel']}>
<header>
<div class={styles['header-container']}>
<div class={styles['header-left']}>
<img src={publyLogo} alt="Logo" class={styles.logo} />
<h1>Панель администратора</h1>
</div>
<button class={styles['logout-button']} onClick={handleLogout}>
Выйти
</button>
</div>
<nav class={styles['admin-tabs']}>
<Button
variant={activeTab() === 'authors' ? 'primary' : 'secondary'}
onClick={() => navigate('/admin/authors')}
>
Авторы
</Button>
<Button
variant={activeTab() === 'shouts' ? 'primary' : 'secondary'}
onClick={() => navigate('/admin/shouts')}
>
Публикации
</Button>
<Button
variant={activeTab() === 'topics' ? 'primary' : 'secondary'}
onClick={() => navigate('/admin/topics')}
>
Темы
</Button>
<Button
variant={activeTab() === 'communities' ? 'primary' : 'secondary'}
onClick={() => navigate('/admin/communities')}
>
Сообщества
</Button>
<Button
variant={activeTab() === 'collections' ? 'primary' : 'secondary'}
onClick={() => navigate('/admin/collections')}
>
Коллекции
</Button>
<Button
variant={activeTab() === 'invites' ? 'primary' : 'secondary'}
onClick={() => navigate('/admin/invites')}
>
Приглашения
</Button>
<Button
variant={activeTab() === 'env' ? 'primary' : 'secondary'}
onClick={() => navigate('/admin/env')}
>
Переменные среды
</Button>
</nav>
</header>
<main>
<Show when={error()}>
<div class={styles['error-message']}>{error()}</div>
</Show>
<Show when={successMessage()}>
<div class={styles['success-message']}>{successMessage()}</div>
</Show>
{/* Используем Show компоненты для каждой вкладки */}
<Show when={activeTab() === 'authors'}>
<AuthorsRoute onError={handleError} onSuccess={handleSuccess} />
</Show>
<Show when={activeTab() === 'shouts'}>
<ShoutsRoute onError={handleError} onSuccess={handleSuccess} />
</Show>
<Show when={activeTab() === 'topics'}>
<TopicsRoute onError={handleError} onSuccess={handleSuccess} />
</Show>
<Show when={activeTab() === 'communities'}>
<CommunitiesRoute onError={handleError} onSuccess={handleSuccess} />
</Show>
<Show when={activeTab() === 'collections'}>
<CollectionsRoute onError={handleError} onSuccess={handleSuccess} />
</Show>
<Show when={activeTab() === 'invites'}>
<InvitesRoute onError={handleError} onSuccess={handleSuccess} />
</Show>
<Show when={activeTab() === 'env'}>
<EnvRoute onError={handleError} onSuccess={handleSuccess} />
</Show>
</main>
</div>
)
}
export default AdminPage