diff --git a/mobile/lib/presentation/widgets/asset_viewer/viewer_top_app_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/viewer_top_app_bar.widget.dart index 243439b63e..9cb255ef25 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/viewer_top_app_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/viewer_top_app_bar.widget.dart @@ -2,9 +2,10 @@ import 'package:auto_route/auto_route.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/presentation/actions/action.widget.dart'; +import 'package:immich_mobile/presentation/actions/favorite.action.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/motion_photo_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart'; import 'package:immich_mobile/providers/activity.provider.dart'; @@ -13,7 +14,6 @@ import 'package:immich_mobile/providers/infrastructure/asset_viewer/asset.provid import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart'; import 'package:immich_mobile/providers/routes.provider.dart'; -import 'package:immich_mobile/utils/action_button.utils.dart'; import 'package:immich_mobile/utils/timezone.dart'; import 'package:immich_ui/immich_ui.dart'; @@ -42,24 +42,11 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget { double opacity = ref.watch(assetViewerProvider.select((s) => s.backgroundOpacity)) * (showingControls ? 1 : 0); final originalTheme = context.themeData; - - // favorite only consumes `asset`/`isInLockedView`; other fields are unused placeholders. - final favoriteContext = ActionButtonContext( - asset: asset, - isOwner: false, - isArchived: false, - isTrashEnabled: false, - isStacked: false, - isInLockedView: isInLockedView, - currentAlbum: album, - advancedTroubleshooting: false, - source: ActionSource.viewer, - ); + final assetForAction = [asset]; final actions = [ if (asset.isMotionPhoto) const MotionPhotoActionButton(iconOnly: true), - if (ActionButtonType.favorite.shouldShow(favoriteContext)) - ActionButtonType.favorite.buildButton(favoriteContext, context, true), + ActionIconButtonWidget(action: FavoriteAction(assets: assetForAction)), ViewerKebabMenu(originalTheme: originalTheme), ]; diff --git a/mobile/lib/utils/action_button.utils.dart b/mobile/lib/utils/action_button.utils.dart index 83f1b44caa..1efaa189b8 100644 --- a/mobile/lib/utils/action_button.utils.dart +++ b/mobile/lib/utils/action_button.utils.dart @@ -9,7 +9,6 @@ import 'package:immich_mobile/domain/services/timeline.service.dart'; import 'package:immich_mobile/domain/utils/event_stream.dart'; import 'package:immich_mobile/presentation/actions/action.widget.dart'; import 'package:immich_mobile/presentation/actions/asset_debug.action.dart'; -import 'package:immich_mobile/presentation/actions/favorite.action.dart'; import 'package:immich_mobile/utils/semver.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart'; @@ -75,7 +74,6 @@ class ActionButtonContext { enum ActionButtonType { openInfo, - favorite, openActivity, likeActivity, share, @@ -188,9 +186,6 @@ enum ActionButtonType { context.asset is RemoteAsset && // context.isOwner, ActionButtonType.openInfo => true, - ActionButtonType.favorite => - !context.isInLockedView && // - context.asset.hasRemote, ActionButtonType.viewInTimeline => context.timelineOrigin != TimelineOrigin.main && context.timelineOrigin != TimelineOrigin.deepLink && @@ -216,7 +211,6 @@ enum ActionButtonType { ActionButtonType.openActivity || ActionButtonType.likeActivity => position != ButtonPosition.bottomBar || context.timelineOrigin != TimelineOrigin.trash, ActionButtonType.editImage => position != ButtonPosition.bottomBar || context.currentAlbum?.isShared != true, - ActionButtonType.favorite => false, _ => true, }; @@ -328,10 +322,6 @@ enum ActionButtonType { ActionButtonType.editImage => EditImageActionButton(iconOnly: iconOnly, menuItem: menuItem), ActionButtonType.addTo => AddActionButton(originalTheme: context.originalTheme), ActionButtonType.openActivity => OpenActivityActionButton(iconOnly: iconOnly, menuItem: menuItem), - ActionButtonType.favorite => - menuItem - ? ActionMenuItemWidget(action: FavoriteAction(assets: [context.asset])) - : ActionIconButtonWidget(action: FavoriteAction(assets: [context.asset])), }; } diff --git a/mobile/test/utils_legacy/action_button_utils_test.dart b/mobile/test/utils_legacy/action_button_utils_test.dart index e1b91eb560..9adeb2a3f7 100644 --- a/mobile/test/utils_legacy/action_button_utils_test.dart +++ b/mobile/test/utils_legacy/action_button_utils_test.dart @@ -4,7 +4,6 @@ import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/services/timeline.service.dart'; -import 'package:immich_mobile/presentation/actions/action.widget.dart'; import 'package:immich_mobile/utils/action_button.utils.dart'; import 'package:immich_mobile/utils/semver.dart'; @@ -1145,52 +1144,6 @@ void main() { }); }); - group('ActionButtonType.favorite', () { - ActionButtonContext contextFor(BaseAsset asset, {bool isInLockedView = false}) { - return ActionButtonContext( - asset: asset, - isOwner: true, - isArchived: false, - isTrashEnabled: true, - isInLockedView: isInLockedView, - currentAlbum: null, - advancedTroubleshooting: false, - isStacked: false, - source: ActionSource.viewer, - ); - } - - test('shouldShow is true for a remote asset outside locked view', () { - expect(ActionButtonType.favorite.shouldShow(contextFor(createRemoteAsset())), isTrue); - }); - - test('shouldShow is false in locked view', () { - expect(ActionButtonType.favorite.shouldShow(contextFor(createRemoteAsset(), isInLockedView: true)), isFalse); - }); - - test('shouldShow is false for a local-only asset', () { - expect(ActionButtonType.favorite.shouldShow(contextFor(createLocalAsset())), isFalse); - }); - - test('is excluded from the bottom bar and kebab menu positions', () { - final context = contextFor(createRemoteAsset()); - expect(ActionButtonType.favorite.showsAt(ButtonPosition.bottomBar, context), isFalse); - expect(ActionButtonType.favorite.showsAt(ButtonPosition.kebabMenu, context), isFalse); - }); - - test('buildButton returns an icon button by default and a menu item for menuItem', () { - final context = contextFor(createRemoteAsset()); - expect(ActionButtonType.favorite.buildButton(context), isA()); - expect(ActionButtonType.favorite.buildButton(context, null, false, true), isA()); - }); - - test('does not appear in the viewer bottom bar or kebab menu builders', () { - final context = contextFor(createRemoteAsset()); - expect(ActionButtonBuilder.getViewerBottomBarTypes(context), isNot(contains(ActionButtonType.favorite))); - expect(ActionButtonBuilder.getViewerKebabMenuTypes(context), isNot(contains(ActionButtonType.favorite))); - }); - }); - group('ActionButtonBuilder', () { test('should return buttons that should show', () { final remoteAsset = createRemoteAsset();