'use client'; import { useEffect, useState } from 'react'; import { Loader2, Plus, ShieldCheck } from 'lucide-react'; import { AdminShell } from '@/components/id/admin-shell'; import { useAuth } from '@/components/id/auth-provider'; import { useToast } from '@/components/id/toast-provider'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { AdminPermission, AdminRole, apiFetch } from '@/lib/api'; export default function AdminRbacPage() { const { token, user } = useAuth(); const { showToast } = useToast(); const [roles, setRoles] = useState([]); const [permissions, setPermissions] = useState([]); const [loading, setLoading] = useState(true); const [creating, setCreating] = useState(false); const [dialogOpen, setDialogOpen] = useState(false); const [form, setForm] = useState({ slug: '', name: '', description: '', permissionSlugs: [] as string[] }); useEffect(() => { if (!token || !user?.canManageRoles) return; Promise.all([ apiFetch<{ roles: AdminRole[] }>('/admin/rbac/roles', {}, token), apiFetch<{ permissions: AdminPermission[] }>('/admin/rbac/permissions', {}, token) ]) .then(([rolesResponse, permissionsResponse]) => { setRoles(rolesResponse.roles ?? []); setPermissions(permissionsResponse.permissions ?? []); }) .catch((error) => showToast(error instanceof Error ? error.message : 'Не удалось загрузить роли')) .finally(() => setLoading(false)); }, [showToast, token, user?.canManageRoles]); async function handleCreateRole() { if (!token) return; setCreating(true); try { await apiFetch('/admin/rbac/roles', { method: 'POST', body: JSON.stringify(form) }, token); showToast('Роль создана'); setDialogOpen(false); setForm({ slug: '', name: '', description: '', permissionSlugs: [] }); const response = await apiFetch<{ roles: AdminRole[] }>('/admin/rbac/roles', {}, token); setRoles(response.roles ?? []); } catch (error) { showToast(error instanceof Error ? error.message : 'Не удалось создать роль'); } finally { setCreating(false); } } if (!user?.canManageRoles) { return (

Управление ролями доступно только супер-администратору.

); } return (

Роли и права

Только супер-администратор может создавать роли и назначать их пользователям

{loading ? (
Загрузка...
) : (
{roles.map((role) => ( {role.name} {role.permissions.length} прав · {role.slug} {role.permissions.map((permission) => (
{permission.name}
{permission.slug}
))}
))}
)} Новая роль
setForm((current) => ({ ...current, slug: event.target.value }))} placeholder="slug, например support" /> setForm((current) => ({ ...current, name: event.target.value }))} placeholder="Название роли" /> setForm((current) => ({ ...current, description: event.target.value }))} placeholder="Описание" />

Права

{permissions.map((permission) => ( ))}
); }