"use client" import { useEffect, useState, useCallback } from "react" import { useRouter } from "next/navigation" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { useToast } from "@/components/ui/use-toast" import { CheckCircle2, Clock, XCircle, Copy, ExternalLink, Calendar, Loader2, } from "lucide-react" type Pedido = { id: string status: string valor_centavos: number metodo_pagamento: string pix_copia_cola: string | null pix_qrcode_url: string | null asaas_invoice_url: string | null paid_at: string | null clientes: { nome: string; email: string } | null produtos: { nome: string; validade: string; midia: string | null } | null } const STATUS_PAGO = ["PAID", "RECEIVED", "CONFIRMED"] const STATUS_CANCELADO = ["CANCELED", "CANCELLED", "OVERDUE", "REFUNDED"] const LINK_AGENDAMENTO = process.env.NEXT_PUBLIC_AFTER_PAYMENT_REDIRECT ?? "/" export default function PedidoStatus({ pedidoInicial }: { pedidoInicial: Pedido }) { const router = useRouter() const { toast } = useToast() const [pedido, setPedido] = useState(pedidoInicial) const [polling, setPolling] = useState(true) const isPago = STATUS_PAGO.includes(pedido.status) const isCancelado = STATUS_CANCELADO.includes(pedido.status) const valorFormatado = (pedido.valor_centavos / 100).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }) const fetchStatus = useCallback(async () => { try { const res = await fetch(`/api/pedido/${pedido.id}`) if (!res.ok) return const data: Pedido = await res.json() setPedido(data) if (STATUS_PAGO.includes(data.status) || STATUS_CANCELADO.includes(data.status)) { setPolling(false) } } catch { // silencioso — tenta de novo no próximo ciclo } }, [pedido.id]) useEffect(() => { if (!polling || isPago || isCancelado) return const interval = setInterval(fetchStatus, 5000) return () => clearInterval(interval) }, [polling, isPago, isCancelado, fetchStatus]) function copiarPix() { if (!pedido.pix_copia_cola) return navigator.clipboard.writeText(pedido.pix_copia_cola) toast({ title: "Código PIX copiado!" }) } // ── Pago ────────────────────────────────────────────────────────────── if (isPago) { return ( Pagamento confirmado!

{pedido.clientes?.nome}, seu certificado está sendo processado.

Próximo passo: agende sua validação

Para emitir o certificado, é obrigatório realizar uma videoconferência de Clique no botão abaixo para continuar para o próximo passo.

O link também foi enviado para {pedido.clientes?.email}

) } // ── Cancelado / Vencido ─────────────────────────────────────────────── if (isCancelado) { return ( Pagamento não realizado

Este pedido foi cancelado ou expirou.

) } // ── PIX ─────────────────────────────────────────────────────────────── if (pedido.metodo_pagamento === "PIX") { return ( Aguardando pagamento PIX

Confirmação automática em segundos após o pagamento

{pedido.pix_qrcode_url && (
QR Code PIX
)} {pedido.pix_copia_cola && (

PIX Copia e Cola

{pedido.pix_copia_cola}
)}

Valor: {valorFormatado}

) } // ── BOLETO ──────────────────────────────────────────────────────────── if (pedido.metodo_pagamento === "BOLETO") { return ( Boleto gerado

Após o pagamento, a confirmação pode levar até 2 dias úteis.

{pedido.asaas_invoice_url && ( )}

O link do boleto também foi enviado para{" "} {pedido.clientes?.email}

) } // ── CARTÃO (pendente/processando) ──────────────────────────────────── return ( Processando pagamento

Aguarde enquanto confirmamos seu cartão.

) } function ResumoCompra({ pedido, valorFormatado, }: { pedido: Pedido valorFormatado: string }) { return (
Produto {pedido.produtos?.nome ?? "—"}
Validade {pedido.produtos?.validade ?? "—"}
{pedido.produtos?.midia && (
Mídia {pedido.produtos.midia}
)}
Valor {valorFormatado}
Pedido {pedido.id.slice(0, 8).toUpperCase()}
) }