Revert "move favorite into button context"

This reverts commit c4ac46e1b0.
This commit is contained in:
timonrieger
2026-07-06 13:31:27 +02:00
parent c4ac46e1b0
commit e35cbecfc1
3 changed files with 4 additions and 74 deletions
@@ -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 = <Widget>[
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),
];
-10
View File
@@ -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])),
};
}
@@ -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<ActionIconButtonWidget>());
expect(ActionButtonType.favorite.buildButton(context, null, false, true), isA<ActionMenuItemWidget>());
});
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();