"use client"; import { useQueryClient } from "@tanstack/react-query"; import { ChevronDown, Eye, Heart, Pause, Play, ShoppingCart, Trash2, TrendingUp, } from "lucide-react"; import { useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useMyListings } from "@/lib/hooks/use-listings"; import { useSession } from "@/lib/hooks/use-session"; import { MyAdsIntentionList } from "./MyAdsIntentionList"; export function MyAdsPanel() { const { user } = useSession(); const queryClient = useQueryClient(); const [activeTab, setActiveTab] = useState("active"); const [expandedIntentions, setExpandedIntentions] = useState>( new Set(), ); // Determinar status baseado na aba ativa const status = activeTab === "active" ? "active" : activeTab === "paused" ? "cancelled" : // Backend usa 'cancelled' para pausados activeTab === "sold" ? "sold" : undefined; // "all" busca todos // Usar React Query para buscar meus anúncios com atualização automática // O queryKey muda quando status muda, então recarrega automaticamente const { listings, isLoading: loading, refetch } = useMyListings(status); const invalidateCache = () => { queryClient.invalidateQueries({ queryKey: ["my-listings"] }); queryClient.invalidateQueries({ queryKey: ["listings"] }); }; const handlePause = async (listingId: number) => { try { const res = await fetch(`/api/listings/${listingId}/pause`, { method: "POST", }); if (res.ok) { invalidateCache(); } } catch (error) { console.error("Erro ao pausar anúncio:", error); } }; const handleActivate = async (listingId: number) => { try { const res = await fetch(`/api/listings/${listingId}/activate`, { method: "POST", }); if (res.ok) { invalidateCache(); } } catch (error) { console.error("Erro ao reativar anúncio:", error); } }; const handleDelete = async (listingId: number) => { if (!confirm("Tem certeza que deseja excluir este anúncio?")) return; try { const res = await fetch(`/api/listings/${listingId}`, { method: "DELETE", }); if (res.ok) { invalidateCache(); } } catch (error) { console.error("Erro ao excluir anúncio:", error); } }; const getStatusBadge = (status: string) => { const variants: Record = { active: "default", sold: "secondary", cancelled: "destructive", expired: "destructive", in_escrow: "secondary", }; const labels: Record = { active: "Ativo", sold: "Vendido", cancelled: "Cancelado", expired: "Expirado", in_escrow: "Em Escrow", }; return ( {labels[status] || status} ); }; if (!user) { return (

Faça login para ver seus anúncios

); } return (

Meus Anúncios

Gerencie seus anúncios e acompanhe o desempenho

Ativos Pausados Vendidos Todos {loading ? (
{Array.from({ length: 6 }).map((_, i) => ( ))}
) : listings.length === 0 ? (

Nenhum anúncio encontrado

) : (
{listings.map((listing) => { const isExpanded = expandedIntentions.has(listing.listing_id); return (

{listing.item_name}

{getStatusBadge(listing.listing_status)}
{listing.views_count} visualizações
{listing.favorites_count} favoritos
{(() => { if (listing.price_pix) { const price = typeof listing.price_pix === "string" ? parseFloat(listing.price_pix) : listing.price_pix; return `R$ ${price.toFixed(2)}`; } if (listing.price_tibia_coins) { const price = typeof listing.price_tibia_coins === "string" ? parseInt(listing.price_tibia_coins, 10) : listing.price_tibia_coins; return `${price.toLocaleString()} TC`; } if (listing.price_gold_coins) { const price = typeof listing.price_gold_coins === "string" ? parseInt(listing.price_gold_coins, 10) : listing.price_gold_coins; return `${price.toLocaleString()} GP`; } return "Preço não informado"; })()}
{listing.listing_status === "active" && ( )} {listing.listing_status === "cancelled" && ( )}
{/* Seção de Intenções de Compra */} {listing.listing_status === "active" && !listing.is_auction && (
{isExpanded && (
)}
)}
); })}
)}
); }