diff --git a/packages/app_center/lib/manage/manage_page.dart b/packages/app_center/lib/manage/manage_page.dart index 5d9e19f50..b409473d6 100644 --- a/packages/app_center/lib/manage/manage_page.dart +++ b/packages/app_center/lib/manage/manage_page.dart @@ -243,6 +243,8 @@ class _ActionButtons extends ConsumerWidget { ref.watch(currentlyRefreshAllSnapsProvider).isNotEmpty; final hasInternet = updatesModel.value?.hasInternet ?? true; final isLoading = updatesModel.isLoading || localSnapsModel.isLoading; + final isSilentlyCheckingUpdates = + ref.watch(isSilentlyiCheckingUpdatesProvider); return Wrap( spacing: 10, @@ -250,13 +252,22 @@ class _ActionButtons extends ConsumerWidget { crossAxisAlignment: WrapCrossAlignment.center, children: [ PushButton.outlined( - onPressed: isRefreshingAll || updatesModel.hasError || isLoading + onPressed: isRefreshingAll || + updatesModel.hasError || + isLoading || + isSilentlyCheckingUpdates ? null - : () => ref.refresh(updatesModelProvider), + : ref.read(updatesModelProvider.notifier).silentUpdatesCheck, child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(YaruIcons.sync), + isSilentlyCheckingUpdates + ? const SizedBox( + width: 16, + height: 16, + child: YaruCircularProgressIndicator(strokeWidth: 3), + ) + : const Icon(YaruIcons.sync), const SizedBox(width: 8), Flexible( child: Text( diff --git a/packages/app_center/lib/manage/updates_model.dart b/packages/app_center/lib/manage/updates_model.dart index 7e37349f7..bb059f18d 100644 --- a/packages/app_center/lib/manage/updates_model.dart +++ b/packages/app_center/lib/manage/updates_model.dart @@ -33,6 +33,7 @@ class SnapListState with _$SnapListState { } final currentlyRefreshAllSnapsProvider = StateProvider>((_) => []); +final isSilentlyiCheckingUpdatesProvider = StateProvider((_) => false); @Riverpod(keepAlive: true) bool hasUpdate(HasUpdateRef ref, String snapName) { @@ -57,13 +58,34 @@ class UpdatesModel extends _$UpdatesModel { @override Future build() async { - final result = await connectionCheck( + final result = fetchRefreshableSnaps(); + return result; + } + + Future silentUpdatesCheck() async { + ref.read(isSilentlyiCheckingUpdatesProvider.notifier).state = true; + try { + final newSnapListState = await fetchRefreshableSnaps(); + final isSameList = const ListEquality().equals( + state.valueOrNull?.snaps.toList() ?? [], + newSnapListState.snaps.toList(), + ); + if (!isSameList || + newSnapListState.hasInternet != state.valueOrNull?.hasInternet) { + state = AsyncData(newSnapListState); + } + } finally { + ref.read(isSilentlyiCheckingUpdatesProvider.notifier).state = false; + } + } + + Future fetchRefreshableSnaps() { + return connectionCheck( () => _snapd .find(filter: SnapFindFilter.refresh) .then((snaps) => snaps.where((s) => s.name != kSnapName)), ref, ); - return result; } /// Used to remove a snap from the list without reloading the whole provider. diff --git a/packages/app_center/lib/manage/updates_model.g.dart b/packages/app_center/lib/manage/updates_model.g.dart index 5be6ea0d1..c94ecce24 100644 --- a/packages/app_center/lib/manage/updates_model.g.dart +++ b/packages/app_center/lib/manage/updates_model.g.dart @@ -174,7 +174,7 @@ final refreshInhibitSnapsProvider = ); typedef RefreshInhibitSnapsRef = AutoDisposeFutureProviderRef>; -String _$updatesModelHash() => r'2db8a558dfb3f056b73c540bace34e511da987d4'; +String _$updatesModelHash() => r'aed930d535be2a5bf6c0c143004edaf052de909a'; /// See also [UpdatesModel]. @ProviderFor(UpdatesModel)