import React, { useState, useEffect } from "react"; import { Users, Edit, Trash2, UserCheck, UserX, Search, RefreshCw, Shield, Plus, X, } from "lucide-react"; import toast from "react-hot-toast"; import adminUserService, { FullUserInfo, UpdateUserData, UserRole, } from "../services/adminUserService"; const GerenciarUsuarios: React.FC = () => { const [usuarios, setUsuarios] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const [editingUser, setEditingUser] = useState(null); const [editForm, setEditForm] = useState({}); const [managingRolesUser, setManagingRolesUser] = useState(null); const [userRoles, setUserRoles] = useState([]); const [newRole, setNewRole] = useState(""); const [showCreateModal, setShowCreateModal] = useState(false); const [createForm, setCreateForm] = useState({ email: "", password: "", full_name: "", phone_mobile: "", cpf: "", role: "", create_patient_record: false, usePassword: true, }); useEffect(() => { carregarUsuarios(); }, []); const carregarUsuarios = async () => { setLoading(true); try { const result = await adminUserService.listAllUsers(); if (result.success && result.data) { setUsuarios(result.data); } else { toast.error(result.error || "Erro ao carregar usuários"); } } catch { toast.error("Erro ao carregar usuários"); } finally { setLoading(false); } }; const handleEdit = (user: FullUserInfo) => { setEditingUser(user); setEditForm({ full_name: user.profile?.full_name || "", email: user.profile?.email || "", phone: user.profile?.phone || "", disabled: user.profile?.disabled || false, }); }; const handleSaveEdit = async () => { if (!editingUser) return; try { const result = await adminUserService.updateUser( editingUser.user.id, editForm ); if (result.success) { toast.success("Usuário atualizado com sucesso!"); setEditingUser(null); carregarUsuarios(); } else { toast.error(result.error || "Erro ao atualizar usuário"); } } catch { toast.error("Erro ao atualizar usuário"); } }; const handleToggleStatus = async (userId: string, currentStatus: boolean) => { try { const result = currentStatus ? await adminUserService.enableUser(userId) : await adminUserService.disableUser(userId); if (result.success) { toast.success( `Usuário ${ currentStatus ? "habilitado" : "desabilitado" } com sucesso!` ); carregarUsuarios(); } else { toast.error(result.error || "Erro ao alterar status do usuário"); } } catch { toast.error("Erro ao alterar status do usuário"); } }; const handleDelete = async (userId: string, userName: string) => { if ( !confirm( `Tem certeza que deseja deletar o usuário "${userName}"? Esta ação não pode ser desfeita.` ) ) { return; } try { const result = await adminUserService.deleteUser(userId); if (result.success) { toast.success("Usuário deletado com sucesso!"); carregarUsuarios(); } else { toast.error(result.error || "Erro ao deletar usuário"); } } catch { toast.error("Erro ao deletar usuário"); } }; const handleCreateUser = async () => { if (!createForm.email || !createForm.full_name || !createForm.role) { toast.error("Preencha os campos obrigatórios"); return; } if (createForm.usePassword && !createForm.password) { toast.error("Informe a senha"); return; } if ( createForm.create_patient_record && (!createForm.cpf || !createForm.phone_mobile) ) { toast.error( "CPF e telefone são obrigatórios para criar registro de paciente" ); return; } try { const endpoint = createForm.usePassword ? "/functions/v1/create-user-with-password" : "/functions/v1/create-user"; const payload: any = { email: createForm.email, full_name: createForm.full_name, role: createForm.role, }; if (createForm.usePassword) { payload.password = createForm.password; } if (createForm.phone_mobile) { payload.phone_mobile = createForm.phone_mobile; } if (createForm.create_patient_record) { payload.create_patient_record = true; payload.cpf = createForm.cpf; } const response = await fetch( `https://yuanqfswhberkoevtmfr.supabase.co${endpoint}`, { method: "POST", headers: { "Content-Type": "application/json", apikey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ", Authorization: `Bearer ${localStorage.getItem( "mediconnect_access_token" )}`, }, body: JSON.stringify(payload), } ); const data = await response.json(); if (response.ok) { toast.success("Usuário criado com sucesso!"); setShowCreateModal(false); setCreateForm({ email: "", password: "", full_name: "", phone_mobile: "", cpf: "", role: "", create_patient_record: false, usePassword: true, }); carregarUsuarios(); } else { toast.error(data.message || data.error || "Erro ao criar usuário"); } } catch (error) { console.error("Erro ao criar usuário:", error); toast.error("Erro ao criar usuário"); } }; const usuariosFiltrados = usuarios.filter((user) => { const searchLower = searchTerm.toLowerCase(); return ( user.profile?.full_name?.toLowerCase().includes(searchLower) || user.profile?.email?.toLowerCase().includes(searchLower) || user.user.email.toLowerCase().includes(searchLower) ); }); return (
{/* Header */}

Gerenciar Usuários

Visualize e edite informações dos usuários

{/* Search Bar */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:border-indigo-600/40" />
{/* Users Table */} {loading ? (

Carregando usuários...

) : (
{usuariosFiltrados.length === 0 ? ( ) : ( usuariosFiltrados.map((user, idx) => ( )) )}
Nome Email Telefone Roles Status Criado em Ações
{searchTerm ? "Nenhum usuário encontrado" : "Nenhum usuário cadastrado"}
{user.profile?.full_name || "Sem nome"}
{user.profile?.email || user.user.email} {user.profile?.phone || "-"}
{user.roles && user.roles.length > 0 ? ( user.roles.map((role, index) => ( {role} )) ) : ( Sem roles )}
{user.profile?.disabled ? "Desabilitado" : "Ativo"} {new Date(user.user.created_at).toLocaleDateString( "pt-BR" )}
)}
{/* Modal de Edição */} {editingUser && (

Editar Usuário

setEditForm({ ...editForm, full_name: e.target.value }) } className="form-input" />
setEditForm({ ...editForm, email: e.target.value }) } className="form-input" />
setEditForm({ ...editForm, phone: e.target.value }) } className="form-input" />
)} {/* Modal de Gerenciar Roles */} {managingRolesUser && (

Gerenciar Roles

{managingRolesUser.profile?.full_name || managingRolesUser.user.email}

{/* Lista de roles atuais */}

Roles Atuais:

{userRoles.length > 0 ? ( userRoles.map((userRole) => (
{userRole.role}
)) ) : ( Nenhum role atribuído )}
{/* Adicionar novo role */}

Adicionar Role:

)} {/* Modal Criar Usuário */} {showCreateModal && (

Criar Novo Usuário

{/* Método de Autenticação */}
{/* Email */}
setCreateForm({ ...createForm, email: e.target.value }) } className="form-input" placeholder="usuario@exemplo.com" />
{/* Senha (somente se usePassword) */} {createForm.usePassword && (
setCreateForm({ ...createForm, password: e.target.value, }) } className="form-input" placeholder="Mínimo 6 caracteres" />
)} {/* Nome Completo */}
setCreateForm({ ...createForm, full_name: e.target.value, }) } className="form-input" placeholder="João da Silva" />
{/* Role */}
{/* Telefone */}
setCreateForm({ ...createForm, phone_mobile: e.target.value, }) } className="form-input" placeholder="(11) 99999-9999" />
{/* Criar Registro de Paciente */}
{/* CPF (obrigatório se create_patient_record) */} {createForm.create_patient_record && (
setCreateForm({ ...createForm, cpf: e.target.value.replace(/\D/g, ""), }) } className="form-input" placeholder="12345678901" maxLength={11} />

Apenas números, 11 dígitos

)}
)}
); }; export default GerenciarUsuarios;