"use client"; import { useState, useEffect } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { ShoppingCart, Clock, CheckCircle2, XCircle, MessageSquare } from "lucide-react"; import { IntentionDetailModal } from "./IntentionDetailModal"; interface PurchaseIntention { intention_id: number; buyer_id: number; payment_method: string; status: "pending" | "accepted" | "rejected" | "expired" | "completed"; buyer_message: string | null; seller_response: string | null; created_at: string; buyer?: { user_id: number; username: string; email: string; }; } interface MyAdsIntentionListProps { listingId: number; sellerId: number; } function formatTimeAgo(date: Date): string { const seconds = Math.floor((new Date().getTime() - date.getTime()) / 1000); if (seconds < 60) return "há alguns segundos"; const minutes = Math.floor(seconds / 60); if (minutes < 60) return `há ${minutes} ${minutes === 1 ? "minuto" : "minutos"}`; const hours = Math.floor(minutes / 60); if (hours < 24) return `há ${hours} ${hours === 1 ? "hora" : "horas"}`; const days = Math.floor(hours / 24); return `há ${days} ${days === 1 ? "dia" : "dias"}`; } function getStatusBadge(status: string) { switch (status) { case "pending": return ( Pendente ); case "accepted": return ( Aceita ); case "rejected": return ( Rejeitada ); default: return {status}; } } function getPaymentMethodLabel(method: string): string { switch (method) { case "pix": return "PIX"; case "tibia_coins": return "Tibia Coins"; case "gold_coins": return "Gold Coins"; case "trade": return "Troca"; default: return method.toUpperCase(); } } export function MyAdsIntentionList({ listingId, sellerId }: MyAdsIntentionListProps) { const [intentions, setIntentions] = useState([]); const [loading, setLoading] = useState(true); const [selectedIntention, setSelectedIntention] = useState(null); const [filter, setFilter] = useState<"all" | "pending" | "accepted" | "rejected">("all"); useEffect(() => { loadIntentions(); }, [listingId, filter]); const loadIntentions = async () => { setLoading(true); try { const params = new URLSearchParams(); if (filter !== "all") { params.set("status", filter); } const res = await fetch(`/api/listings/${listingId}/intentions?${params.toString()}`); if (res.ok) { const data = await res.json(); if (data.success) { setIntentions(data.intentions || []); } } } catch (error) { console.error("Erro ao carregar intenções:", error); } finally { setLoading(false); } }; const pendingCount = intentions.filter((i) => i.status === "pending").length; if (loading) { return ( {Array.from({ length: 3 }).map((_, i) => ( ))} ); } if (intentions.length === 0) { return ( Nenhuma intenção de compra encontrada ); } return ( {/* Filtros */} setFilter("all")} > Todas ({intentions.length}) setFilter("pending")} > Pendentes ({pendingCount}) setFilter("accepted")} > Aceitas setFilter("rejected")} > Rejeitadas {/* Lista de intenções */} {intentions.map((intention) => ( setSelectedIntention(intention)} > {intention.buyer?.username.charAt(0).toUpperCase() || "?"} {intention.buyer?.username || "Usuário"} {getStatusBadge(intention.status)} {getPaymentMethodLabel(intention.payment_method)} • {formatTimeAgo(new Date(intention.created_at))} {intention.buyer_message && ( {intention.buyer_message} )} ))} {/* Modal de detalhes */} {selectedIntention && ( { if (!open) setSelectedIntention(null); }} intention={selectedIntention} listingId={listingId} onUpdate={loadIntentions} /> )} ); }
{intention.buyer_message}