function selectLibrary(libraryId: string): void { localStorage.setItem('selectedLibrary', libraryId); document.querySelectorAll('.library-item').forEach(el => { el.classList.remove('ring-2'); el.classList.remove('ring-accent'); }); const selected = document.querySelector(`[data-library-id="${libraryId}"]`); if (selected) { selected.classList.add('ring-2'); selected.classList.add('ring-accent'); } loadBookshelf(libraryId); } async function loadBookshelf(libraryId: string): Promise { const token = localStorage.getItem('token'); if (!token) return; try { const response = await fetch(`/api/libraries/${libraryId}/books`, { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { const data = await response.json(); renderBooks(data.books || []); } } catch (error) { console.error('Failed to load bookshelf:', error); } } function renderBooks(books: unknown[]): void { const container = document.getElementById('books-grid'); if (!container) return; if (books.length === 0) { container.innerHTML = '

No books in this library

'; return; } container.innerHTML = books.map((book: any) => `
${book.cover_image_path ? `${book.title}` : `
📖
` }

${book.title}

${book.author || 'Unknown Author'}

`).join(''); } function selectBook(bookId: string): void { localStorage.setItem('selectedBook', bookId); window.location.href = `/books/${bookId}`; } function changePage(page: number): void { const libraryId = localStorage.getItem('selectedLibrary'); if (!libraryId) return; const offset = (page - 1) * 50; loadBookshelfPaginated(libraryId, offset); } async function loadBookshelfPaginated(libraryId: string, offset: number): Promise { const token = localStorage.getItem('token'); if (!token) return; try { const response = await fetch(`/api/libraries/${libraryId}/books?offset=${offset}&limit=50`, { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { const data = await response.json(); renderBooks(data.books || []); updatePagination(data.total, offset); } } catch (error) { console.error('Failed to load bookshelf:', error); } } function updatePagination(total: number, offset: number): void { const container = document.getElementById('pagination'); if (!container) return; const limit = 50; const currentPage = Math.floor(offset / limit) + 1; const totalPages = Math.ceil(total / limit); if (totalPages <= 1) { container.innerHTML = ''; return; } container.innerHTML = `
${currentPage > 1 ? `` : ''} Page ${currentPage} of ${totalPages} ${currentPage < totalPages ? `` : ''}
`; } (window as any).selectLibrary = selectLibrary; (window as any).loadBookshelf = loadBookshelf; (window as any).selectBook = selectBook; (window as any).changePage = changePage;