import { useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { format } from 'date-fns'; import ptBR from 'date-fns/locale/pt-BR'; import { toast } from 'react-toastify'; import { useAuth } from '../../contexts/AuthContext'; interface Calculo { id: string; titulo: string; status: string; valorBase: string; valorFinal: string; dataBase: string; dataCalculo: string; criadoEm: string; usuario: { nome: string; }; processo?: { numero: string; titulo: string; }; cliente?: { nome: string; }; } export function CalculosList() { const { user, isAuthenticated, getToken } = useAuth(); const navigate = useNavigate(); const [calculos, setCalculos] = useState([]); const [loading, setLoading] = useState(true); const [filtro, setFiltro] = useState({ titulo: '', status: '', processoId: '', clienteId: '' }); useEffect(() => { // Verificar autenticação antes de carregar os dados if (isAuthenticated) { carregarCalculos(); } else { // Redirecionar para login caso não esteja autenticado navigate('/login'); } }, [isAuthenticated, navigate]); const carregarCalculos = async () => { try { setLoading(true); // Construir query string baseado nos filtros const queryParams = new URLSearchParams(); if (filtro.titulo) queryParams.append('titulo', filtro.titulo); if (filtro.status) queryParams.append('status', filtro.status); if (filtro.processoId) queryParams.append('processoId', filtro.processoId); if (filtro.clienteId) queryParams.append('clienteId', filtro.clienteId); // Obter token de autenticação usando o contexto const token = getToken(); if (!token) { throw new Error('Usuário não autenticado. Faça login novamente.'); } // Incluir o token no cabeçalho da requisição const response = await fetch(`/api/calculos?${queryParams.toString()}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { if (response.status === 401) { // Se receber 401, o token pode estar expirado navigate('/login'); throw new Error('Sessão expirada. Por favor, faça login novamente.'); } throw new Error('Erro ao carregar cálculos'); } const data = await response.json(); setCalculos(data); } catch (error) { console.error('Erro ao carregar cálculos:', error); toast.error(`Falha ao carregar os cálculos: ${error.message}`); } finally { setLoading(false); } }; const handleFiltroChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFiltro(prev => ({ ...prev, [name]: value })); }; const handleSubmitFiltro = (e: React.FormEvent) => { e.preventDefault(); carregarCalculos(); }; // Função para formatar valores monetários const formatarValor = (valor: string) => { return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(parseFloat(valor)); }; // Função para formatar datas const formatarData = (data: string) => { try { return format(new Date(data), 'dd/MM/yyyy', { locale: ptBR }); } catch (error) { return 'Data inválida'; } }; // Status Badge const StatusBadge = ({ status }: { status: string }) => { const getStatusColor = () => { switch (status) { case 'RASCUNHO': return 'bg-yellow-100 text-yellow-800'; case 'FINALIZADO': return 'bg-green-100 text-green-800'; case 'ARQUIVADO': return 'bg-gray-100 text-gray-800'; default: return 'bg-blue-100 text-blue-800'; } }; return ( {status} ); }; return (

Cálculos Judiciais

Novo Cálculo Judicial Novo Cálculo de Pensão
{/* Filtros */}

Filtros

{/* Lista de Cálculos */} {loading ? (
Carregando...
) : calculos.length === 0 ? (

Nenhum cálculo encontrado

Para criar um novo cálculo, clique no botão "Novo Cálculo".

) : (
    {calculos.map((calculo) => (
  • {calculo.titulo}

    {formatarValor(calculo.valorFinal)}

    Base: {formatarValor(calculo.valorBase)}

    Data Base: {formatarData(calculo.dataBase)}

    Criado em: {formatarData(calculo.criadoEm)} por {calculo.usuario.nome}

    {calculo.processo && (

    Processo: {calculo.processo.numero} - {calculo.processo.titulo}

    )} {calculo.cliente && (

    Cliente: {calculo.cliente.nome}

    )}
  • ))}
)}
); }