import React, { useState } from "react"; import { useOrganization } from "../hooks/useOrganization"; export const OrganizationMembers = () => { const { members, isLoading, updateMemberRole, removeMember, addMember } = useOrganization(); const [showAddModal, setShowAddModal] = useState(false); const [newMemberEmail, setNewMemberEmail] = useState(""); const [newMemberRole, setNewMemberRole] = useState<"admin" | "member">( "member", ); const [actionLoading, setActionLoading] = useState(null); const handleRoleChange = async (userId: number, newRole: string) => { setActionLoading(userId); await updateMemberRole(userId, newRole); setActionLoading(null); }; const handleRemoveMember = async (userId: number, memberName: string) => { if ( confirm( `Вы уверены, что хотите удалить пользователя "${memberName}" из организации?`, ) ) { setActionLoading(userId); await removeMember(userId); setActionLoading(null); } }; const handleAddMember = async (e: React.FormEvent) => { e.preventDefault(); const success = await addMember(newMemberEmail, newMemberRole); if (success) { setShowAddModal(false); setNewMemberEmail(""); setNewMemberRole("member"); } }; const getRoleLabel = (role: string) => { switch (role) { case "owner": return "Владелец"; case "admin": return "Администратор"; case "member": return "Участник"; default: return role; } }; const getRoleColor = (role: string) => { switch (role) { case "owner": return "text-yellow-600 dark:text-yellow-400"; case "admin": return "text-blue-600 dark:text-blue-400"; case "member": return "text-green-600 dark:text-green-400"; default: return ""; } }; if (isLoading && members.length === 0) { return (
Загрузка участников...
); } return (

Участники организации

{members.map((member) => ( ))}
Имя Email Роль Действия
{member.first_name} {member.last_name}
@{member.username}
{member.email} {member.role === "owner" ? ( {getRoleLabel(member.role)} ) : ( )} {member.role !== "owner" && ( )}
{members.length === 0 && !isLoading && (
В организации пока нет участников
)} {showAddModal && (

Добавить участника

setNewMemberEmail(e.target.value)} className="w-full px-4 py-2 rounded-lg border focus:outline-none focus:ring-2" style={{ backgroundColor: "var(--input-bg)", color: "var(--text-primary)", borderColor: "var(--border)", "--tw-ring-color": "var(--accent)", }} required placeholder="user@example.com" />
)}
); };