import { useEffect, useState } from 'react' import { ADMIN_CREATABLE_ROLES, GESTOR_CREATABLE_ROLES, hasCapability, normalizeRole, ROLE_LABELS } from '../config/permissions.js' import { userRepository } from '../repositories/userRepository.js' const darkInput = 'h-10 w-full rounded-lg border border-[#404040] bg-[#1a1a1a] px-3 text-sm text-[#e5e5e5] outline-none transition placeholder:text-[#737373] focus:border-[#3b82f6] focus:ring-1 focus:ring-[#3b82f6]' const darkLabel = 'mb-1.5 block text-xs font-medium text-[#e5e5e5]' const authMethodOptions = [ { value: 'magic_link', label: 'Magic Link', description: 'Enviar link de acesso por email', }, { value: 'password', label: 'Email e senha', description: 'Definir senha inicial agora', }, ] const initialUserForm = { email: '', full_name: '', phone: '', cpf: '', role: '', auth_method: 'magic_link', password: '', confirm_password: '', create_patient_record: false, } export function UsersPage({ role: currentRole }) { const [users, setUsers] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [modalOpen, setModalOpen] = useState(false) const [saving, setSaving] = useState(false) const [deletingId, setDeletingId] = useState(null) const [form, setForm] = useState(initialUserForm) const normalizedRole = normalizeRole(currentRole) const canManageUsers = hasCapability(normalizedRole, 'manageUsers') const creatableRoles = normalizedRole === 'admin' ? ADMIN_CREATABLE_ROLES : GESTOR_CREATABLE_ROLES const isPasswordCreation = form.auth_method === 'password' useEffect(() => { loadUsers() }, []) async function loadUsers() { setLoading(true) setError(null) try { const data = await userRepository.getAll() setUsers(data) } catch (err) { setError(err.message) } finally { setLoading(false) } } function handleFormChange(event) { const { checked, name, type, value } = event.target setForm((current) => ({ ...current, [name]: type === 'checkbox' ? checked : value })) } async function handleCreate(event) { event.preventDefault() if (!canManageUsers) { window.alert('Você não tem permissão para criar usuários.') return } if (!form.email || !form.full_name || !form.phone || !form.cpf || !form.role) { window.alert('Preencha email, nome completo, celular, CPF e perfil.') return } if (isPasswordCreation) { if (!form.password || !form.confirm_password) { window.alert('Preencha a senha e a confirmação de senha.') return } if (form.password.length < 8) { window.alert('A senha deve ter pelo menos 8 caracteres.') return } if (form.password !== form.confirm_password) { window.alert('A confirmação de senha não confere.') return } } setSaving(true) try { if (isPasswordCreation) { await userRepository.createWithPassword(form) window.alert(`Usuário criado com email e senha para ${form.email}.`) } else { await userRepository.create(form) window.alert(`Usuário criado! Magic Link enviado para ${form.email}.`) } setModalOpen(false) setForm(initialUserForm) loadUsers() } catch (err) { window.alert(`Erro ao criar usuário: ${err.message}`) } finally { setSaving(false) } } async function handleDelete(user) { if (!canManageUsers) { window.alert('Você não tem permissão para deletar usuários.') return } const confirmed = window.confirm( `⚠️ ATENÇÃO: Esta operação é IRREVERSÍVEL!\n\nO usuário "${user.full_name || user.email}" e TODOS os dados relacionados (perfil, agendamentos, registros) serão deletados permanentemente.\n\nDeseja continuar?` ) if (!confirmed) return setDeletingId(user.id) try { await userRepository.remove(user.id) setUsers((current) => current.filter((u) => u.id !== user.id)) } catch (err) { window.alert(`Erro ao deletar usuário: ${err.message}`) } finally { setDeletingId(null) } } if (!canManageUsers) { return (

Acesso não permitido

Somente Administrador e Gestão/Coordenação podem gerenciar usuários.

) } return (

Usuários do Sistema

Gerencie os usuários e seus perfis de acesso

{loading ? (

Carregando usuários...

) : error ? (

Erro ao carregar usuários: {error}

) : (
{users.length ? ( users.map((user) => { const userRole = Array.isArray(user.roles) ? user.roles[0] : (user.role ?? '—') return ( ) }) ) : ( )}
Nome Email Perfil Status Ações
{(user.full_name || user.email || '?').charAt(0).toUpperCase()} {user.full_name || '—'}
{user.email} {user.email_confirmed_at ? 'Ativo' : 'Pendente'}
Nenhum usuário encontrado.
)} {modalOpen ? (
setModalOpen(false)}>
e.stopPropagation()} >

Novo Usuário

{isPasswordCreation ? 'Crie o acesso inicial com email e senha.' : 'Um Magic Link sera enviado para o email cadastrado.'}

Criar usuário usando *
{authMethodOptions.map((option) => { const selected = form.auth_method === option.value return ( ) })}
{isPasswordCreation ? (
) : null}
) : null}
) } function RoleBadge({ role }) { const styles = { admin: 'bg-purple-500/20 text-purple-400', gestor: 'bg-blue-500/20 text-blue-400', medico: 'bg-emerald-500/20 text-emerald-400', secretaria: 'bg-amber-500/20 text-amber-400', paciente: 'bg-[#303030] text-[#a3a3a3]', } return ( {ROLE_LABELS[role] || role} ) }