refactor: split views/views.js into 6 focused modules
navigation.js — navigate(), history, closeHeaderSearch, _navGoBack home.js — home page, genres, album rows, loadArtists/loadAlbums, getArtistImage detail.js — artist/album/iTunes detail pages, quickPlay helpers, expandArtistBio playlists.js — playlists, playlist detail, reorder, starred, random search.js — local/header/global search, iTunes helpers, s_goArtist, playerBarGoX discover.js — new releases, recommendations (Last.fm + iTunes fallback) views.js — barrel re-export; all external imports unchanged Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
308a27d293
commit
2a2e5ea495
7 files changed
+1364
-1346
No files matched your search
@@ -0,0 +1,100 @@
|
||||
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 {}
|
||||
}
|
||||
Reference in new issue
Block a user