diff --git a/lib/core/application.dart b/lib/core/application.dart index 1c3176a..232ac46 100644 --- a/lib/core/application.dart +++ b/lib/core/application.dart @@ -105,6 +105,35 @@ class Application extends AppstreamComponent { String getUpdateTarget() => id; String launchCommand() => id; + + Application copyWith({bool? installed, bool? current, bool? featured}) { + return Application( + id: id, + package: package, + name: name, + summary: summary, + description: description, + developerName: developerName, + projectLicense: projectLicense, + projectGroup: projectGroup, + icons: icons, + urls: urls, + categories: categories, + screenshots: screenshots, + keywords: keywords, + compulsoryForDesktops: compulsoryForDesktops, + releases: releases, + provides: provides, + contentRatings: contentRatings, + custom: custom, + installed: installed ?? this.installed, + bundles: bundles, + remote: remote, + type: type, + current: current ?? this.current, + featured: featured ?? this.featured, + ); + } } extension _GetOrDefault on Map { diff --git a/lib/core/flatpak_application.dart b/lib/core/flatpak_application.dart index dd59feb..a29b528 100644 --- a/lib/core/flatpak_application.dart +++ b/lib/core/flatpak_application.dart @@ -164,4 +164,36 @@ class FlatpakApplication extends Application { String launchCommand() { return "flatpak run $id"; } + + @override + FlatpakApplication copyWith( + {bool? installed, bool? current, bool? featured}) { + return FlatpakApplication( + id: id, + package: package, + name: name, + summary: summary, + description: description, + developerName: developerName, + projectLicense: projectLicense, + projectGroup: projectGroup, + icons: icons, + urls: urls, + categories: categories, + screenshots: screenshots, + keywords: keywords, + compulsoryForDesktops: compulsoryForDesktops, + releases: releases, + provides: provides, + contentRatings: contentRatings, + custom: custom, + installed: installed ?? this.installed, + bundles: bundles, + remote: remote, + type: type, + deployDir: deployDir, + current: current ?? this.current, + featured: featured ?? this.featured, + ); + } } diff --git a/lib/providers/application_provider.dart b/lib/providers/application_provider.dart index 0cc9eca..4a4717e 100644 --- a/lib/providers/application_provider.dart +++ b/lib/providers/application_provider.dart @@ -77,29 +77,18 @@ final featuredAppList = FutureProvider>((ref) async { final appListProvider = Provider((ref) { final remoteApps = ref.watch(remoteAppListProvider).value ?? {}; final installedApps = ref.watch(installedAppListProvider); - final featuredApps = ref.watch(featuredAppList); - - for (var app in installedApps.entries) { - try { - remoteApps[app.key]!.installed = true; - remoteApps[app.key]!.current = app.value; - } catch (e) { - logger.w('Failed to find $app in installed list.'); - } - } + final featuredApps = ref.watch(featuredAppList).value ?? []; - if (featuredApps.hasValue) { - List featured = featuredApps.value!; - - for (var app in featured) { - try { - remoteApps[app]!.featured = true; - } catch (e) { - logger.w('Failed to find $app in featured list.'); - } - } - } - return remoteApps; + return remoteApps.map((id, app) { + return MapEntry( + id, + app.copyWith( + installed: installedApps.containsKey(id), + current: installedApps[id] ?? false, + featured: featuredApps.contains(id), + ), + ); + }); }); final searchKeywordsProvider = Provider((ref) { @@ -116,6 +105,8 @@ final liveApplicationProvider = Provider.family((ref, appId) { final allApps = ref.watch(appListProvider); + logger.i('Refreshed provider for $appId'); + return allApps[appId]; });