feat(ux): unify added-to-queue snackbars and add fetch retry

Every single-track enqueue now shows the shared added-to-queue
snackbar with a View action into Library (six call sites through one
helper). URL fetch failures in Home and via share intent gain a Retry
action; unrecognized-URL errors deliberately keep none since retrying
is deterministic.
This commit is contained in:
zarzet
2026-07-26 19:00:31 +07:00
parent 69830f6d46
commit 424ca5d77e
5 changed files with 42 additions and 34 deletions
+1 -6
View File
@@ -1638,12 +1638,7 @@ class _ArtistScreenState extends ConsumerState<ArtistScreen>
ref
.read(downloadQueueProvider.notifier)
.addToQueue(track, service, qualityOverride: quality);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.snackbarAddedToQueue(track.name)),
duration: const Duration(seconds: 2),
),
);
showAddedToQueueSnackBar(context, track.name);
}
if (settings.askQualityBeforeDownload || settings.allowQualityVariants) {
+16 -21
View File
@@ -543,9 +543,18 @@ class _HomeTabState extends ConsumerState<HomeTab>
: isRateLimit
? l10n.errorRateLimitedMessage
: l10n.errorUrlFetchFailed;
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(displayMessage)));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(displayMessage),
// Retrying an unrecognized URL is deterministic; skip the action.
action: errorMsg == 'url_not_recognized'
? null
: SnackBarAction(
label: l10n.dialogRetry,
onPressed: _fetchMetadata,
),
),
);
ref.read(trackProvider.notifier).clear();
} else {
_navigateToDetailIfNeeded();
@@ -649,11 +658,7 @@ class _HomeTabState extends ConsumerState<HomeTab>
ref
.read(downloadQueueProvider.notifier)
.addToQueue(track, service, qualityOverride: quality);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.snackbarAddedToQueue(track.name)),
),
);
showAddedToQueueSnackBar(context, track.name);
},
);
} else {
@@ -669,11 +674,7 @@ class _HomeTabState extends ConsumerState<HomeTab>
return;
}
ref.read(downloadQueueProvider.notifier).addToQueue(track, service);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.snackbarAddedToQueue(track.name)),
),
);
showAddedToQueueSnackBar(context, track.name);
}
}
}
@@ -1982,11 +1983,7 @@ class _HomeTabState extends ConsumerState<HomeTab>
ref
.read(downloadQueueProvider.notifier)
.addToQueue(track, service, qualityOverride: quality);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.snackbarAddedToQueue(track.name)),
),
);
showAddedToQueueSnackBar(context, track.name);
},
);
} else {
@@ -2002,9 +1999,7 @@ class _HomeTabState extends ConsumerState<HomeTab>
return;
}
ref.read(downloadQueueProvider.notifier).addToQueue(track, service);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.snackbarAddedToQueue(track.name))),
);
showAddedToQueueSnackBar(context, track.name);
}
}
+12 -3
View File
@@ -300,9 +300,18 @@ class _MainShellState extends ConsumerState<MainShell>
: isRateLimit
? l10n.errorRateLimitedMessage
: l10n.errorUrlFetchFailed;
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(displayMessage)));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(displayMessage),
// Retrying an unrecognized URL is deterministic; skip the action.
action: errorMsg == 'url_not_recognized'
? null
: SnackBarAction(
label: l10n.dialogRetry,
onPressed: () => _handleSharedUrl(url),
),
),
);
}
}