import { useTranslation } from 'react-i18next'; import { Play, ChevronRight, ListMusic, Trash2 } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import type { SubsonicPlaylist } from '../../api/subsonicTypes'; import { useAuthStore } from '../../store/authStore'; import { usePlaylistStore } from '../../store/playlistStore'; import { MultiPlaylistToPlaylistSubmenu, SinglePlaylistToPlaylistSubmenu } from './PlaylistToPlaylistSubmenus'; import type { ContextMenuItemsProps } from './contextMenuItemTypes'; export default function PlaylistContextItems(props: ContextMenuItemsProps) { const { type, item, queueIndex, playlistId, playlistSongIndex, shareKindOverride, playTrack, playNext, enqueue, removeTrack, queue, currentTrack, closeContextMenu, starredOverrides, setStarredOverride, lastfmLovedCache, setLastfmLovedForSong, openSongInfo, userRatingOverrides, setKeyboardRating, keyboardRating, playlistSubmenuOpen, setPlaylistSubmenuOpen, cancelPlaylistSubmenuCloseTimer, onPlaylistSubmenuTriggerMouseLeave, playlistSongIds, setPlaylistSongIds, orbitRole, entityRatingSupport, audiomuseNavidromeEnabled, applySongRating, applyAlbumRating, applyArtistRating, handleAction, startRadio, startInstantMix, downloadAlbum, copyShareLink, isStarred, offlinePolicy, } = props; const { t } = useTranslation(); const auth = useAuthStore(); const navigate = useNavigate(); return ( <> {type === 'playlist' && (() => { const playlist = item as SubsonicPlaylist; return ( <>
handleAction(() => navigate(`/playlists/${playlist.id}`))}> {t('contextMenu.playNow')}
{offlinePolicy.canAddToPlaylist && (
{ cancelPlaylistSubmenuCloseTimer(); setPlaylistSongIds([`playlist:${playlist.id}`]); setPlaylistSubmenuOpen(true); }} onMouseLeave={onPlaylistSubmenuTriggerMouseLeave} > {t('contextMenu.addToPlaylist')} {playlistSubmenuOpen && playlistSongIds[0] === `playlist:${playlist.id}` && ( { setPlaylistSubmenuOpen(false); closeContextMenu(); }} /> )}
)} {offlinePolicy.canEditPlaylist && ( <>
handleAction(async () => { const { showToast } = await import('../../utils/ui/toast'); const { deletePlaylist } = await import('../../api/subsonicPlaylists'); const { removeId } = usePlaylistStore.getState(); try { await deletePlaylist(playlist.id); removeId(playlist.id); // Update local playlist state without page reload to preserve audio playback state usePlaylistStore.setState((s) => ({ playlists: s.playlists.filter((p) => p.id !== playlist.id), })); showToast(t('playlists.deleteSuccess', { count: 1 }), 3000, 'info'); } catch { showToast(t('playlists.deleteFailed', { name: playlist.name }), 3000, 'error'); } })}> {t('playlists.deletePlaylist')}
)} ); })()} {type === 'multi-playlist' && (() => { const selectedPlaylists = item as SubsonicPlaylist[]; const playlistIds = selectedPlaylists.map(p => p.id); return ( <>
{t('contextMenu.selectedPlaylists', { count: selectedPlaylists.length })}
{offlinePolicy.canAddToPlaylist && (
{ cancelPlaylistSubmenuCloseTimer(); setPlaylistSongIds([`multi-playlist:${playlistIds.join(',')}`]); setPlaylistSubmenuOpen(true); }} onMouseLeave={onPlaylistSubmenuTriggerMouseLeave} > {t('contextMenu.addToPlaylist')} {playlistSubmenuOpen && playlistSongIds[0] === `multi-playlist:${playlistIds.join(',')}` && ( { setPlaylistSubmenuOpen(false); closeContextMenu(); }} /> )}
)} {offlinePolicy.canEditPlaylist && (
handleAction(async () => { const { showToast } = await import('../../utils/ui/toast'); const { deletePlaylist } = await import('../../api/subsonicPlaylists'); const { removeId } = usePlaylistStore.getState(); const deletedIds: string[] = []; for (const pl of selectedPlaylists) { try { await deletePlaylist(pl.id); removeId(pl.id); deletedIds.push(pl.id); } catch { showToast(t('playlists.deleteFailed', { name: pl.name }), 3000, 'error'); } } if (deletedIds.length > 0) { // Update local playlist state without page reload to preserve audio playback state usePlaylistStore.setState((s) => ({ playlists: s.playlists.filter((p) => !deletedIds.includes(p.id)), })); showToast(t('playlists.deleteSuccess', { count: deletedIds.length }), 3000, 'info'); } })}> {t('playlists.deleteSelected')}
)} ); })()} ); }