import { parseClassList } from './utils'; const setActiveDiscoverTab = (clickedTab: Element): void => { const group = clickedTab.closest('[data-tab-group="discover"]'); if (!group) { return; } // reset all tabs in group const triggers = group.querySelectorAll('[data-tab-trigger]'); triggers.forEach(tab => { const activeClasses = parseClassList(tab.getAttribute('data-tab-active-classes')); const inactiveClasses = parseClassList(tab.getAttribute('data-tab-inactive-classes')); tab.classList.remove(...activeClasses); tab.classList.add(...inactiveClasses); }); // mark clicked tab as active const activeClasses = parseClassList(clickedTab.getAttribute('data-tab-active-classes')); const inactiveClasses = parseClassList(clickedTab.getAttribute('data-tab-inactive-classes')); clickedTab.classList.remove(...inactiveClasses); clickedTab.classList.add(...activeClasses); }; const onDiscoverTabClick = (event: MouseEvent): void => { const target = event.target; if (!(target instanceof Element)) { return; } const trigger = target.closest('[data-tab-trigger]'); if (!trigger) { return; } setActiveDiscoverTab(trigger); }; const initDiscoverTabs = (): void => { document.addEventListener('click', onDiscoverTabClick); }; initDiscoverTabs(); const initSurpriseMe = (): void => { let isFetchingRandom = false; const onClick = async (): Promise => { if (isFetchingRandom) return; const btn = document.getElementById('surprise-btn') as HTMLButtonElement | null; if (!btn) return; isFetchingRandom = true; const spinner = document.getElementById('surprise-spinner'); const text = document.getElementById('surprise-text'); const icon = document.getElementById('surprise-icon'); btn.disabled = true; spinner?.classList.remove('hidden'); icon?.classList.add('hidden'); if (text) text.textContent = 'Picking…'; try { const res = await fetch(`/api/jikan/random/anime?t=${Date.now()}`, { cache: 'no-store' }); if (!res.ok) throw new Error('Failed to fetch random anime'); const json = (await res.json()) as unknown; const data = (json as { data?: unknown }).data as { mal_id?: unknown } | undefined; const malId = typeof data?.mal_id === 'number' ? data.mal_id : 0; if (malId > 0) { window.location.href = `/anime/${malId}`; return; } throw new Error('Random anime missing mal_id'); } catch (error) { console.error(error); alert('Could not pick a random anime right now. Please try again.'); } finally { isFetchingRandom = false; btn.disabled = false; spinner?.classList.add('hidden'); icon?.classList.remove('hidden'); if (text) text.textContent = 'Surprise Me'; } }; document.addEventListener('click', e => { const target = e.target; if (!(target instanceof Element)) return; const surprise = target.closest('[data-surprise-me]'); if (!surprise) return; void onClick(); }); }; initSurpriseMe();