diff --git a/lib/models/nostr_adapter.dart b/lib/models/nostr_adapter.dart index 8fea903..5851562 100644 --- a/lib/models/nostr_adapter.dart +++ b/lib/models/nostr_adapter.dart @@ -188,7 +188,7 @@ class RelayListenerNotifier extends Notifier { Future fetch() async { await Future.microtask(() async { - await ref.read(latestReleasesAppProvider.notifier).fetch(); + await ref.read(latestReleasesAppProvider.notifier).fetchRemote(); await ref.apps.appAdapter.checkForUpdates(); }); } diff --git a/lib/utils/notifier.dart b/lib/utils/notifier.dart new file mode 100644 index 0000000..a6a850e --- /dev/null +++ b/lib/utils/notifier.dart @@ -0,0 +1,12 @@ +import 'package:flutter_data/flutter_data.dart'; + +abstract class PreloadingStateNotifier extends StateNotifier> { + final Ref ref; + PreloadingStateNotifier(this.ref) : super(AsyncLoading()) { + state = fetchLocal(); + fetchRemote(); + } + + AsyncValue fetchLocal(); + Future fetchRemote(); +} diff --git a/lib/widgets/latest_releases_container.dart b/lib/widgets/latest_releases_container.dart index 1801527..6cffdeb 100644 --- a/lib/widgets/latest_releases_container.dart +++ b/lib/widgets/latest_releases_container.dart @@ -6,6 +6,7 @@ import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:zapstore/main.data.dart'; import 'package:zapstore/models/app.dart'; +import 'package:zapstore/utils/notifier.dart'; import 'package:zapstore/widgets/app_card.dart'; class LatestReleasesContainer extends HookConsumerWidget { @@ -58,7 +59,7 @@ class LatestReleasesContainer extends HookConsumerWidget { onPressed: () async { return ref .read(latestReleasesAppProvider.notifier) - .fetch(next: true); + .fetchRemote(next: true); }, builder: (context, child, callback, state) { return Padding( @@ -83,16 +84,14 @@ class LatestReleasesContainer extends HookConsumerWidget { } } -class LatestReleasesAppNotifier extends StateNotifier>> { +class LatestReleasesAppNotifier extends PreloadingStateNotifier> { DateTime? _oldestCreatedAt; int _page = 1; - final Ref ref; - LatestReleasesAppNotifier(this.ref) : super(AsyncLoading()) { - fetch(); - } + LatestReleasesAppNotifier(super.ref); - Future fetch({bool next = false}) async { + @override + Future fetchRemote({bool next = false}) async { if (next) { _page++; } @@ -107,12 +106,17 @@ class LatestReleasesAppNotifier extends StateNotifier>> { }, ); - state = AsyncData(_fetchLocal()); + state = fetchLocal(); } - List _fetchLocal() { + @override + AsyncValue> fetchLocal() { final model = ref.apps.findAllLocal(); + if (model.isEmpty) { + return AsyncLoading(); + } + final apps = model .where((a) => a.latestMetadata != null) .sortedByLatest @@ -123,7 +127,7 @@ class LatestReleasesAppNotifier extends StateNotifier>> { if (apps.isNotEmpty) { _oldestCreatedAt = apps.last.createdAt; } - return apps; + return AsyncData(apps); } }