diff --git a/lib/components/fallbacks/error_box.dart b/lib/components/fallbacks/error_box.dart index fd56cb58..0724158f 100644 --- a/lib/components/fallbacks/error_box.dart +++ b/lib/components/fallbacks/error_box.dart @@ -1,5 +1,7 @@ import 'package:auto_route/auto_route.dart'; +import 'package:dio/dio.dart'; import 'package:flutter/services.dart'; +import 'package:spotube/collections/routes.gr.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; @@ -121,7 +123,15 @@ class ErrorBox extends StatelessWidget { }, child: Text(context.l10n.view_logs), ), - if (onRetry != null) + if (error is DioException && error.response?.statusCode == 401) + Button.text( + leading: const Icon(SpotubeIcons.settings), + onPressed: () { + context.navigateTo(const SettingsMetadataProviderRoute()); + }, + child: Text(context.l10n.install_a_metadata_provider), + ) + else if (onRetry != null) Button.text( leading: const Icon(SpotubeIcons.refresh), onPressed: onRetry, diff --git a/lib/modules/metadata_plugins/installed_plugin.dart b/lib/modules/metadata_plugins/installed_plugin.dart index 7abda5ec..6d4a737c 100644 --- a/lib/modules/metadata_plugins/installed_plugin.dart +++ b/lib/modules/metadata_plugins/installed_plugin.dart @@ -83,7 +83,7 @@ class MetadataInstalledPluginItem extends HookConsumerWidget { final repoOwner = repoUrl?.pathSegments.firstOrNull; final isOfficial = - repoUrl?.host == "github.com" && repoOwner == "KRTirtho"; + repoUrl?.host == "github.com" && ["KRTirtho", "spotube"].contains(repoOwner); return Basic( leading: snapshot.hasData diff --git a/lib/modules/metadata_plugins/plugin_repository.dart b/lib/modules/metadata_plugins/plugin_repository.dart index 9bd71f0a..6ff3519f 100644 --- a/lib/modules/metadata_plugins/plugin_repository.dart +++ b/lib/modules/metadata_plugins/plugin_repository.dart @@ -57,7 +57,7 @@ class MetadataPluginRepositoryItem extends HookConsumerWidget { .downloadAndCachePlugin(pluginRepo.repoUrl); if (!context.mounted) return; - final isOfficialPlugin = pluginRepo.owner == "KRTirtho"; + final isOfficialPlugin = ["KRTirtho", "spotube"].contains(pluginRepo.owner); final isAllowed = isOfficialPlugin ? true @@ -157,7 +157,7 @@ class MetadataPluginRepositoryItem extends HookConsumerWidget { child: Text(context.l10n.install), ), ), - if (pluginRepo.owner != "KRTirtho") + if (!["KRTirtho", "spotube"].contains(pluginRepo.owner)) Text.rich( TextSpan( children: [ @@ -181,7 +181,7 @@ class MetadataPluginRepositoryItem extends HookConsumerWidget { spacing: 8, runSpacing: 8, children: [ - if (pluginRepo.owner == "KRTirtho") + if (["KRTirtho", "spotube"].contains(pluginRepo.owner)) PrimaryBadge( leading: const Icon(SpotubeIcons.done), child: Text(context.l10n.official),