fix(TagEditor): use selected result object instead of just ID

- Store full RemoteAlbumSearchResult instead of provider_id only
- Apply uses provider from selected result, not from dropdown
- Prevents mismatch when user changes provider after searching
This commit is contained in:
vicrodh committed 2026-01-26 20:31:59 -06:00
1 parent e0d2439f56
commit 186a249c45
1 file changed
+13 -14
@@ -96,7 +96,7 @@
let remoteSearching = $state(false); let remoteSearching = $state(false);
let remoteLoading = $state(false); let remoteLoading = $state(false);
let remoteResults = $state<RemoteAlbumSearchResult[]>([]); let remoteResults = $state<RemoteAlbumSearchResult[]>([]);
let selectedRemoteId = $state<string | null>(null); let selectedResult = $state<RemoteAlbumSearchResult | null>(null);
let showRemotePanel = $state(false); let showRemotePanel = $state(false);
let hasSearched = $state(false); let hasSearched = $state(false);
@@ -142,7 +142,7 @@
resetFromAlbum(); resetFromAlbum();
// Reset remote state when modal opens // Reset remote state when modal opens
remoteResults = []; remoteResults = [];
selectedRemoteId = null; selectedResult = null;
showRemotePanel = false; showRemotePanel = false;
hasSearched = false; hasSearched = false;
} }
@@ -157,7 +157,7 @@
remoteSearching = true; remoteSearching = true;
remoteResults = []; remoteResults = [];
selectedRemoteId = null; selectedResult = null;
try { try {
const results = await invoke<RemoteAlbumSearchResult[]>('remote_metadata_search', { const results = await invoke<RemoteAlbumSearchResult[]>('remote_metadata_search', {
@@ -179,13 +179,13 @@
} }
async function applyRemoteMetadata() { async function applyRemoteMetadata() {
if (!selectedRemoteId) return; if (!selectedResult) return;
remoteLoading = true; remoteLoading = true;
try { try {
const metadata = await invoke<RemoteAlbumMetadata>('remote_metadata_get_album', { const metadata = await invoke<RemoteAlbumMetadata>('remote_metadata_get_album', {
provider: remoteProvider, provider: selectedResult.provider,
providerId: selectedRemoteId providerId: selectedResult.provider_id
}); });
// Apply album-level metadata // Apply album-level metadata
@@ -215,7 +215,7 @@
} }
} }
const providerName = remoteProvider === 'musicbrainz' ? 'MusicBrainz' : 'Discogs'; const providerName = selectedResult?.provider === 'musicbrainz' ? 'MusicBrainz' : 'Discogs';
if (hasMismatch) { if (hasMismatch) {
showToast( showToast(
`Applied from ${providerName}. Track count differs: local=${localTrackCount}, remote=${remoteTrackCount}`, `Applied from ${providerName}. Track count differs: local=${localTrackCount}, remote=${remoteTrackCount}`,
@@ -248,9 +248,8 @@
} }
async function openInBrowser() { async function openInBrowser() {
const selected = remoteResults.find(r => r.provider_id === selectedRemoteId); if (!selectedResult) return;
if (!selected) return; const url = getSourceUrl(selectedResult);
const url = getSourceUrl(selected);
try { try {
await openUrl(url); await openUrl(url);
} catch (err) { } catch (err) {
@@ -456,8 +455,8 @@
{#each remoteResults as result (result.provider_id)} {#each remoteResults as result (result.provider_id)}
<button <button
class="remote-result" class="remote-result"
class:selected={selectedRemoteId === result.provider_id} class:selected={selectedResult?.provider_id === result.provider_id}
onclick={() => selectedRemoteId = result.provider_id} onclick={() => selectedResult = result}
type="button" type="button"
> >
<span class="result-title">{result.title}</span> <span class="result-title">{result.title}</span>
@@ -482,7 +481,7 @@
<button <button
class="btn btn-ghost btn-xs" class="btn btn-ghost btn-xs"
onclick={openInBrowser} onclick={openInBrowser}
disabled={!selectedRemoteId} disabled={!selectedResult}
type="button" type="button"
title="Open in browser" title="Open in browser"
> >
@@ -495,7 +494,7 @@
<button <button
class="btn btn-primary btn-sm" class="btn btn-primary btn-sm"
onclick={applyRemoteMetadata} onclick={applyRemoteMetadata}
disabled={!selectedRemoteId || remoteLoading} disabled={!selectedResult || remoteLoading}
type="button" type="button"
> >
{#if remoteLoading} {#if remoteLoading}