import React, { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Check, ListPlus, X } from 'lucide-react'; import { buildCoverArtUrl, coverArtCacheKey } from '../../api/subsonicStreamUrl'; import type { SubsonicSong } from '../../api/subsonicTypes'; import { usePlayerStore } from '../../store/playerStore'; import { songToTrack } from '../../utils/playback/songToTrack'; import { formatTrackTime } from '../../utils/format/formatDuration'; import CachedImage from '../CachedImage'; import { AddToPlaylistSubmenu } from '../ContextMenu'; function PlaylistSearchResultThumb({ coverArt }: { coverArt: string }) { const src = useMemo(() => buildCoverArtUrl(coverArt, 40), [coverArt]); const cacheKey = useMemo(() => coverArtCacheKey(coverArt, 40), [coverArt]); 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); next.has(song.id) ? next.delete(song.id) : next.add(song.id); return next; })} />
{song.title} {song.artist} ยท {song.album}
{formatTrackTime(song.duration ?? 0)}
); })}
); }