import React, { useEffect, useState } from 'react'; import { getRandomSongs, SubsonicSong, star, unstar } from '../api/subsonic'; import { usePlayerStore } from '../store/playerStore'; import { Play, Star, RefreshCw } from 'lucide-react'; import { useTranslation } from 'react-i18next'; function formatDuration(seconds: number): string { if (!seconds || isNaN(seconds)) return '0:00'; const m = Math.floor(seconds / 60); const s = seconds % 60; return `${m}:${s.toString().padStart(2, '0')}`; } export default function RandomMix() { const { t } = useTranslation(); const [songs, setSongs] = useState([]); const [loading, setLoading] = useState(true); const playTrack = usePlayerStore(s => s.playTrack); const enqueue = usePlayerStore(s => s.enqueue); const [starredSongs, setStarredSongs] = useState>(new Set()); const fetchSongs = () => { setLoading(true); getRandomSongs(50) .then(fetched => { setSongs(fetched); const st = new Set(); fetched.forEach(s => { if (s.starred) st.add(s.id); }); setStarredSongs(st); setLoading(false); }) .catch(() => setLoading(false)); }; useEffect(() => { fetchSongs(); }, []); const handlePlayAll = () => { if (songs.length > 0) playTrack(songs[0], songs); }; const toggleSongStar = async (song: SubsonicSong, e: React.MouseEvent) => { e.stopPropagation(); const currentlyStarred = starredSongs.has(song.id); const nextStarred = new Set(starredSongs); if (currentlyStarred) nextStarred.delete(song.id); else nextStarred.add(song.id); setStarredSongs(nextStarred); try { if (currentlyStarred) await unstar(song.id, 'song'); else await star(song.id, 'song'); } catch (err) { console.error('Failed to toggle song star', err); setStarredSongs(new Set(starredSongs)); } }; return (

{t('randomMix.title')}

{loading && songs.length === 0 ? (
) : (
{t('randomMix.trackTitle')} {t('randomMix.trackArtist')} {t('randomMix.trackAlbum')} {t('randomMix.trackFavorite')} {t('randomMix.trackDuration')}
{songs.map((song) => (
playTrack(song, songs)} role="row" draggable onDragStart={e => { e.dataTransfer.effectAllowed = 'copy'; const track = { id: song.id, title: song.title, artist: song.artist, album: song.album, albumId: song.albumId, artistId: song.artistId, duration: song.duration, coverArt: song.coverArt, track: song.track, year: song.year, bitRate: song.bitRate, suffix: song.suffix, userRating: song.userRating, }; e.dataTransfer.setData('text/plain', JSON.stringify({ type: 'song', track })); }} >
{song.title}
{song.artist}
{song.album}
{formatDuration(song.duration)}
))}
)}
); }