'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 (
Search for artists, albums, and songs in your music library
No results found for "{searchQuery}"
Try different keywords or check your spelling
{song.title}
{song.artist} • {song.album}
Showing first 10 of {searchResults.songs.length} songs
Find your favorite artists, albums, and songs