import React, { useEffect, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; import { Play, Search } from 'lucide-react'; import { search, SearchResults as ISearchResults, SubsonicSong } from '../api/subsonic'; import { usePlayerStore, songToTrack } from '../store/playerStore'; import AlbumRow from '../components/AlbumRow'; import ArtistRow from '../components/ArtistRow'; import { useTranslation } from 'react-i18next'; function formatDuration(s: number) { return `${Math.floor(s / 60)}:${(s % 60).toString().padStart(2, '0')}`; } export default function SearchResults() { const { t } = useTranslation(); const [params] = useSearchParams(); const query = params.get('q') ?? ''; const [results, setResults] = useState(null); const [loading, setLoading] = useState(false); const playTrack = usePlayerStore(s => s.playTrack); const currentTrack = usePlayerStore(s => s.currentTrack); useEffect(() => { if (!query.trim()) { setResults(null); return; } setLoading(true); search(query, { artistCount: 20, albumCount: 20, songCount: 50 }) .then(r => setResults(r)) .finally(() => setLoading(false)); }, [query]); const hasResults = results && (results.artists.length || results.albums.length || results.songs.length); const playSong = (song: SubsonicSong, list: SubsonicSong[]) => { playTrack(songToTrack(song), list.map(songToTrack)); }; return (

{query ? t('search.resultsFor', { query }) : t('search.title')}

{loading && (
)} {!loading && query && !hasResults && (
{t('search.noResults', { query })}
)} {!loading && results && ( <> {results.artists.length > 0 && ( )} {results.albums.length > 0 && ( )} {results.songs.length > 0 && (

{t('search.songs')}

{t('albumDetail.trackTitle')}
{t('albumDetail.trackArtist')}
{t('search.album')}
{t('albumDetail.trackFormat')}
{t('albumDetail.trackDuration')}
{results.songs.map(song => (
playSong(song, results.songs)} role="row" draggable onDragStart={e => { e.dataTransfer.effectAllowed = 'copy'; const track = songToTrack(song); e.dataTransfer.setData('text/plain', JSON.stringify({ type: 'song', track })); }} >
{song.title}
{song.artist}
{song.album}
{[song.suffix?.toUpperCase(), song.bitRate ? `${song.bitRate} kbps` : ''].filter(Boolean).join(' ยท ')} {formatDuration(song.duration)}
))}
)} )}
); }