const $ = (sel) => document.querySelector(sel); const $$ = (sel) => Array.from(document.querySelectorAll(sel)); const playerInput = $('#player'); const resultsEl = $('#results'); const searchBtn = $('#searchBtn'); async function fetchJSON(url) { const res = await fetch(url); if (!res.ok) throw new Error(`Request failed ${res.status}`); return res.json(); } async function search() { resultsEl.innerHTML = ''; const player = playerInput.value.trim(); if (!player) { resultsEl.innerHTML = `
Enter a player name to search.
`; return; } const params = new URLSearchParams(); params.set('player', player); try { const data = await fetchJSON(`/api/ebay/search?${params.toString()}`); renderResults(data.results || []); } catch (e) { console.error(e); resultsEl.innerHTML = `
Something went wrong. Try again.
`; } } function renderResults(items) { if (!items.length) { resultsEl.innerHTML = `
No cards found. Try adjusting filters or the name.
`; return; } const tpl = document.getElementById('card-template'); items.forEach(c => { const node = tpl.content.firstElementChild.cloneNode(true); const img = node.querySelector('.card-img'); img.src = c.image || ''; img.alt = c.title || 'Listing image'; const title = node.querySelector('.player'); title.textContent = c.title || 'Sold listing'; const price = (c.price ? `${c.currency || ''} ${Number(c.price).toFixed(2)}` : ''); const ended = (c.ended ? new Date(c.ended).toLocaleString() : ''); node.querySelector('.secondary').textContent = [price, ended].filter(Boolean).join(' • '); // Wrap card with link to eBay node.addEventListener('click', () => { if (c.url) window.open(c.url, '_blank'); }); resultsEl.appendChild(node); }); } searchBtn.addEventListener('click', () => { search(); }); // Press Enter to search playerInput.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); search(); } });