|
|
@@ -1,16 +1,30 @@
|
|
|
'use client'
|
|
|
|
|
|
import Link from 'next/link'
|
|
|
-import { usePathname } from 'next/navigation'
|
|
|
-
|
|
|
-/**
|
|
|
- * Layout панели администратора. Отображает боковую панель
|
|
|
- * с навигацией по разделам: модерация, пользователи, теги.
|
|
|
- * Подсвечивает активный пункт меню.
|
|
|
- * @param children - Контент текущей страницы админки
|
|
|
- */
|
|
|
+import { usePathname, useRouter } from 'next/navigation'
|
|
|
+import { useEffect } from 'react'
|
|
|
+import { useAuth } from '@/hooks/useAuth'
|
|
|
+
|
|
|
+const ALLOWED_ROLES = ['moderator', 'superadmin']
|
|
|
+
|
|
|
export default function AdminLayout({ children }: { children: React.ReactNode }) {
|
|
|
const pathname = usePathname()
|
|
|
+ const router = useRouter()
|
|
|
+ const { user, isLoading } = useAuth()
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (!isLoading && (!user || !ALLOWED_ROLES.includes(user.role))) {
|
|
|
+ router.replace('/')
|
|
|
+ }
|
|
|
+ }, [user, isLoading, router])
|
|
|
+
|
|
|
+ if (isLoading || !user || !ALLOWED_ROLES.includes(user.role)) {
|
|
|
+ return (
|
|
|
+ <div className="flex min-h-screen items-center justify-center bg-[#0f172a]">
|
|
|
+ <p className="text-white/40">Загрузка...</p>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
|
|
|
const navItems = [
|
|
|
{ href: '/admin', label: 'Модерация', icon: '📋' },
|