import './style.css' const API_BASE_URL = '/api' const grid = document.getElementById('allLogoGrid') const loading = document.getElementById('allLoading') const empty = document.getElementById('allEmpty') const loadMoreBtn = document.getElementById('loadMoreBtn') const searchInput = document.getElementById('allLogoSearch') let page = 1 const limit = 20 let query = '' let isLoading = false let hasMore = true async function loadPage(reset = false) { if (isLoading) return if (reset) { page = 1 hasMore = true grid.innerHTML = '' empty.classList.add('hidden') loading.classList.remove('hidden') } else { loadMoreBtn.disabled = true loadMoreBtn.textContent = 'Načítání...' } isLoading = true try { const url = new URL(`${API_BASE_URL}/logos`, window.location.origin) url.searchParams.set('sort', 'recent') url.searchParams.set('limit', String(limit)) url.searchParams.set('page', String(page)) if (query) url.searchParams.set('q', query) const resp = await fetch(url.toString().replace(window.location.origin, '')) if (!resp.ok) throw new Error('Failed to fetch logos') const data = await resp.json() if (reset) loading.classList.add('hidden') if (Array.isArray(data) && data.length > 0) { appendCards(data) page += 1 if (data.length < limit) { hasMore = false loadMoreBtn.classList.add('hidden') } else { loadMoreBtn.classList.remove('hidden') } } else { if (reset) empty.classList.remove('hidden') hasMore = false loadMoreBtn.classList.add('hidden') } } catch (_) { if (reset) { loading.classList.add('hidden') empty.classList.remove('hidden') } } finally { isLoading = false loadMoreBtn.disabled = false loadMoreBtn.textContent = 'Načíst další' } } function appendCards(items) { const html = items.map(logo => { const logoUrl = `${API_BASE_URL}/logos/${logo.id}` return `
${logo.club_name}

${logo.club_name}

${logo.club_type || 'fotbal'}

` }).join('') grid.insertAdjacentHTML('beforeend', html) } grid.addEventListener('click', async (e) => { const delBtn = e.target.closest('.delete-logo') if (delBtn) { const card = delBtn.closest('.logo-card') const id = card.dataset.id const ok = confirm('Smazat toto logo?') if (!ok) return delBtn.disabled = true delBtn.textContent = 'Mazání...' try { const resp = await fetch(`${API_BASE_URL}/logos/${id}`, { method: 'DELETE' }) if (!resp.ok) throw new Error('Delete failed') card.remove() if (!grid.children.length) empty.classList.remove('hidden') } catch (_) { delBtn.textContent = 'Smazat' delBtn.disabled = false alert('Mazání selhalo') } return } const card = e.target.closest('.logo-card') if (card && !e.target.closest('.delete-logo')) { const id = card.dataset.id window.location.href = `/logo.html?id=${id}` } }) let searchTimer searchInput.addEventListener('input', () => { clearTimeout(searchTimer) searchTimer = setTimeout(() => { query = searchInput.value.trim() loadPage(true) }, 300) }) loadMoreBtn.addEventListener('click', () => { if (hasMore) loadPage(false) }) loadPage(true)