diff --git a/src/lib/components/views/PurchaseAlbumDetailView.svelte b/src/lib/components/views/PurchaseAlbumDetailView.svelte index 5efce9229..e7282ce33 100644 --- a/src/lib/components/views/PurchaseAlbumDetailView.svelte +++ b/src/lib/components/views/PurchaseAlbumDetailView.svelte @@ -2,6 +2,7 @@ import { onMount } from 'svelte'; import { get } from 'svelte/store'; import { t } from '$lib/i18n'; + import { invoke } from '@tauri-apps/api/core'; import { ArrowLeft, Download, Check, Loader2, AlertTriangle, Library, Play } from 'lucide-svelte'; import QualityBadge from '../QualityBadge.svelte'; import Dropdown from '../Dropdown.svelte'; @@ -10,6 +11,7 @@ import { purchaseDownloads, startAlbumDownload, startTrackDownload } from '$lib/stores/purchaseDownloadStore'; import type { TrackDownloadStatus } from '$lib/stores/purchaseDownloadStore'; import { formatDuration, getQobuzImage } from '$lib/adapters/qobuzAdapters'; + import { showToast } from '$lib/stores/toastStore'; import type { PurchasedAlbum, PurchasedTrack, PurchaseFormatOption } from '$lib/types/purchases'; import type { DisplayTrack } from '$lib/types'; @@ -44,6 +46,23 @@ const downloadStatuses = $derived(albumDlState?.trackStatuses ?? {}); const isDownloadingAll = $derived(albumDlState?.isDownloadingAll ?? false); const allComplete = $derived(albumDlState?.allComplete ?? false); + const downloadDestination = $derived(albumDlState?.destination ?? null); + + let addingToLibrary = $state(false); + + async function handleAddToLibrary() { + if (!downloadDestination || addingToLibrary) return; + addingToLibrary = true; + try { + await invoke('v2_library_add_folder', { path: downloadDestination }); + showToast(get(t)('purchases.addToLibrarySuccess'), 'success'); + } catch (err) { + console.error('Failed to add folder to library:', err); + showToast(get(t)('purchases.addToLibraryError'), 'error'); + } finally { + addingToLibrary = false; + } + } function formatPurchaseDate(ts?: number): string { if (!ts) return ''; @@ -301,10 +320,14 @@ {/if} - {#if allComplete} + {#if allComplete && downloadDestination}
- {$t('purchases.addToLibraryDesc')} diff --git a/src/lib/components/views/PurchasesView.svelte b/src/lib/components/views/PurchasesView.svelte index 038f0cf06..0e78c3126 100644 --- a/src/lib/components/views/PurchasesView.svelte +++ b/src/lib/components/views/PurchasesView.svelte @@ -101,6 +101,14 @@ $effect(() => { setUserItem('qbz-purchases-quality-filter', filterQuality); }); $effect(() => { setHideDownloaded(filterHideDownloaded); }); + /** Close all dropdown menus (mutual exclusion) */ + function closeAllMenus() { + showAlbumGroupMenu = false; + showAlbumSortMenu = false; + showFilterPanel = false; + showTrackGroupMenu = false; + } + const albumSortOptions = [ { value: 'date' as SortBy, labelKey: 'purchases.sort.date' }, { value: 'artist' as SortBy, labelKey: 'purchases.sort.artist' }, @@ -501,7 +509,7 @@