'use client'; import { useState, useEffect } from 'react'; import Image from 'next/image'; import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { AlbumArtwork } from '@/app/components/album-artwork'; import { ArtistIcon } from '@/app/components/artist-icon'; import { useNavidrome } from '@/app/components/NavidromeContext'; import { getNavidromeAPI, Artist, Album, Song } from '@/lib/navidrome'; import { useAudioPlayer } from '@/app/components/AudioPlayerContext'; import { Search, Play, Plus } from 'lucide-react'; export default function SearchPage() { const { search2 } = useNavidrome(); const { addToQueue, playTrack } = useAudioPlayer(); const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState<{ artists: Artist[]; albums: Album[]; songs: Song[]; }>({ artists: [], albums: [], songs: [] }); const [isSearching, setIsSearching] = useState(false); const api = getNavidromeAPI(); const handleSearch = async (query: string) => { if (query.trim() === '') { setSearchResults({ artists: [], albums: [], songs: [] }); return; } try { setIsSearching(true); const results = await search2(query); setSearchResults(results); } catch (error) { console.error('Search failed:', error); setSearchResults({ artists: [], albums: [], songs: [] }); } finally { setIsSearching(false); } }; useEffect(() => { const timeoutId = setTimeout(() => { handleSearch(searchQuery); }, 300); return () => clearTimeout(timeoutId); // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchQuery]); const handlePlaySong = (song: Song) => { if (!api) { console.error('Navidrome API not available'); return; } const track = { id: song.id, name: song.title, url: api.getStreamUrl(song.id), artist: song.artist, album: song.album, duration: song.duration, coverArt: song.coverArt ? api.getCoverArtUrl(song.coverArt, 300) : undefined, albumId: song.albumId, artistId: song.artistId, starred: !!song.starred }; playTrack(track); }; const handleAddToQueue = (song: Song) => { if (!api) { console.error('Navidrome API not available'); return; } const track = { id: song.id, name: song.title, url: api.getStreamUrl(song.id), artist: song.artist, album: song.album, duration: song.duration, coverArt: song.coverArt ? api.getCoverArtUrl(song.coverArt, 300) : undefined, albumId: song.albumId, artistId: song.artistId, starred: !!song.starred }; addToQueue(track); }; const formatDuration = (duration: number): string => { const minutes = Math.floor(duration / 60); const seconds = duration % 60; return `${minutes}:${seconds.toString().padStart(2, '0')}`; }; return (
{/* Header */}

Search

Search for artists, albums, and songs in your music library

{/* Search Input */}
setSearchQuery(e.target.value)} className="pl-10 text-lg h-12" />
{isSearching &&
Searching...
}
{/* Search Results */} {searchQuery && (
{searchResults.artists.length === 0 && searchResults.albums.length === 0 && searchResults.songs.length === 0 && !isSearching && (

No results found for "{searchQuery}"

Try different keywords or check your spelling

)} {/* Artists */} {searchResults.artists.length > 0 && (

Artists

{searchResults.artists.map((artist) => ( ))}
)} {/* Albums */} {searchResults.albums.length > 0 && (

Albums

{searchResults.albums.map((album) => ( ))}
)} {/* Songs */} {searchResults.songs.length > 0 && (

Songs

{searchResults.songs.slice(0, 10).map((song, index) => (
{index + 1}
{/* Song Cover */}
{song.album}
{/* Song Info */}

{song.title}

{song.artist} • {song.album}

{/* Duration */}
{formatDuration(song.duration)}
{/* Actions */}
))} {searchResults.songs.length > 10 && (

Showing first 10 of {searchResults.songs.length} songs

)}
)}
)} {/* Empty State */} {!searchQuery && (

Search your music

Find your favorite artists, albums, and songs

)}
); }