"use client"; import { Package } from "lucide-react"; import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Separator } from "@/components/ui/separator"; import { Textarea } from "@/components/ui/textarea"; import { useSession } from "@/lib/hooks/use-session"; import { ItemSearch } from "./ItemSearch"; interface Item { id: number; name: string; category?: string; image?: string; [key: string]: any; } interface CreateAdModalProps { open: boolean; onOpenChange: (open: boolean) => void; onSuccess?: () => void; } interface Server { serverId: number; serverName: string; serverType: string; location: string; isActive: boolean; } export function CreateAdModal({ open, onOpenChange, onSuccess, }: CreateAdModalProps) { const { user } = useSession(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [servers, setServers] = useState([]); const [loadingServers, setLoadingServers] = useState(false); const [selectedItem, setSelectedItem] = useState(null); const [tradeItem, setTradeItem] = useState(null); const [acceptTrade, setAcceptTrade] = useState(false); const [formData, setFormData] = useState({ quantity: "1", server_name: "", price_pix: "", price_tibia_coins: "", price_gold_coins: "", trade_item_quantity: "1", description: "", }); const handleItemSelect = (item: Item | null) => { setSelectedItem(item); }; const handleTradeItemSelect = (item: Item | null) => { setTradeItem(item); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(null); try { // Validar item selecionado if (!selectedItem) { setError("Selecione um item para vender"); setLoading(false); return; } // Validar pelo menos um método de pagamento (preço ou troca) const hasPrice = formData.price_pix || formData.price_tibia_coins || formData.price_gold_coins; if (!hasPrice && (!acceptTrade || !tradeItem)) { setError( "Informe pelo menos um preço (PIX, TC ou GP) ou configure uma troca por item", ); setLoading(false); return; } // Validar troca se aceita troca if (acceptTrade && !tradeItem) { setError("Selecione o item que deseja receber em troca"); setLoading(false); return; } const response = await fetch("/api/listings", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ item_id: selectedItem.id, item_name: selectedItem.name, quantity: parseInt(formData.quantity, 10), server_name: formData.server_name, price_pix: formData.price_pix ? parseFloat(formData.price_pix) : null, price_tibia_coins: formData.price_tibia_coins ? parseInt(formData.price_tibia_coins, 10) : null, price_gold_coins: formData.price_gold_coins ? parseInt(formData.price_gold_coins, 10) : null, description: formData.description || null, trade_item_id: acceptTrade && tradeItem ? tradeItem.id : null, trade_item_name: acceptTrade && tradeItem ? tradeItem.name : null, trade_item_quantity: acceptTrade && tradeItem ? parseInt(formData.trade_item_quantity, 10) : null, }), }); const data = await response.json(); if (!response.ok) { if (data?.details?.length) { const fieldLabels: Record = { item_id: "Item", item_id_unified: "Item", item_name: "Nome do item", quantity: "Quantidade", server_name: "Servidor", price_pix: "Preço PIX", price_tibia_coins: "Preço Tibia Coins", price_gold_coins: "Preço Gold Coins", trade_item_id: "Item de troca", trade_item_name: "Nome do item de troca", trade_item_quantity: "Quantidade do item de troca", auction_ends_at: "Término do leilão", }; const validationMessages = data.details.map( (detail: { field?: string; message?: string }) => { const fieldLabel = detail.field ? fieldLabels[detail.field] || detail.field : "Campo"; return `${fieldLabel}: ${detail.message ?? "preenchimento obrigatório"}`; }, ); setError(validationMessages.join(" ")); } else { setError(data?.error || "Erro ao criar anúncio"); } setLoading(false); return; } // Limpar formulário setSelectedItem(null); setTradeItem(null); setAcceptTrade(false); setFormData({ quantity: "1", server_name: "", price_pix: "", price_tibia_coins: "", price_gold_coins: "", trade_item_quantity: "1", description: "", }); onOpenChange(false); if (onSuccess) { onSuccess(); } } catch (err) { setError("Erro ao criar anúncio. Tente novamente."); console.error(err); } finally { setLoading(false); } }; // Carregar servidores ao abrir o modal const loadServers = async () => { setLoadingServers(true); try { const res = await fetch("/api/servers"); if (res.ok) { const data = await res.json(); setServers(data.servers || []); } } catch (error) { console.error("Erro ao carregar servidores:", error); } finally { setLoadingServers(false); } }; useEffect(() => { if (open) { loadServers(); } }, [open, loadServers]); const handleClose = () => { if (!loading) { setSelectedItem(null); setTradeItem(null); setAcceptTrade(false); setFormData({ quantity: "1", server_name: "", price_pix: "", price_tibia_coins: "", price_gold_coins: "", trade_item_quantity: "1", description: "", }); setError(null); onOpenChange(false); } }; if (!user) { return null; } return ( Criar Novo Anúncio Preencha os dados do item que deseja vender
{/* Seleção do item a vender */}
setFormData({ ...formData, quantity: e.target.value }) } />
{/* Preços */}
setFormData({ ...formData, price_pix: e.target.value }) } placeholder="0.00" />
setFormData({ ...formData, price_tibia_coins: e.target.value, }) } placeholder="0" />
setFormData({ ...formData, price_gold_coins: e.target.value, }) } placeholder="0" />
{/* Troca por item */}
{ setAcceptTrade(checked as boolean); if (!checked) { setTradeItem(null); } }} />
{acceptTrade && (
{tradeItem && (
setFormData({ ...formData, trade_item_quantity: e.target.value, }) } />
)}
)}
{/* Descrição */}