import React, { useState, useEffect, lazy, Suspense } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { useProcessos } from "../../hooks/useProcessos"; import api from "../../services/api"; // Adicionar esta importação import { Tab, Dialog } from "@headlessui/react"; import { TrashIcon } from "@heroicons/react/24/outline"; import { ArrowLeftIcon, ClockIcon, DocumentTextIcon, UserGroupIcon, BanknotesIcon, // Alterado de BalanceIcon para BanknotesIcon CalendarIcon, PencilIcon, ExclamationTriangleIcon, PlusIcon, } from "@heroicons/react/24/outline"; import { ProcessoModal } from "./ProcessoModal.tsx"; import { formatNumeroProcesso, formatCPF } from "../../utils/formatters"; import { ParteProcessoModal } from "./ParteProcessoModal"; import { usePartesProcesso } from "../../hooks/usePartesProcesso"; import { useAudiencias } from "../../hooks/useAudiencias"; import { AudienciaModal } from "./AudienciaModal"; import AbaFinanceiro from "./AbaFinanceiro"; import { ProcessoProvider } from "../../context/ProcessoContext"; // Adicionar lazy import para AbaMovimentacoes const AbaMovimentacoes = lazy(() => import("./AbaMovimentacoes")); function classNames(...classes: string[]) { return classes.filter(Boolean).join(" "); } const tabs = [ { id: "geral", name: "Geral", icon: DocumentTextIcon }, { id: "partes", name: "Partes", icon: UserGroupIcon }, { id: "movimentacoes", name: "Movimentações", icon: ClockIcon }, { id: "audiencias", name: "Audiências", icon: CalendarIcon }, { id: "financeiro", name: "Financeiro", icon: BanknotesIcon }, // Atualizado aqui também ]; export const ProcessoDetalhes: React.FC = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { getProcesso, isLoading, deleteProcesso } = useProcessos(); const [processo, setProcesso] = useState(null); const [selectedTab, setSelectedTab] = useState(0); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [editingParte, setEditingParte] = useState(null); const [parteModalConfig, setParteModalConfig] = useState<{ isOpen: boolean; tipo: "AUTOR" | "REU" | null; }>({ isOpen: false, tipo: null }); const [isAudienciaModalOpen, setIsAudienciaModalOpen] = useState(false); const [editingAudiencia, setEditingAudiencia] = useState(null); const [isFinalizacao, setIsFinalizacao] = useState(false); // Movido para cá // Carregar processo com partes useEffect(() => { const loadProcesso = async () => { if (!id) return; try { const data = await getProcesso(id); // Só atualizar se os dados forem diferentes if (JSON.stringify(data) !== JSON.stringify(processo)) { setProcesso(data); } } catch (error) { console.error("Erro ao carregar processo:", error); } }; loadProcesso(); }, [id, getProcesso]); // Remover processo da dependency list const { addParte, updateParte, deleteParte } = usePartesProcesso(id!); const handleSaveParte = async (data: any) => { try { if (editingParte) { await updateParte({ id: editingParte.id, data }); } else { await addParte(data); } setParteModalConfig({ isOpen: false, tipo: null }); setEditingParte(null); // Recarregar processo após salvar const updatedProcesso = await getProcesso(id!); setProcesso(updatedProcesso); } catch (error) { console.error("Erro ao salvar parte:", error); } }; const handleDeleteParte = async (parteId: string) => { if (window.confirm("Tem certeza que deseja remover esta parte?")) { try { await deleteParte(parteId); } catch (error) { console.error("Erro ao excluir parte:", error); } } }; const { addAudiencia, updateAudiencia, deleteAudiencia } = useAudiencias(id!); const handleSaveAudiencia = async (data: any) => { try { if (editingAudiencia) { await updateAudiencia({ id: editingAudiencia.id, data }); } else { await addAudiencia(data); } setIsAudienciaModalOpen(false); setEditingAudiencia(null); // Recarregar processo após salvar const updatedProcesso = await getProcesso(id!); setProcesso(updatedProcesso); } catch (error) { console.error("Erro ao salvar audiência:", error); } }; const handleDeleteAudiencia = async (audienciaId: string) => { if (window.confirm("Tem certeza que deseja remover esta audiência?")) { try { await deleteAudiencia(audienciaId); // Recarregar processo const updatedProcesso = await getProcesso(id!); setProcesso(updatedProcesso); } catch (error) { console.error("Erro ao excluir audiência:", error); } } }; if (isLoading) { return
Carregando...
; } if (!processo) { return
Processo não encontrado
; } const handleDelete = async () => { try { await deleteProcesso.mutateAsync(id!); navigate("/processos"); } catch (error) { console.error("Erro ao excluir processo:", error); alert("Erro ao excluir processo"); } }; return (
{/* Header */}

{formatNumeroProcesso(processo.numero)}

{processo.natureza}

{/* Status Badge */} {processo.status} {/* Adicionar o botão de resultado aqui */}
{/* Adicionar botão de edição */}
{/* Tabs */} {processo && ( {tabs.map((tab) => ( classNames( "w-full rounded-lg py-2.5 text-sm font-medium leading-5", "flex items-center justify-center", selected ? "bg-white text-blue-700 shadow" : "text-gray-600 hover:bg-white/[0.12] hover:text-blue-600", ) } > {tab.name} ))} {/* Informações Gerais */}
Número do Processo
{formatNumeroProcesso(processo.numero)}
Natureza
{processo.natureza}
Órgão Julgador
{processo.orgaoJulgador}
Valor da Causa
{new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL", }).format(processo.valorCausa || 0)}
{/* Partes do Processo */}
{/* Autores */}

Autores

{processo.partes ?.filter((p) => p.tipo === "AUTOR") .map((parte) => (

{parte.nome}

{parte.cpfCnpj && (

{formatCPF(parte.cpfCnpj)}

)} {parte.observacoes && (

{parte.observacoes}

)}
))}
{/* Réus */}

Réus

{processo.partes ?.filter((p) => p.tipo === "REU") .map((parte) => (

{parte.nome}

{parte.cpfCnpj && (

{formatCPF(parte.cpfCnpj)}

)} {parte.observacoes && (

{parte.observacoes}

)}
))}
setParteModalConfig({ isOpen: false, tipo: null }) } onSave={handleSaveParte} tipo={parteModalConfig.tipo} editingParte={editingParte} />
{/* Movimentações */} Carregando...
} > {/* Audiências */}
{/* Header com botão de adicionar */}

Audiências

{/* Lista de Audiências */} {processo.audiencias && processo.audiencias.length > 0 ? (
{processo.audiencias.map((audiencia) => (

{audiencia.tipo}

Data:{" "} {new Date(audiencia.data).toLocaleString()}

Local: {audiencia.local}

{audiencia.modalidade === "VIRTUAL" && (

Link:{" "} Acessar

)} {audiencia.relatorio && (

Relatório:

{audiencia.relatorio}

Finalizada em:{" "} {new Date( audiencia.dataFinalizacao, ).toLocaleString()}

)}
{audiencia.status === "AGENDADA" && ( )}
))}
) : (

Nenhuma audiência agendada

)}
{/* Financeiro */} )} {/* Modal de Edição */} setIsEditModalOpen(false)} onSuccess={() => { setIsEditModalOpen(false); // Recarregar dados após edição window.location.reload(); }} /> {/* Modal de Confirmação de Exclusão */} setIsDeleteModalOpen(false)} className="relative z-50" > {/* Adicionar Modal de Audiência */} { setIsAudienciaModalOpen(false); setEditingAudiencia(null); setIsFinalizacao(false); }} onSave={handleSaveAudiencia} editingAudiencia={editingAudiencia} isFinalizacao={isFinalizacao} /> ); };