`; lastLeague = team.league; } html += `
`; }); teamListEl.innerHTML = html; teamListEl.querySelectorAll('.team-btn').forEach(btn => { btn.addEventListener('click', () => selectTeam(btn.dataset.team)); }); } function renderHeadlines(items){ if(!items || items.length === 0){ headlineListEl.innerHTML = `
No recent headlines found for this team.
`; return; } headlineListEl.innerHTML = items.map(it => `
${escapeHtml(it.title)}
${escapeHtml(it.source)} · ${timeAgo(it.pubDate)}
`).join(''); } async function fetchTeamNews(teamName){ const res = await fetch(buildApiUrl(teamName)); const data = await res.json(); if(data.status !== 'ok' || !Array.isArray(data.items)){ throw new Error('Bad response'); } const seen = new Set(); const items = []; for(const item of data.items){ const { title, source } = splitTitleSource(item.title || ''); if(seen.has(title)) continue; seen.add(title); items.push({ title, source, link: item.link, pubDate: item.pubDate }); if(items.length >= MAX_ITEMS) break; } return items; } async function loadTeam(teamName, force){ teamNameEl.textContent = teamName; if(!force && cache[teamName] && (Date.now() - cache[teamName].fetchedAt) < REFRESH_MS){ renderHeadlines(cache[teamName].items); updatedEl.textContent = 'Updated ' + timeAgo(new Date(cache[teamName].fetchedAt).toISOString().replace('T',' ').slice(0,19)); return; } headlineListEl.innerHTML = `
Loading latest headlines…
`; updatedEl.textContent = 'Loading…'; try{ const items = await fetchTeamNews(teamName); cache[teamName] = { items, fetchedAt: Date.now() }; renderHeadlines(items); updatedEl.textContent = 'Updated just now'; }catch(err){ const team = findTeam(teamName); const queryText = (team && team.query) ? team.query : teamName; headlineListEl.innerHTML = `
`; updatedEl.textContent = 'Update failed'; } } function selectTeam(teamName){ currentTeam = teamName; renderTeamList(); loadTeam(teamName, false); if(refreshTimer) clearInterval(refreshTimer); refreshTimer = setInterval(() => loadTeam(currentTeam, true), REFRESH_MS); } refreshBtn.addEventListener('click', () => loadTeam(currentTeam, true)); renderTeamList(); selectTeam(currentTeam);