"use client"; import { useEffect, useState } from 'react'; import { Button, Dialog, Input } from '@/components/ui'; import { Toaster, toast } from 'react-hot-toast'; import { UserPlusIcon, TrashIcon, XMarkIcon, CheckCircleIcon, ExclamationTriangleIcon, } from '@heroicons/react/24/outline'; interface Collaborator { id: string; email: string; name: string; agency_role: string; created_at: string; collaborator_created_at?: string; } interface InviteRequest { email: string; name: string; } export default function TeamManagement() { const [collaborators, setCollaborators] = useState([]); const [loading, setLoading] = useState(true); const [showInviteDialog, setShowInviteDialog] = useState(false); const [showDirectCreateDialog, setShowDirectCreateDialog] = useState(false); const [showActionMenu, setShowActionMenu] = useState(false); const [inviteForm, setInviteForm] = useState({ email: '', name: '', }); const [inviting, setInviting] = useState(false); const [tempPassword, setTempPassword] = useState(''); const [showPasswordDialog, setShowPasswordDialog] = useState(false); const [passwordDialogMode, setPasswordDialogMode] = useState<'invite' | 'direct'>('invite'); const [removingId, setRemovingId] = useState(null); const [showRemoveDialog, setShowRemoveDialog] = useState(false); const [isOwner, setIsOwner] = useState(true); const [errorMessage, setErrorMessage] = useState(null); // Buscar colaboradores const fetchCollaborators = async () => { try { setLoading(true); const token = localStorage.getItem('token'); const response = await fetch('/api/agency/collaborators', { headers: { Authorization: `Bearer ${token}`, }, }); if (!response.ok) { if (response.status === 403) { // Usuário não é owner setIsOwner(false); setErrorMessage('Apenas o dono da agência pode gerenciar colaboradores'); setCollaborators([]); return; } throw new Error('Erro ao carregar colaboradores'); } setIsOwner(true); setErrorMessage(null); const data = await response.json(); setCollaborators(data || []); } catch (error) { console.error('Erro ao carregar colaboradores:', error); setErrorMessage('Erro ao carregar colaboradores'); toast.error('Erro ao carregar colaboradores'); } finally { setLoading(false); } }; useEffect(() => { fetchCollaborators(); }, []); // Fechar menu de ações ao clicar fora useEffect(() => { const handleClickOutside = () => setShowActionMenu(false); if (showActionMenu) { document.addEventListener('click', handleClickOutside); return () => document.removeEventListener('click', handleClickOutside); } }, [showActionMenu]); // Convidar colaborador const handleInvite = async () => { if (!inviteForm.email || !inviteForm.name) { toast.error('Preencha todos os campos'); return; } try { setInviting(true); const token = localStorage.getItem('token'); const response = await fetch('/api/agency/collaborators/invite', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify(inviteForm), }); if (!response.ok) { const error = await response.text(); throw new Error(error || 'Erro ao convidar colaborador'); } const data = await response.json(); setTempPassword(data.temporary_password); setPasswordDialogMode('invite'); setShowPasswordDialog(true); setShowInviteDialog(false); setInviteForm({ email: '', name: '' }); // Recarregar colaboradores await fetchCollaborators(); } catch (error) { console.error('Erro ao convidar:', error); toast.error(error instanceof Error ? error.message : 'Erro ao convidar colaborador'); } finally { setInviting(false); } }; // Criar colaborador diretamente const handleDirectCreate = async () => { if (!inviteForm.email || !inviteForm.name) { toast.error('Preencha todos os campos'); return; } try { setInviting(true); const token = localStorage.getItem('token'); const response = await fetch('/api/agency/collaborators/invite', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify(inviteForm), }); if (!response.ok) { const error = await response.text(); throw new Error(error || 'Erro ao criar colaborador'); } const data = await response.json(); setTempPassword(data.temporary_password); setPasswordDialogMode('direct'); setShowPasswordDialog(true); setShowDirectCreateDialog(false); setInviteForm({ email: '', name: '' }); // Recarregar colaboradores await fetchCollaborators(); } catch (error) { console.error('Erro ao criar:', error); toast.error(error instanceof Error ? error.message : 'Erro ao criar colaborador'); } finally { setInviting(false); } }; // Remover colaborador const handleRemove = async () => { if (!removingId) return; try { const token = localStorage.getItem('token'); const response = await fetch(`/api/agency/collaborators/remove?id=${removingId}`, { method: 'DELETE', headers: { Authorization: `Bearer ${token}`, }, }); if (!response.ok) { throw new Error('Erro ao remover colaborador'); } toast.success('Colaborador removido com sucesso'); setShowRemoveDialog(false); setRemovingId(null); await fetchCollaborators(); } catch (error) { console.error('Erro ao remover:', error); toast.error('Erro ao remover colaborador'); } }; const copyPassword = () => { navigator.clipboard.writeText(tempPassword); toast.success('Senha copiada para a área de transferência'); }; const formatDate = (dateString: string) => { try { return new Date(dateString).toLocaleDateString('pt-BR'); } catch { return '-'; } }; if (loading) { return (
); } return ( <>
{/* Mensagem de Erro se não for owner */} {!isOwner && errorMessage && (

{errorMessage}

)} {/* Cabeçalho */}

Gerenciamento de Equipe

Adicione e gerencie colaboradores com acesso ao sistema

{showActionMenu && (
)}
{/* Lista de Colaboradores */} {collaborators.length === 0 ? (

Nenhum colaborador adicionado ainda

) : (
{collaborators.map((collaborator) => ( ))}
Nome Email Função Data de Adição Ações
{collaborator.name} {collaborator.email} {collaborator.agency_role === 'owner' ? 'Dono' : 'Colaborador'} {formatDate(collaborator.collaborator_created_at || collaborator.created_at)} {collaborator.agency_role !== 'owner' && ( )}
)} {/* Informação sobre Permissões */}

Permissões dos Colaboradores:

  • Podem visualizar leads e clientes
  • Não podem editar ou remover dados
  • Permissões gerenciadas exclusivamente pelo dono
{/* Dialog: Convidar Colaborador */} setShowInviteDialog(false)} title="Convidar Colaborador" >
setInviteForm({ ...inviteForm, name: e.target.value })} disabled={inviting} /> setInviteForm({ ...inviteForm, email: e.target.value })} disabled={inviting} />
{/* Dialog: Senha Temporária */} setShowPasswordDialog(false)} title={passwordDialogMode === 'invite' ? 'Colaborador Convidado com Sucesso' : 'Colaborador Criado com Sucesso'} >

{passwordDialogMode === 'invite' ? 'Colaborador criado com sucesso! Um email com a senha temporária foi enviado.' : 'Colaborador criado com sucesso! Copie a senha abaixo e compartilhe com segurança.'}

⚠️ {passwordDialogMode === 'invite' ? 'O colaborador deverá alterar a senha no primeiro acesso.' : 'Compartilhe esta senha com segurança. O colaborador deverá alterá-la no primeiro acesso.'}
{/* Dialog: Criar Colaborador Direto */} setShowDirectCreateDialog(false)} title="Criar Colaborador (Sem Email)" >

O colaborador será criado imediatamente. Você receberá a senha para compartilhar manualmente.

setInviteForm({ ...inviteForm, name: e.target.value })} disabled={inviting} /> setInviteForm({ ...inviteForm, email: e.target.value })} disabled={inviting} />
{/* Dialog: Remover Colaborador */} setShowRemoveDialog(false)} title="Remover Colaborador" >

Tem certeza que deseja remover este colaborador? Ele perderá o acesso ao sistema imediatamente.

); }