import { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { DocumentIcon, PlusIcon, TrashIcon, EyeIcon, XMarkIcon, DocumentArrowDownIcon } from '@heroicons/react/24/outline'; import { DocumentoEditor } from './documentos/DocumentoEditor'; import { api } from '../lib/api'; import { toast } from 'react-toastify'; import { useAuth } from '../contexts/AuthContext'; import { Dialog } from '@headlessui/react'; import { DocumentoViewer } from './documentos/DocumentoViewer'; interface Documento { id: string; nome: string; conteudo: string; processoId?: string; atendimentoId?: string; criadoEm: string; } interface DocumentoPayload { nome: string; conteudo: string; processoId?: string; atendimentoId?: string; } export function DocumentosPage() { const [isEditorOpen, setIsEditorOpen] = useState(false); const [documentos, setDocumentos] = useState([]); const [modelos, setModelos] = useState([]); const [tabValue, setTabValue] = useState(0); const [isLoading, setIsLoading] = useState(true); const { processoId, atendimentoId } = useParams(); const navigate = useNavigate(); const { user, signOut } = useAuth(); const [isVisualizadorOpen, setVisualizadorOpen] = useState(false); const [documentoVisualizado, setDocumentoVisualizado] = useState(null); const [documentoEmEdicao, setDocumentoEmEdicao] = useState(null); const loadData = useCallback(async () => { if (!user) { navigate('/login'); return; } try { setIsLoading(true); await Promise.all([loadDocumentos(), loadModelos()]); } catch (error) { console.error('Erro ao carregar dados:', error); if (error?.response?.status === 401) { signOut(); // Usar a função do AuthContext navigate('/login'); } else { toast.error('Erro ao carregar dados'); } } finally { setIsLoading(false); } }, [user, navigate, signOut]); // Adicionar signOut nas dependências useEffect(() => { loadData(); }, [loadData, processoId, atendimentoId]); const loadDocumentos = async () => { const params = {}; if (processoId) params.processoId = processoId; if (atendimentoId) params.atendimentoId = atendimentoId; const response = await api.get('/documentos', { params }); setDocumentos(response.data); }; const loadModelos = async () => { const response = await api.get('/documentos-modelos'); setModelos(response.data); }; const handleSave = async (data: DocumentoPayload) => { try { const payload = { nome: data.nome.trim(), conteudo: data.conteudo.trim(), tipo: documentoEmEdicao?.tipo || 'OUTROS', modeloId: documentoEmEdicao?.modeloId, processoId: data.processoId || processoId, atendimentoId: data.atendimentoId || atendimentoId }; if (documentoEmEdicao?.id) { await api.put(`/documentos/${documentoEmEdicao.id}`, payload); toast.success('Documento atualizado com sucesso'); } else { await api.post('/documentos', payload); toast.success('Documento criado com sucesso'); } await loadDocumentos(); setIsEditorOpen(false); setDocumentoEmEdicao(null); } catch (error: any) { console.error('Erro ao salvar documento:', error); toast.error(error?.response?.data?.message || 'Erro ao salvar documento'); } }; const handleDeleteDocumento = async (id) => { try { await api.delete(`/documentos/${id}`); toast.success('Documento excluído com sucesso'); await loadDocumentos(); } catch (error) { console.error('Erro ao excluir documento:', error); if (error?.response?.status === 401) { toast.error('Sessão expirada. Por favor, faça login novamente.'); } else { toast.error('Erro ao excluir documento'); } } }; const handleVisualizar = async (doc) => { try { setDocumentoVisualizado(doc); // Simplificar para usar o documento diretamente setVisualizadorOpen(true); } catch (error) { console.error('Erro ao visualizar documento:', error); toast.error('Erro ao visualizar documento'); } }; const handleExportPDF = async (documento) => { try { const configRes = await api.get('/documentos/configuracoes'); const response = await api.post('/documentos/exportar-pdf', { nome: documento.nome, conteudo: documento.conteudo, escritorio: configRes.data }, { responseType: 'blob' }); // Criar URL do blob e fazer download const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', `${documento.nome}.pdf`); document.body.appendChild(link); link.click(); link.parentNode.removeChild(link); window.URL.revokeObjectURL(url); toast.success('PDF gerado com sucesso!'); } catch (error) { console.error('Erro ao gerar PDF:', error); toast.error('Erro ao gerar PDF'); } }; const handleEdit = (documento) => { // Garantir que todos os campos necessários estejam presentes setDocumentoEmEdicao({ id: documento.id, nome: documento.nome, conteudo: documento.conteudo, tipo: documento.tipo || 'OUTROS', modeloId: documento.modeloId, processoId: documento.processoId || processoId, atendimentoId: documento.atendimentoId || atendimentoId }); setVisualizadorOpen(false); setIsEditorOpen(true); }; const handleUseModelo = (modelo) => { setDocumentoEmEdicao({ nome: modelo.nome, conteudo: modelo.conteudo, modeloId: modelo.id, tipo: 'OUTROS', processoId: processoId, atendimentoId: atendimentoId }); setIsEditorOpen(true); }; if (isLoading) { return
Carregando...
; } return (

Documentos

{user?.perfil === 'ADVOGADO_ADMIN' && ( )}
{tabValue === 0 && (
{documentos.map((doc) => (
{/* Ajustado min-height e layout */}

{doc.nome}

Criado em: {new Date(doc.criadoEm).toLocaleDateString()}

{/* Botões em flex-wrap para melhor responsividade */}
))}
)} {tabValue === 1 && (
{modelos.map((modelo) => (

{modelo.nome}

{modelo.descricao}

))}
)} setVisualizadorOpen(false)} className="relative z-50" > { setIsEditorOpen(false); setDocumentoEmEdicao(null); }} onSave={handleSave} processoId={processoId} atendimentoId={atendimentoId} documento={documentoEmEdicao} // Passando o documento em edição />
); }