import React from 'react'; import { useTranslation } from 'react-i18next'; import { Check, ListPlus, X } from 'lucide-react'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import { usePlayerStore } from '@/store/playerStore'; import { songToTrack } from '@/utils/playback/songToTrack'; import { formatTrackTime } from '@/lib/format/formatDuration'; import { AlbumCoverArtImage } from '@/cover/AlbumCoverArtImage'; import { COVER_DENSE_SEARCH_CSS_PX } from '@/cover/layoutSizes'; import { AddToPlaylistSubmenu } from '@/components/ContextMenu'; function PlaylistSearchResultThumb({ albumId, coverArt }: { albumId: string; coverArt: string }) { return ( ); } interface Props { query: string; setQuery: (v: string) => void; searching: boolean; searchResults: SubsonicSong[]; setSearchResults: React.Dispatch>; selectedSearchIds: Set; setSelectedSearchIds: React.Dispatch>>; searchPlPickerOpen: boolean; setSearchPlPickerOpen: React.Dispatch>; contextMenuSongId: string | null; setContextMenuSongId: React.Dispatch>; addSong: (song: SubsonicSong) => void; } export default function PlaylistSongSearchPanel({ query, setQuery, searching, searchResults, setSearchResults, selectedSearchIds, setSelectedSearchIds, searchPlPickerOpen, setSearchPlPickerOpen, contextMenuSongId, setContextMenuSongId, addSong, }: Props) { const { t } = useTranslation(); const openContextMenu = usePlayerStore(s => s.openContextMenu); return (
setQuery(e.target.value)} autoFocus /> {query && ( )}
{searching &&
} {!searching && query && searchResults.length === 0 && (
{t('playlists.noResults')}
)} {selectedSearchIds.size > 0 && (
{t('common.bulkSelected', { count: selectedSearchIds.size })}
{searchPlPickerOpen && ( { setSearchPlPickerOpen(false); setSelectedSearchIds(new Set()); }} /> )}
)} {searchResults.map(song => { const isSelected = selectedSearchIds.has(song.id); return (
addSong(song)} onContextMenu={e => { e.preventDefault(); setContextMenuSongId(song.id); openContextMenu(e.clientX, e.clientY, songToTrack(song), 'album-song'); }} > e.stopPropagation()} onChange={() => setSelectedSearchIds(prev => { const next = new Set(prev); if (next.has(song.id)) next.delete(song.id); else next.add(song.id); return next; })} />
{song.title} {song.artist} ยท {song.album}
{formatTrackTime(song.duration ?? 0)}
); })}
); }