Files
lidify/frontend/features/artist/hooks/useDownloadActions.ts
2025-12-25 18:58:06 -06:00

104 lines
2.8 KiB
TypeScript

import { useCallback } from 'react';
import { api } from '@/lib/api';
import { toast } from 'sonner';
import { useDownloadContext } from '@/lib/download-context';
import { Artist, Album } from '../types';
export function useDownloadActions() {
const { addPendingDownload, isPendingByMbid } = useDownloadContext();
const downloadArtist = useCallback(
async (artist: Artist | null) => {
if (!artist) {
toast.error('No artist selected');
return;
}
if (!artist.mbid) {
toast.error('Artist MBID not available');
return;
}
// Check if already downloading
if (isPendingByMbid(artist.mbid)) {
toast.info(`${artist.name} is already being downloaded`);
return;
}
try {
// Add to pending downloads
addPendingDownload('artist', artist.name, artist.mbid);
// Show immediate feedback
toast.loading(`Preparing download: "${artist.name}"...`, {
id: `download-${artist.mbid}`,
});
// Trigger download
await api.downloadArtist(artist.name, artist.mbid);
// Update the loading toast to success
toast.success(`Downloading ${artist.name}`, {
id: `download-${artist.mbid}`,
});
} catch (error: any) {
console.error('Failed to download artist:', error);
toast.error(error.message || 'Failed to download artist', {
id: `download-${artist.mbid}`,
});
}
},
[addPendingDownload, isPendingByMbid]
);
const downloadAlbum = useCallback(
async (album: Album, artistName: string, e: React.MouseEvent) => {
e.preventDefault();
e.stopPropagation();
// Get MBID (prefer rgMbid, fallback to mbid)
const mbid = album.rgMbid || album.mbid;
if (!mbid) {
toast.error('Album MBID not available');
return;
}
// Check if already downloading
if (isPendingByMbid(mbid)) {
toast.info(`${album.title} is already being downloaded`);
return;
}
try {
// Add to pending downloads
addPendingDownload('album', `${artistName} - ${album.title}`, mbid);
// Show immediate feedback
toast.loading(`Preparing download: "${album.title}"...`, {
id: `download-${mbid}`,
});
// Trigger download
await api.downloadAlbum(artistName, album.title, mbid);
// Update the loading toast to success
toast.success(`Downloading ${album.title}`, {
id: `download-${mbid}`,
});
} catch (error: any) {
console.error('Failed to download album:', error);
toast.error(error.message || 'Failed to download album', {
id: `download-${mbid}`,
});
}
},
[addPendingDownload, isPendingByMbid]
);
return {
downloadArtist,
downloadAlbum,
};
}