import { useTranslation } from 'react-i18next'; import { Radio, Heart, ChevronRight, ListMusic, Star, Share2 } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import { star, unstar } from '../../api/subsonicStarRating'; import type { SubsonicArtist } from '../../api/subsonicTypes'; import { useAuthStore } from '../../store/authStore'; import StarRating from '../StarRating'; import { ArtistToPlaylistSubmenu } from './AlbumArtistToPlaylistSubmenu'; import { MultiArtistToPlaylistSubmenu } from './MultiArtistToPlaylistSubmenu'; import type { ContextMenuItemsProps } from './contextMenuItemTypes'; export default function ArtistContextItems(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 === 'artist' && (() => { const artist = item as SubsonicArtist; const artistRatingDisabled = entityRatingSupport === 'track_only'; return ( <>
handleAction(() => startRadio(artist.id, artist.name))}> {t('contextMenu.startRadio')}
{offlinePolicy.canAddToPlaylist && (
{ cancelPlaylistSubmenuCloseTimer(); setPlaylistSongIds([`artist:${artist.id}`]); setPlaylistSubmenuOpen(true); }} onMouseLeave={onPlaylistSubmenuTriggerMouseLeave} > {t('contextMenu.addToPlaylist')} {playlistSubmenuOpen && playlistSongIds[0] === `artist:${artist.id}` && ( { setPlaylistSubmenuOpen(false); closeContextMenu(); }} /> )}
)}
handleAction(() => copyShareLink(shareKindOverride ?? 'artist', artist.id))}> {t('contextMenu.shareLink')}
{(offlinePolicy.canFavorite || offlinePolicy.canRate) && ( <>
{offlinePolicy.canFavorite && (
handleAction(() => { const starred = isStarred(artist.id, artist.starred); setStarredOverride(artist.id, !starred); const meta = { serverId: artist.serverId, name: artist.name, albumCount: artist.albumCount, }; return starred ? unstar(artist.id, 'artist', meta) : star(artist.id, 'artist', meta); })}> {isStarred(artist.id, artist.starred) ? t('contextMenu.unfavoriteArtist') : t('contextMenu.favoriteArtist')}
)} {offlinePolicy.canRate && (
e.stopPropagation()} > { setKeyboardRating({ kind: 'artist', id: artist.id, value: r }); applyArtistRating(artist, r); }} />
)} )} ); })()} {type === 'multi-artist' && (() => { const artists = item as SubsonicArtist[]; const artistIds = artists.map(a => a.id); const artistRatingDisabled = entityRatingSupport === 'track_only'; const multiArtistRatingId = [...artistIds].sort().join('\x1e'); const unifiedArtistRating = (() => { if (artists.length === 0) return 0; const vals = artists.map(a => userRatingOverrides[a.id] ?? a.userRating ?? 0); const first = vals[0]; return vals.every(v => v === first) ? first : 0; })(); return ( <>
{t('contextMenu.selectedArtists', { count: artists.length })}
{offlinePolicy.canAddToPlaylist && (
{ cancelPlaylistSubmenuCloseTimer(); setPlaylistSongIds([`multi-artist:${artistIds.join(',')}`]); setPlaylistSubmenuOpen(true); }} onMouseLeave={onPlaylistSubmenuTriggerMouseLeave} > {t('contextMenu.addToPlaylist')} {playlistSubmenuOpen && playlistSongIds[0] === `multi-artist:${artistIds.join(',')}` && ( { setPlaylistSubmenuOpen(false); closeContextMenu(); }} /> )}
)} {offlinePolicy.canRate && (
e.stopPropagation()} > { setKeyboardRating({ kind: 'artist', id: multiArtistRatingId, value: r }); for (const a of artists) applyArtistRating(a, r); }} />
)} ); })()} ); }