From 6d895652ca0d760a9a16edee599c533e9a5b87c3 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Mon, 7 Oct 2024 10:01:18 +0200 Subject: [PATCH] fix: Use `UpdateButton` on SnapPage (#1827) Use the `UpdateButton` from the manage page on the snap page too so that we get info like "Quit to update" Fixes: #1773 --- .../lib/manage/manage_snap_tile.dart | 69 +----------------- .../app_center/lib/manage/update_button.dart | 73 +++++++++++++++++++ packages/app_center/lib/snapd/snap_page.dart | 55 +++++++++----- .../app_center/test/manage_page_test.dart | 2 +- 4 files changed, 112 insertions(+), 87 deletions(-) create mode 100644 packages/app_center/lib/manage/update_button.dart diff --git a/packages/app_center/lib/manage/manage_snap_tile.dart b/packages/app_center/lib/manage/manage_snap_tile.dart index b15361a7b..80a41c722 100644 --- a/packages/app_center/lib/manage/manage_snap_tile.dart +++ b/packages/app_center/lib/manage/manage_snap_tile.dart @@ -1,6 +1,7 @@ import 'package:app_center/l10n.dart'; import 'package:app_center/layout.dart'; import 'package:app_center/manage/manage_l10n.dart'; +import 'package:app_center/manage/update_button.dart'; import 'package:app_center/snapd/snap_action.dart'; import 'package:app_center/snapd/snapd.dart'; import 'package:app_center/store/store.dart'; @@ -260,7 +261,7 @@ class _ButtonBar extends ConsumerWidget { ) else ...[ if (showUpdateButton) - _UpdateButton(snapModel: snapModel, activeChangeId: activeChangeId), + UpdateButton(snapModel: snapModel, activeChangeId: activeChangeId), if (!showUpdateButton && canOpen) OutlinedButton( onPressed: snapLauncher.open, @@ -275,69 +276,3 @@ class _ButtonBar extends ConsumerWidget { ]; } } - -class _UpdateButton extends ConsumerWidget { - const _UpdateButton({ - required this.snapModel, - required this.activeChangeId, - }); - - final AsyncValue snapModel; - final String? activeChangeId; - - @override - Widget build(BuildContext context, WidgetRef ref) { - final l10n = AppLocalizations.of(context); - final shouldQuitToUpdate = - snapModel.valueOrNull?.localSnap?.refreshInhibit != null; - final snap = - snapModel.valueOrNull?.localSnap ?? snapModel.valueOrNull?.storeSnap; - - if (shouldQuitToUpdate) { - return const QuitToUpdateNotice(); - } else { - return OutlinedButton( - onPressed: activeChangeId != null || !snapModel.hasValue - ? null - : ref.read(snapModelProvider(snap!.name).notifier).refresh, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon(YaruIcons.download), - const SizedBox(width: kSpacingSmall), - Text( - l10n.snapActionUpdateLabel, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ), - ); - } - } -} - -@visibleForTesting -class QuitToUpdateNotice extends StatelessWidget { - const QuitToUpdateNotice({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context); - final colorScheme = Theme.of(context).colorScheme; - - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(YaruIcons.warning_filled, color: colorScheme.warning), - const SizedBox(width: 8), - Text( - l10n.managePageQuitToUpdate, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.bodyMedium, - ), - ], - ); - } -} diff --git a/packages/app_center/lib/manage/update_button.dart b/packages/app_center/lib/manage/update_button.dart new file mode 100644 index 000000000..741fef8a4 --- /dev/null +++ b/packages/app_center/lib/manage/update_button.dart @@ -0,0 +1,73 @@ +import 'package:app_center/l10n.dart'; +import 'package:app_center/layout.dart'; +import 'package:app_center/snapd/snapd.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:yaru/yaru.dart'; + +class UpdateButton extends ConsumerWidget { + const UpdateButton({ + required this.snapModel, + required this.activeChangeId, + super.key, + }); + + final AsyncValue snapModel; + final String? activeChangeId; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final l10n = AppLocalizations.of(context); + final shouldQuitToUpdate = + snapModel.valueOrNull?.localSnap?.refreshInhibit != null; + final snap = + snapModel.valueOrNull?.localSnap ?? snapModel.valueOrNull?.storeSnap; + + if (shouldQuitToUpdate) { + return const QuitToUpdateNotice(); + } else { + return OutlinedButton( + onPressed: activeChangeId != null || !snapModel.hasValue + ? null + : ref.read(snapModelProvider(snap!.name).notifier).refresh, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(YaruIcons.download), + const SizedBox(width: kSpacingSmall), + Text( + l10n.snapActionUpdateLabel, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ); + } + } +} + +@visibleForTesting +class QuitToUpdateNotice extends StatelessWidget { + const QuitToUpdateNotice({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context); + final colorScheme = Theme.of(context).colorScheme; + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(YaruIcons.warning_filled, color: colorScheme.warning), + const SizedBox(width: 8), + Text( + l10n.managePageQuitToUpdate, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ); + } +} diff --git a/packages/app_center/lib/snapd/snap_page.dart b/packages/app_center/lib/snapd/snap_page.dart index 8d8ba0fd7..478451614 100644 --- a/packages/app_center/lib/snapd/snap_page.dart +++ b/packages/app_center/lib/snapd/snap_page.dart @@ -5,6 +5,7 @@ import 'package:app_center/extensions/string_extensions.dart'; import 'package:app_center/l10n.dart'; import 'package:app_center/layout.dart'; import 'package:app_center/manage/local_snap_providers.dart'; +import 'package:app_center/manage/update_button.dart'; import 'package:app_center/ratings/ratings.dart'; import 'package:app_center/snapd/snap_action.dart'; import 'package:app_center/snapd/snap_report.dart'; @@ -345,27 +346,43 @@ class _SnapActionButtons extends ConsumerWidget { ); final secondaryActions = [ - if (snapData.hasUpdate) SnapAction.update, - SnapAction.remove, + ( + action: SnapAction.update, + widget: UpdateButton( + snapModel: ref.watch(snapModelProvider(snapData.name)), + activeChangeId: snapData.activeChangeId, + ), + ), + (action: SnapAction.remove, widget: null), ]; final secondaryActionsButton = MenuAnchor( - menuChildren: secondaryActions.map((action) { - final color = action == SnapAction.remove - ? Theme.of(context).colorScheme.error - : null; - return MenuItemButton( - onPressed: action.callback(snapData, snapModel, snapLauncher), - child: IntrinsicWidth( - child: ListTile( - mouseCursor: SystemMouseCursors.click, - title: Text( - action.label(l10n), - style: TextStyle(color: color), - ), - ), - ), - ); - }).toList(), + menuChildren: [ + ...secondaryActions.map((entry) { + final (:action, :widget) = entry; + final color = action == SnapAction.remove + ? Theme.of(context).colorScheme.error + : null; + return widget == null + ? MenuItemButton( + onPressed: action.callback(snapData, snapModel, snapLauncher), + child: IntrinsicWidth( + child: ListTile( + mouseCursor: SystemMouseCursors.click, + title: Text( + action.label(l10n), + style: TextStyle(color: color), + ), + ), + ), + ) + : IntrinsicWidth( + child: ListTile( + mouseCursor: SystemMouseCursors.click, + title: widget, + ), + ); + }), + ], builder: (context, controller, child) => YaruOptionButton( onPressed: () { if (controller.isOpen) { diff --git a/packages/app_center/test/manage_page_test.dart b/packages/app_center/test/manage_page_test.dart index 383b54a6b..7564edb54 100644 --- a/packages/app_center/test/manage_page_test.dart +++ b/packages/app_center/test/manage_page_test.dart @@ -1,7 +1,7 @@ import 'package:app_center/constants.dart'; import 'package:app_center/manage/local_snap_providers.dart'; import 'package:app_center/manage/manage.dart'; -import 'package:app_center/manage/manage_snap_tile.dart'; +import 'package:app_center/manage/update_button.dart'; import 'package:app_center/manage/updates_model.dart'; import 'package:app_center/snapd/snapd.dart'; import 'package:app_center/widgets/widgets.dart';