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);
}}
/>
)}
>
);
})()}
>
);
}