diff --git a/mobile/lib/presentation/widgets/action_buttons/reorder_buttons_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/reorder_buttons_action_button.widget.dart new file mode 100644 index 0000000000..b7855ae3e1 --- /dev/null +++ b/mobile/lib/presentation/widgets/action_buttons/reorder_buttons_action_button.widget.dart @@ -0,0 +1,35 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart'; +import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart'; +import 'package:immich_mobile/presentation/widgets/asset_viewer/quick_action_configurator.widget.dart'; + +class ReorderButtonsActionButton extends ConsumerWidget { + const ReorderButtonsActionButton({super.key, this.originalTheme}); + + final ThemeData? originalTheme; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return BaseActionButton( + label: 'reorder_buttons'.tr(), + iconData: Icons.swap_vert, + iconColor: originalTheme?.iconTheme.color, + menuItem: true, + onPressed: () async { + final viewerNotifier = ref.read(assetViewerProvider.notifier); + viewerNotifier.setBottomSheet(true); + + await showModalBottomSheet( + context: context, + isScrollControlled: true, + enableDrag: false, + builder: (sheetContext) => const FractionallySizedBox(heightFactor: 0.75, child: QuickActionConfigurator()), + ).whenComplete(() { + viewerNotifier.setBottomSheet(false); + }); + }, + ); + } +} diff --git a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart index e794a96b70..193cf60220 100644 --- a/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart +++ b/mobile/lib/presentation/widgets/asset_viewer/top_app_bar.widget.dart @@ -10,7 +10,6 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/favorite_actio import 'package:immich_mobile/presentation/widgets/action_buttons/motion_photo_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart'; -import 'package:immich_mobile/presentation/widgets/asset_viewer/quick_action_configurator.widget.dart'; import 'package:immich_mobile/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart'; import 'package:immich_mobile/providers/activity.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart'; @@ -50,21 +49,6 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget { final originalTheme = context.themeData; - Future openConfigurator() async { - final viewerNotifier = ref.read(assetViewerProvider.notifier); - - viewerNotifier.setBottomSheet(true); - - await showModalBottomSheet( - context: context, - isScrollControlled: true, - enableDrag: false, - builder: (sheetContext) => const FractionallySizedBox(heightFactor: 0.75, child: QuickActionConfigurator()), - ).whenComplete(() { - viewerNotifier.setBottomSheet(false); - }); - } - final actions = [ if (asset.isMotionPhoto) const MotionPhotoActionButton(iconOnly: true), if (album != null && album.isActivityEnabled && album.isShared) diff --git a/mobile/lib/utils/action_button.utils.dart b/mobile/lib/utils/action_button.utils.dart index 4d565103af..161c6961b1 100644 --- a/mobile/lib/utils/action_button.utils.dart +++ b/mobile/lib/utils/action_button.utils.dart @@ -30,6 +30,7 @@ import 'package:immich_mobile/presentation/widgets/action_buttons/trash_action_b import 'package:immich_mobile/presentation/widgets/action_buttons/unarchive_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/unstack_action_button.widget.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/upload_action_button.widget.dart'; +import 'package:immich_mobile/presentation/widgets/action_buttons/reorder_buttons_action_button.widget.dart'; import 'package:immich_mobile/routing/router.dart'; class ActionButtonContext { @@ -219,6 +220,7 @@ class ViewerKebabMenuButtonContext { enum ViewerKebabMenuButtonType { openInfo, viewInTimeline, + reorderButtons, cast, download; @@ -228,6 +230,7 @@ enum ViewerKebabMenuButtonType { int get group => switch (this) { ViewerKebabMenuButtonType.openInfo => 0, ViewerKebabMenuButtonType.viewInTimeline => 1, + ViewerKebabMenuButtonType.reorderButtons => 1, ViewerKebabMenuButtonType.cast => 1, ViewerKebabMenuButtonType.download => 1, }; @@ -244,6 +247,7 @@ enum ViewerKebabMenuButtonType { context.isOwner, ViewerKebabMenuButtonType.cast => context.isCasting || context.asset.hasRemote, ViewerKebabMenuButtonType.download => context.asset.isRemoteOnly, + ViewerKebabMenuButtonType.reorderButtons => true, }; } @@ -270,6 +274,7 @@ enum ViewerKebabMenuButtonType { ), ViewerKebabMenuButtonType.cast => const CastActionButton(menuItem: true), ViewerKebabMenuButtonType.download => const DownloadActionButton(source: ActionSource.viewer, menuItem: true), + ViewerKebabMenuButtonType.reorderButtons => ReorderButtonsActionButton(originalTheme: context.originalTheme), }; } }