"use client" import { useState, useMemo } from "react" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { PedidoDetailModal } from "@/components/pedido-detail-modal" import { Search, Download } from "lucide-react" import type { Pedido } from "@/lib/supabase" const statusColors: Record = { PENDING: "bg-yellow-100 text-yellow-800", RECEIVED: "bg-green-100 text-green-800", CONFIRMED: "bg-green-100 text-green-800", OVERDUE: "bg-red-100 text-red-800", REFUNDED: "bg-gray-100 text-gray-800", CANCELLED: "bg-red-100 text-red-800", } const statusLabel: Record = { PENDING: "Pendente", RECEIVED: "Pago", CONFIRMED: "Confirmado", OVERDUE: "Vencido", REFUNDED: "Estornado", CANCELLED: "Cancelado", } const ALL_STATUSES = ["PENDING", "RECEIVED", "CONFIRMED", "OVERDUE", "REFUNDED", "CANCELLED"] type PedidoRich = Pedido & { clientes?: { nome: string; email: string; telefone?: string | null; cpf_cnpj?: string | null } | null produtos?: { nome: string; tipo: string; validade?: string; midia?: string | null } | null asaas_invoice_url?: string | null pix_copia_cola?: string | null pix_qrcode_url?: string | null paid_at?: string | null } export function TransactionTable({ transactions }: { transactions: PedidoRich[] }) { const [busca, setBusca] = useState("") const [filtroStatus, setFiltroStatus] = useState(null) const [pedidoSelecionado, setPedidoSelecionado] = useState(null) const fmt = (v: number) => (v / 100).toLocaleString("pt-BR", { style: "currency", currency: "BRL" }) const filtrados = useMemo(() => { return transactions.filter((t) => { const matchStatus = !filtroStatus || t.status === filtroStatus const q = busca.toLowerCase() const matchBusca = !q || t.id.toLowerCase().includes(q) || (t.clientes?.nome ?? "").toLowerCase().includes(q) || (t.clientes?.email ?? "").toLowerCase().includes(q) || (t.produtos?.nome ?? "").toLowerCase().includes(q) return matchStatus && matchBusca }) }, [transactions, busca, filtroStatus]) function exportCSV() { const header = ["ID", "Cliente", "Email", "Produto", "Valor", "Método", "Status", "Data"] const rows = filtrados.map((t) => [ t.id, t.clientes?.nome ?? "", t.clientes?.email ?? "", t.produtos?.nome ?? "", (t.valor_centavos / 100).toFixed(2), t.metodo_pagamento ?? "", t.status, new Date(t.created_at).toLocaleDateString("pt-BR"), ]) const csv = [header, ...rows].map((r) => r.map((c) => `"${c}"`).join(",")).join("\n") const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }) const url = URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = `pedidos-${new Date().toISOString().slice(0, 10)}.csv` a.click() URL.revokeObjectURL(url) } if (transactions.length === 0) { return (
Nenhum pedido encontrado.
) } return (
{/* Toolbar */}
setBusca(e.target.value)} />
{ALL_STATUSES.map((s) => ( ))}
{/* Contagem */}

{filtrados.length} pedido{filtrados.length !== 1 ? "s" : ""} encontrado{filtrados.length !== 1 ? "s" : ""}

{/* Tabela */}
ID Cliente Produto Valor Método Status Data {filtrados.length === 0 ? ( Nenhum pedido encontrado com esses filtros. ) : ( filtrados.map((t) => ( setPedidoSelecionado(t)} > {t.id.slice(0, 8).toUpperCase()} {t.clientes?.nome ?? "—"} {t.produtos?.nome ?? "—"} {fmt(t.valor_centavos)} {t.metodo_pagamento ?? "—"} {statusLabel[t.status] ?? t.status} {new Date(t.created_at).toLocaleDateString("pt-BR")} )) )}
{/* Modal detalhe */} {pedidoSelecionado && ( [0]["pedido"]} open={!!pedidoSelecionado} onClose={() => setPedidoSelecionado(null)} /> )}
) }