import { useState, useEffect, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { Sparkles, Edit, Plus, Bot } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { usePrompts } from "@/contexts/PromptsContext"; import { parecerService, type ParecerListItem, type ParecerStatus } from "@/services/parecerApi"; import { toast } from "sonner"; const STATUS_OPTIONS: { value: "" | ParecerStatus; label: string }[] = [ { value: "", label: "Todos os status" }, { value: "processando", label: "Processando" }, { value: "concluido", label: "Concluído" }, { value: "erro", label: "Erro" }, ]; function formatarData(createdAt: string): string { if (!createdAt) return "—"; try { const d = new Date(createdAt.replace(" ", "T")); return d.toLocaleDateString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", }); } catch { return createdAt; } } function statusEstilo(status: string): { dot: string; text: string; label: string } { const s = (status ?? "").toLowerCase(); if (s === "concluido") return { dot: "bg-emerald-500", text: "text-emerald-600 dark:text-emerald-400", label: "Concluído" }; if (s === "processando") return { dot: "bg-amber-500", text: "text-amber-600 dark:text-amber-400", label: "Processando" }; if (s === "erro") return { dot: "bg-red-500", text: "text-red-600 dark:text-red-400", label: "Erro" }; return { dot: "bg-muted-foreground/50", text: "text-muted-foreground", label: status || "—" }; } export const ParecerJuridicoView = () => { const navigate = useNavigate(); const { areaItems, refreshAreas } = usePrompts(); const [data, setData] = useState([]); const [totalRegistros, setTotalRegistros] = useState(0); const [totalPaginas, setTotalPaginas] = useState(1); const [paginaAtual, setPaginaAtual] = useState(1); const [perPage, setPerPage] = useState(10); const [loading, setLoading] = useState(true); const [filterTitulo, setFilterTitulo] = useState(""); const [filterAreaId, setFilterAreaId] = useState(""); const [filterStatus, setFilterStatus] = useState<"" | ParecerStatus>(""); const hasActiveFilters = filterTitulo.trim() !== "" || filterAreaId !== "" || filterStatus !== ""; const clearFilters = () => { setFilterTitulo(""); setFilterAreaId(""); setFilterStatus(""); setPaginaAtual(1); }; const loadList = useCallback(() => { setLoading(true); parecerService .listar({ titulo: filterTitulo.trim() || undefined, area_id: filterAreaId.trim() || undefined, status: filterStatus || undefined, page: paginaAtual, per_page: perPage, }) .then((res) => { setData(res.data ?? []); setTotalRegistros(res.total_registros ?? 0); setTotalPaginas(Math.max(1, res.total_paginas ?? 1)); setPaginaAtual(res.pagina_atual ?? 1); setPerPage(res.per_page ?? 10); }) .catch((err) => { toast.error(err?.message ?? "Erro ao carregar pareceres."); setData([]); setTotalRegistros(0); setTotalPaginas(1); }) .finally(() => setLoading(false)); }, [paginaAtual, perPage, filterTitulo, filterAreaId, filterStatus]); useEffect(() => { loadList(); }, [loadList]); useEffect(() => { refreshAreas(); }, [refreshAreas]); const handleItemsPerPageChange = (value: string) => { setPerPage(Number(value)); setPaginaAtual(1); }; const handleEditar = (item: ParecerListItem) => { navigate(`/codex/parecer-juridico/${item.id}`); }; return (

Parecer Jurídico

{ setFilterTitulo(e.target.value); setPaginaAtual(1); }} className="w-full md:max-w-sm text-sm" /> {hasActiveFilters && ( )}
Itens por página:
{loading ? ( Carregando pareceres... ) : data.length === 0 && !hasActiveFilters ? ( Nenhum parecer encontrado Os pareceres jurídicos gerados aparecerão aqui quando disponíveis. ) : ( <>
Data Título Área Status Criado por Ações {data.length === 0 ? ( Nenhum resultado para os filtros aplicados. ) : ( data.map((item) => { const status = statusEstilo(item.status); return ( {formatarData(item.created_at)} {item.titulo} {item.area_nome} {status.label} {item.criado_por ?? "—"}
); }) )}
{totalRegistros > 0 && (

Mostrando {data.length} de {totalRegistros} {totalRegistros === 1 ? "parecer" : "pareceres"}

{Array.from({ length: Math.min(totalPaginas, 5) }, (_, i) => { let page: number; if (totalPaginas <= 5) page = i + 1; else if (paginaAtual <= 3) page = i + 1; else if (paginaAtual >= totalPaginas - 2) page = totalPaginas - 4 + i; else page = paginaAtual - 2 + i; return ( ); })}
)} )}
); };