"use client"; // ============================================================================ // Workspace Members Page // ============================================================================ import { useEffect, useState } from "react"; import { useParams } from "next/navigation"; import { Loader2, Users, Shield, ChevronDown } from "lucide-react"; import { DashboardHeader } from "@/components/layout/dashboard-header"; import { membersApi } from "@/lib/api"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuCheckboxItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import type { WorkspaceMember, PermissionKey } from "@/lib/types/api"; // ============================================================================ // Constants // ============================================================================ const PERMISSION_LABELS: Record = { admin_full: "Полный доступ", projects_read: "Просмотр проектов", projects_write: "Редактирование проектов", placements_read: "Просмотр размещений", placements_write: "Редактирование размещений", analytics_read: "Просмотр аналитики", }; const ALL_PERMISSIONS: PermissionKey[] = [ "admin_full", "projects_read", "projects_write", "placements_read", "placements_write", "analytics_read", ]; // ============================================================================ // Component // ============================================================================ export default function MembersPage() { const params = useParams(); const workspaceId = params?.workspaceId as string; const [members, setMembers] = useState([]); const [loading, setLoading] = useState(true); const [updating, setUpdating] = useState(null); useEffect(() => { const loadMembers = async () => { try { setLoading(true); const response = await membersApi.list(workspaceId, { size: 100 }); setMembers(response.items); } catch (err) { console.error("Failed to load members:", err); } finally { setLoading(false); } }; loadMembers(); }, [workspaceId]); const handlePermissionChange = async ( memberId: string, userId: string, permission: PermissionKey, enabled: boolean ) => { try { setUpdating(memberId); const member = members.find((m) => m.id === memberId); if (!member) return; let newPermissions = [...member.permissions]; if (enabled) { // Add permission if (!newPermissions.some((p) => p.key === permission)) { newPermissions.push({ key: permission }); } } else { // Remove permission newPermissions = newPermissions.filter((p) => p.key !== permission); } await membersApi.updatePermissions(workspaceId, userId, { permissions: newPermissions, }); // Update local state setMembers((prev) => prev.map((m) => m.id === memberId ? { ...m, permissions: newPermissions } : m ) ); } catch (err) { console.error("Failed to update permissions:", err); } finally { setUpdating(null); } }; const hasPermission = (member: WorkspaceMember, key: PermissionKey) => { return member.permissions.some((p) => p.key === key); }; return ( <>

Участники

Управление участниками и правами доступа

{loading ? (
) : members.length === 0 ? (

Нет участников

Пригласите участников в воркспейс

) : ( Пользователь Статус Права доступа {members.map((member) => (
{member.user.username || `User ${member.user.telegram_id}`}
{member.user.username && (
@{member.user.username}
)}
{member.status === "active" ? "Активен" : "Приглашён"}
{hasPermission(member, "admin_full") ? ( Админ ) : ( member.permissions.map((p) => ( {PERMISSION_LABELS[p.key]} )) )} {member.permissions.length === 0 && ( Нет прав )}
Права доступа {ALL_PERMISSIONS.map((perm) => ( handlePermissionChange( member.id, member.user.id, perm, checked ) } > {PERMISSION_LABELS[perm]} ))}
))}
)}
); }