diff --git a/src/features/SongLists/SongLists.tsx b/src/features/SongLists/SongLists.tsx index 8ce38a0..1ac637c 100644 --- a/src/features/SongLists/SongLists.tsx +++ b/src/features/SongLists/SongLists.tsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react'; -import { ActionButton, SongItem, InfiniteScrollList } from '../../components/common'; +import React, { useState, useEffect, useRef } from 'react'; +import { ActionButton, SongItem } from '../../components/common'; import { useSongLists } from '../../hooks'; import { useAppSelector } from '../../redux'; import { selectSongList } from '../../redux'; @@ -8,6 +8,7 @@ import type { SongListSong, Song } from '../../types'; const SongLists: React.FC = () => { const { songLists, + allSongLists, hasMore, loadMore, checkSongAvailability, @@ -17,14 +18,45 @@ const SongLists: React.FC = () => { const songListData = useAppSelector(selectSongList); const songListCount = Object.keys(songListData).length; + const observerRef = useRef(null); + + // Intersection Observer for infinite scrolling + useEffect(() => { + console.log('SongLists - Setting up observer:', { hasMore, songListCount, itemsLength: songLists.length }); + + const observer = new IntersectionObserver( + (entries) => { + console.log('SongLists - Intersection detected:', { + isIntersecting: entries[0].isIntersecting, + hasMore, + songListCount + }); + + if (entries[0].isIntersecting && hasMore && songListCount > 0) { + console.log('SongLists - Loading more items'); + loadMore(); + } + }, + { threshold: 0.1 } + ); + + if (observerRef.current) { + observer.observe(observerRef.current); + } + + return () => observer.disconnect(); + }, [loadMore, hasMore, songListCount]); const [selectedSongList, setSelectedSongList] = useState(null); const [expandedSongs, setExpandedSongs] = useState>(new Set()); - // Debug logging - console.log('SongLists component - songList count:', songListCount); - console.log('SongLists component - songLists:', songLists); + // Debug logging - only log when data changes + useEffect(() => { + console.log('SongLists component - songList count:', songListCount); + console.log('SongLists component - songLists:', songLists); + }, [songListCount, songLists.length]); const handleSongListClick = (songListKey: string) => { + console.log('SongLists - handleSongListClick called with key:', songListKey); setSelectedSongList(songListKey); }; @@ -42,7 +74,23 @@ const SongLists: React.FC = () => { setExpandedSongs(newExpanded); }; - const selectedList = selectedSongList ? songLists.find(list => list.key === selectedSongList) : null; + const finalSelectedList = selectedSongList + ? allSongLists.find(list => list.key === selectedSongList) + : null; + + // Debug logging for modal + useEffect(() => { + console.log('SongLists - Modal state check:', { + selectedSongList, + finalSelectedList: !!finalSelectedList, + songListsLength: songLists.length + }); + if (selectedSongList) { + console.log('SongLists - Modal opened for song list:', selectedSongList); + console.log('SongLists - Selected list data:', finalSelectedList); + console.log('SongLists - About to render modal, finalSelectedList:', !!finalSelectedList); + } + }, [selectedSongList, finalSelectedList, songLists.length]); return (
@@ -59,49 +107,78 @@ const SongLists: React.FC = () => {
{/* Song Lists */} - ({ - ...songList, - title: songList.title, - artist: `${songList.songs.length} song${songList.songs.length !== 1 ? 's' : ''}`, - path: '', - disabled: false, - favorite: false, - }))} - isLoading={songListCount === 0} - hasMore={hasMore} - onLoadMore={loadMore} - onAddToQueue={() => {}} // Not applicable for song lists - onToggleFavorite={() => {}} // Not applicable for song lists - context="search" - title="Song Lists" - subtitle={`${songLists.length} song list${songLists.length !== 1 ? 's' : ''} available`} - emptyTitle="No song lists available" - emptyMessage="Song lists will appear here when they're available" - loadingTitle="Loading song lists..." - loadingMessage="Please wait while song lists are being loaded" - debugInfo={`Song lists loaded: ${songListCount}`} - renderExtraContent={(item) => ( -
- handleSongListClick(item.key!)} - variant="primary" - size="sm" - > - View Songs - +
+ {songListCount === 0 ? ( +
+
+ + + +
+

Loading song lists...

+

Please wait while song lists are being loaded

+
+ ) : songLists.length === 0 ? ( +
+
+ + + +
+

No song lists available

+

Song lists will appear here when they're available

+
+ ) : ( +
+ {songLists.map((songList) => ( +
+
+

+ {songList.title} +

+

+ {songList.songs.length} song{songList.songs.length !== 1 ? 's' : ''} +

+
+
+ handleSongListClick(songList.key!)} + variant="primary" + size="sm" + > + View Songs + +
+
+ ))} + + {/* Infinite scroll trigger */} + {hasMore && ( +
+
+ + + + + Loading more song lists... +
+
+ )}
)} - /> +
{/* Song List Modal */} - {selectedList && ( -
-
+ {finalSelectedList && ( +
+

- {selectedList.title} + TEST MODAL - {finalSelectedList.title}

{
- {selectedList.songs.map((songListSong: SongListSong) => { + {finalSelectedList.songs.map((songListSong: SongListSong, idx) => { const availableSongs = checkSongAvailability(songListSong); const isExpanded = expandedSongs.has(songListSong.key!); const isAvailable = availableSongs.length > 0; return ( -
+
{/* Song List Song Row */}
@@ -153,8 +230,8 @@ const SongLists: React.FC = () => { {/* Available Songs (when expanded) */} {isExpanded && isAvailable && (
- {availableSongs.map((song: Song) => ( -
+ {availableSongs.map((song: Song, sidx) => ( +
{ }, [songLists.length, allSongLists.length, currentPage]); const loadMore = useCallback(() => { + const endIndex = currentPage * ITEMS_PER_PAGE; + const hasMoreItems = endIndex < allSongLists.length; + console.log('useSongLists - loadMore called:', { - hasMore, + hasMoreItems, currentPage, allSongListsLength: allSongLists.length, - songListsLength: songLists.length + endIndex }); - if (hasMore) { + + if (hasMoreItems) { console.log('useSongLists - Incrementing page from', currentPage, 'to', currentPage + 1); setCurrentPage(prev => prev + 1); } else { console.log('useSongLists - Not loading more because hasMore is false'); } - }, [hasMore, currentPage, allSongLists.length, songLists.length]); + }, [currentPage, allSongLists.length]); // Check if a song exists in the catalog const checkSongAvailability = useCallback((songListSong: SongListSong) => {