import { S } from '../state.js'; import { closeSidebar, switchNavMode } from '../ui/ui.js'; import { closeNowPlaying, closeNpMenu } from '../player/nowplaying.js'; import { loadSpotifyImporter } from './spotify.js'; import { loadSoundCloudImporter } from './soundcloud.js'; // Circular — safe (all calls happen inside function bodies) import { loadHomeData, loadAlbumRow, loadArtists, loadAlbums, loadGenreDetail } from './home.js'; import { loadArtistDetail, loadArtistAllSongs, loadAlbumDetail, loadItunesAlbumDetail } from './detail.js'; import { loadPlaylists, loadPlaylistDetail, loadStarred, loadRandom } from './playlists.js'; import { loadNewReleases, loadRecommendations } from './discover.js'; // ─── NAVIGATION HISTORY ─── export function _navSave() { try { sessionStorage.setItem('ns_nav', JSON.stringify({stack: S._navStack, cursor: S._navCursor})); } catch {} } export function _navLoad() { try { const s = JSON.parse(sessionStorage.getItem('ns_nav') || 'null'); if(s && Array.isArray(s.stack) && s.stack.length) { S._navStack = s.stack; S._navCursor = s.cursor; return true; } } catch {} return false; } export function closeHeaderSearch() { const overlay = document.getElementById('header-search-overlay'); const input = document.getElementById('header-search-input'); const clearBtn = document.getElementById('header-search-clear'); if (overlay) overlay.style.display = 'none'; if (input) input.value = ''; if (clearBtn) clearBtn.style.display = 'none'; clearTimeout(S._headerSearchTimer); } export function navigate(page, data=null) { closeHeaderSearch(); document.querySelectorAll('.page').forEach(p => p.classList.remove('active')); document.querySelectorAll('.nav-item,.bnav-item').forEach(n => n.classList.remove('active','active-blue')); const cls = ['discover','new-releases','recommendations','spotify-importer'].includes(page) ? 'active-blue' : 'active'; document.querySelectorAll(`[data-page="${page}"]`).forEach(el => el.classList.add(cls)); const pageEl = document.getElementById(`page-${page}`); if(pageEl) { pageEl.classList.add('active'); document.getElementById('main-content').scrollTop = 0; } closeSidebar(); if(['discover','new-releases','recommendations','random','spotify-importer'].includes(page)) switchNavMode('discover'); else if(['home','artists','albums','starred','playlists'].includes(page)) switchNavMode('library'); if(page==='home') loadHomeData(); if(page==='artists' && !document.getElementById('artists-grid').children.length) loadArtists(); if(page==='albums' && !document.getElementById('albums-grid').children.length) loadAlbums(); if(page==='starred') loadStarred(); if(page==='random') loadRandom(); if(page==='artist-detail' && data) loadArtistDetail(data); if(page==='artist-all-songs' && data) loadArtistAllSongs(data); if(page==='album-detail' && data) loadAlbumDetail(data); if(page==='genre-detail' && data) loadGenreDetail(data); if(page==='itunes-album-detail'&& data) loadItunesAlbumDetail(data); if(page==='new-releases') loadNewReleases(); if(page==='playlists') loadPlaylists(); if(page==='playlist-detail' && data) loadPlaylistDetail(data); if(page==='recommendations') loadRecommendations(); if(page==='spotify-importer') { loadSpotifyImporter(); loadSoundCloudImporter(); } if(page==='audiobooks') { import('./abs.js').then(m => { if (S.abs.currentLibraryId) m.loadAbsBooks(S.abs.currentLibraryId); }); } if(page==='abs-book-detail' && data) { import('./abs.js').then(m => m.loadAbsBookDetail(data.id)); } if(!S._navJumping) { S._navStack = S._navStack.slice(0, S._navCursor + 1); const safe = data ? JSON.parse(JSON.stringify(data)) : null; const last = S._navStack[S._navCursor]; if(!last || last.page !== page || JSON.stringify(last.data) !== JSON.stringify(safe)) { S._navStack.push({ page, data: safe }); } S._navCursor = S._navStack.length - 1; _navSave(); try { history.pushState({ nsIdx: S._navCursor }, '', ''); } catch {} } } export function _navGoBack() { if(document.getElementById('np-sheet')?.classList.contains('open')) { closeNpMenu(); return; } if(S.npOpen) { closeNowPlaying(); return; } if(S._navCursor > 0) { S._navCursor--; const entry = S._navStack[S._navCursor]; _navSave(); S._navJumping = true; navigate(entry.page, entry.data); S._navJumping = false; } try { history.pushState({ nsIdx: S._navCursor }, '', ''); } catch {} }