'use client'; import { useEffect, useState } from 'react'; import DOMPurify from 'dompurify'; import { wishlistsApi, itemsApi, claimingApi, settingsApi, type Wishlist, type Item, type Settings } from '@/lib/api'; import Header from '@/components/header'; import Footer from '@/components/footer'; import PasswordLockGuard from '@/components/password-lock-guard'; export default function Home() { const [wishlist, setWishlist] = useState(null); const [items, setItems] = useState([]); const [showClaimed, setShowClaimed] = useState(false); const [isLoading, setIsLoading] = useState(true); const [settings, setSettings] = useState({ siteTitle: 'Chá do Martin', homepageSubtext: 'Escolha um presente da lista!' }); const [claimingItemId, setClaimingItemId] = useState(null); const [claimNote, setClaimNote] = useState(''); const [isClaiming, setIsClaiming] = useState(false); const [claimError, setClaimError] = useState(''); const [justClaimedItemId, setJustClaimedItemId] = useState(null); const [justClaimedNote, setJustClaimedNote] = useState(''); const [isUnclaiming, setIsUnclaiming] = useState(false); const [unclaimError, setUnclaimError] = useState(''); useEffect(() => { bootstrap(); }, []); const bootstrap = async () => { try { const [settingsData, wishlists] = await Promise.all([ settingsApi.getSettings().catch(() => null), wishlistsApi.getAllPublic(), ]); if (settingsData) setSettings(settingsData); if (wishlists.length === 0) { setIsLoading(false); return; } const primary = wishlists[0]; setWishlist(primary); const itemsData = await itemsApi.getAll(primary.id); setItems(itemsData.sort((a, b) => a.sortOrder - b.sortOrder)); } catch (error) { console.error('Failed to load home page:', error); } finally { setIsLoading(false); } }; const refetchItems = async () => { if (!wishlist) return; const itemsData = await itemsApi.getAll(wishlist.id); setItems(itemsData.sort((a, b) => a.sortOrder - b.sortOrder)); }; const handleClaimItem = (itemId: string) => { setClaimingItemId(itemId); setClaimError(''); setClaimNote(''); setJustClaimedItemId(null); }; const handleSubmitClaim = async (e: React.FormEvent, itemId: string) => { e.preventDefault(); setIsClaiming(true); setClaimError(''); try { await claimingApi.claim(itemId, undefined, claimNote); setJustClaimedItemId(itemId); setJustClaimedNote(claimNote); setClaimingItemId(null); setClaimNote(''); await refetchItems(); } catch (err: any) { setClaimError(err.message || 'Erro ao reservar item'); } finally { setIsClaiming(false); } }; const handleUnclaim = async (itemId: string) => { if (!confirm('Tem certeza que deseja cancelar a reserva deste item?')) return; setIsUnclaiming(true); setUnclaimError(''); try { await claimingApi.unclaim(itemId); await refetchItems(); } catch (err: any) { setUnclaimError(err.message || 'Erro ao cancelar reserva'); } finally { setIsUnclaiming(false); } }; const filteredItems = showClaimed ? items : items.filter((item) => !item.claimedAt || item.id === justClaimedItemId); const formatPrice = (price: number | null, currency: string) => { if (!price) return null; return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: currency || 'BRL', }).format(price); }; return (
{isLoading ? (

Carregando...

) : !wishlist ? (

Nenhuma lista disponível ainda

) : ( <> {wishlist.preferences && (

Interesses e Preferências

{ const target = e.target as HTMLElement; if (target.tagName === 'A') { e.preventDefault(); window.open((target as HTMLAnchorElement).href, '_blank', 'noopener,noreferrer'); } }} />
)}
{filteredItems.length} de {items.length} itens
{filteredItems.length === 0 ? (

{showClaimed ? 'Nenhum item nesta lista ainda' : 'Todos os itens já foram reservados!'}

) : (
{filteredItems.map((item) => (
{item.imageUrl && (
{item.name}
)}

{item.name}

{item.description && (

{item.description}

)}
{item.purchaseUrls && item.purchaseUrls.length > 0 && ( )}
{justClaimedItemId === item.id ? (

Item reservado!

O status está confirmado.

{justClaimedNote && (

Sua nota: "{justClaimedNote}"

)}
) : item.claimedAt ? (

Reservado por {item.claimedByName}

{item.claimedByNote && (

Nota: {item.claimedByNote}

)} {item.isPurchased && (

✓ Comprado

)} {showClaimed && ( )}
) : claimingItemId === item.id ? (
handleSubmitClaim(e, item.id)} className="space-y-3"> {claimError && (
{claimError}
)}