import { useState, useMemo, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { FileText, Plus, Eye, Edit, Copy, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { usePrompts } from "@/contexts/PromptsContext"; import type { Prompt } from "@/contexts/PromptsContext"; import { promptsService, type PromptItem } from "@/services/promptsApi"; import { toast } from "sonner"; function formatarDataCriacao(iso: string | undefined): string { if (!iso?.trim()) return "—"; try { return new Date(iso.replace(" ", "T")).toLocaleDateString("pt-BR"); } catch { return iso; } } function apiItemToPrompt(item: PromptItem): Prompt { return { id: item.id, titulo: item.titulo, area: item.area_nome, area_id: item.area_id, descricao: item.descricao ?? undefined, conteudo: item.conteudo ?? "", created_at: item.created_at, }; } export const PromptsView = () => { const navigate = useNavigate(); const { prompts, setPrompts, areaItems, refreshAreas } = usePrompts(); const [isDetailsDialogOpen, setIsDetailsDialogOpen] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [selectedPrompt, setSelectedPrompt] = useState(null); const [promptToDelete, setPromptToDelete] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(10); const [filterNome, setFilterNome] = useState(""); const [filterAreaId, setFilterAreaId] = useState(""); const [promptsList, setPromptsList] = useState([]); const [totalRegistros, setTotalRegistros] = useState(0); const [totalPaginas, setTotalPaginas] = useState(1); const [loadingList, setLoadingList] = useState(true); const [isDeletingPrompt, setIsDeletingPrompt] = useState(false); const totalPages = Math.max(1, totalPaginas); const selectedAreaItem = useMemo( () => (selectedPrompt ? areaItems.find((a) => a.nome === selectedPrompt.area || a.id === selectedPrompt.area_id) ?? null : null), [selectedPrompt, areaItems] ); useEffect(() => { let cancelled = false; setLoadingList(true); promptsService.listar({ titulo: filterNome.trim() || undefined, area_id: filterAreaId.trim() || undefined, page: currentPage, per_page: itemsPerPage, }) .then((res) => { if (!cancelled) { const list = (res.data ?? []).map(apiItemToPrompt); setPromptsList(list); setTotalRegistros(res.total_registros ?? 0); setTotalPaginas(res.total_paginas ?? 1); setPrompts((prev) => { const byId = new Map(prev.map((p) => [p.id, p])); list.forEach((p) => byId.set(p.id, p)); return Array.from(byId.values()); }); } }) .catch((e: unknown) => { if (!cancelled) { const msg = e && typeof e === "object" && "message" in e ? (e as { message: string }).message : "Erro ao carregar prompts."; toast.error(msg); setPromptsList([]); setTotalRegistros(0); setTotalPaginas(1); } }) .finally(() => { if (!cancelled) setLoadingList(false); }); return () => { cancelled = true; }; }, [filterNome, filterAreaId, currentPage, itemsPerPage]); useEffect(() => { setCurrentPage(1); }, [filterNome, filterAreaId]); useEffect(() => { refreshAreas(); }, [refreshAreas]); const clearFilters = () => { setFilterNome(""); setFilterAreaId(""); setCurrentPage(1); }; const hasActiveFilters = filterNome.trim() !== "" || filterAreaId !== ""; const handleItemsPerPageChange = (value: string) => { setItemsPerPage(Number(value)); setCurrentPage(1); }; const openDetailsDialog = (prompt: Prompt) => { setSelectedPrompt(prompt); setIsDetailsDialogOpen(true); }; const openEditFromDetails = () => { if (!selectedPrompt) return; setIsDetailsDialogOpen(false); navigate(`/commander/prompts/${selectedPrompt.id}`); }; const openDeleteDialog = (prompt: Prompt) => { setPromptToDelete(prompt); setIsDeleteDialogOpen(true); }; const handleDeletePrompt = async () => { if (!promptToDelete) return; setIsDeletingPrompt(true); try { await promptsService.deletar(promptToDelete.id); setPromptsList((prev) => prev.filter((p) => p.id !== promptToDelete.id)); setPrompts((prev) => prev.filter((p) => p.id !== promptToDelete.id)); setTotalRegistros((prev) => Math.max(0, prev - 1)); if (selectedPrompt?.id === promptToDelete.id) { setIsDetailsDialogOpen(false); setSelectedPrompt(null); } toast.success("Prompt excluído com sucesso!"); setIsDeleteDialogOpen(false); setPromptToDelete(null); setCurrentPage(1); } catch (e: unknown) { const msg = e && typeof e === "object" && "message" in e ? (e as { message: string }).message : "Erro ao excluir prompt."; toast.error(msg); } finally { setIsDeletingPrompt(false); } }; return (

Prompts

setFilterNome(e.target.value)} className="w-full md:max-w-sm text-sm" /> {hasActiveFilters && ( )}
Itens:
{!loadingList && totalRegistros === 0 && !hasActiveFilters ? ( Nenhum prompt cadastrado Crie seu primeiro prompt para organizar por título e área.
) : ( <>
Data de criação Título Área Ações {loadingList ? ( Carregando... ) : totalRegistros === 0 ? ( {hasActiveFilters ? "Nenhum prompt encontrado para os filtros selecionados." : "Não há resultados."} ) : ( promptsList.map((prompt) => ( {formatarDataCriacao(prompt.created_at)} {prompt.titulo} {prompt.area}
)) )}
{!loadingList && totalRegistros > 0 && (

Mostrando {totalRegistros} {totalRegistros === 1 ? "prompt" : "prompts"}

{Array.from({ length: Math.min(totalPages, 5) }, (_, i) => { let page: number; if (totalPages <= 5) { page = i + 1; } else if (currentPage <= 3) { page = i + 1; } else if (currentPage >= totalPages - 2) { page = totalPages - 4 + i; } else { page = currentPage - 2 + i; } return ( ); })}
)} )}
{/* Modal Detalhes */} Detalhes do Prompt Informações do prompt selecionado {selectedPrompt && (
{selectedPrompt.created_at?.trim() ? (

{formatarDataCriacao(selectedPrompt.created_at)}

) : null}

{selectedPrompt.titulo}

{selectedPrompt.area}

{selectedAreaItem?.descricao?.trim() && (

{selectedAreaItem.descricao}

)}
{selectedPrompt.conteudo != null && selectedPrompt.conteudo !== "" && (

{selectedPrompt.conteudo}

)}
)}
Excluir prompt Deseja excluir o prompt "{promptToDelete?.titulo ?? ""}"? Esta ação não pode ser desfeita. Cancelar {isDeletingPrompt ? "Excluindo..." : "Excluir"}
); };