feat(TagEditor): show real-time progress when writing tags

Backend:
- Emit 'library:tag_write_progress' events with current/total count
- Progress updates as each file is written

Frontend:
- Listen for progress events during direct write mode
- Save button shows "Writing X of Y..." dynamically
- Cleanup listener on completion or error
This commit is contained in:
vicrodh committed 2026-01-26 20:46:38 -06:00
1 parent f1ff7d4698
commit 65adf352b6
2 files changed
+29 -2

No files matched your search

@@ -1,6 +1,7 @@
<script lang="ts">
import Modal from './Modal.svelte';
import { invoke } from '@tauri-apps/api/core';
import { listen, type UnlistenFn } from '@tauri-apps/api/event';
import { ask } from '@tauri-apps/plugin-dialog';
import { openUrl } from '@tauri-apps/plugin-opener';
import { showToast } from '$lib/stores/toastStore';
@@ -90,6 +91,7 @@
let albumTotalDiscs = $state(1);
let persistence: PersistenceMode = $state('sidecar');
let saving = $state(false);
let writeProgress = $state<{ current: number; total: number } | null>(null);
// Remote metadata search state
let remoteProvider: RemoteProvider = $state('musicbrainz');
@@ -345,10 +347,17 @@
if (!payload) return;
saving = true;
writeProgress = null;
let unlisten: UnlistenFn | null = null;
try {
if (persistence === 'sidecar') {
await invoke('library_update_album_metadata', { request: payload });
} else {
// Listen for progress events
unlisten = await listen<{ current: number; total: number }>('library:tag_write_progress', (event) => {
writeProgress = event.payload;
});
await invoke('library_write_album_metadata_to_files', { request: payload });
}
showToast('Album metadata saved', 'success');
@@ -357,6 +366,8 @@
} catch (err) {
alert(`Failed to save metadata: ${err}`);
} finally {
if (unlisten) unlisten();
writeProgress = null;
saving = false;
}
}
@@ -571,7 +582,13 @@
<button class="btn btn-primary" onclick={handleSave} disabled={saving}>
{#if saving}
<span class="spinner-inline"></span>
{persistence === 'direct' ? 'Writing tags...' : 'Saving...'}
{#if writeProgress}
Writing {writeProgress.current} of {writeProgress.total}...
{:else if persistence === 'direct'}
Writing tags...
{:else}
Saving...
{/if}
{:else}
Save
{/if}