import { useState } from 'react' import { ShellTopbar } from '@/components/layout/ShellTopbar' import { AppFooter } from '@/components/layout/AppFooter' import { AdminConferencesTab } from '@/components/admin/AdminConferencesTab' import { AdminUsersTab } from '@/components/admin/AdminUsersTab' import { AdminTeamsTab } from '@/components/admin/AdminTeamsTab' import { AdminSettingsTab } from '@/components/admin/AdminSettingsTab' import '@/styles/lobby.css' import '@/styles/calendar.css' import '@/styles/admin.css' type AdminTab = 'conferences' | 'users' | 'teams' | 'settings' const TABS: { value: AdminTab; label: string }[] = [ { value: 'conferences', label: 'Конференции' }, { value: 'users', label: 'Пользователи' }, { value: 'teams', label: 'Команды' }, { value: 'settings', label: 'Настройки' }, ] /** * Администрирование VidConf: управление конференциями, доступом * пользователей и настройками инстанса. Доступ ограничен ролью `admin` * (route-guard — см. `RequireAdmin` в App.tsx). * * Вкладки «Команды» и «Настройки» отсутствуют в макете * `design/mockups/admin.html` — реализованы по общему паттерну * `section-tab`/`table-card`/`toolbar-row` того же макета и DESIGN_SYSTEM.md. */ export function AdminPage() { const [tab, setTab] = useState('conferences') return (

Администрирование

Управление конференциями, доступом и пользователями VidConf

{TABS.map((t) => ( ))}
{tab === 'conferences' && } {tab === 'users' && } {tab === 'teams' && } {tab === 'settings' && }
) }