diff --git a/mobile/lib/widgets/asset_grid/immich_asset_grid_view.dart b/mobile/lib/widgets/asset_grid/immich_asset_grid_view.dart index c38e61a4735..d870c5abe2d 100644 --- a/mobile/lib/widgets/asset_grid/immich_asset_grid_view.dart +++ b/mobile/lib/widgets/asset_grid/immich_asset_grid_view.dart @@ -332,7 +332,7 @@ class ImmichAssetGridViewState extends ConsumerState { ); } - if (index != -1 && index < widget.renderList.elements.length) { + if (index < widget.renderList.elements.length) { // Not sure why the index is shifted, but it works. :3 _scrollToIndex(index + 1); } else { diff --git a/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart b/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart index 2cb90da599a..18dd5058e38 100644 --- a/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart +++ b/mobile/lib/widgets/asset_viewer/gallery_app_bar.dart @@ -5,6 +5,8 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/providers/album/current_album.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/current_asset.provider.dart'; +import 'package:immich_mobile/providers/asset_viewer/scroll_to_date_notifier.provider.dart'; +import 'package:immich_mobile/providers/tab.provider.dart'; import 'package:immich_mobile/widgets/album/add_to_album_bottom_sheet.dart'; import 'package:immich_mobile/providers/asset_viewer/download.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/show_controls.provider.dart'; @@ -95,6 +97,16 @@ class GalleryAppBar extends ConsumerWidget { ref.read(downloadStateProvider.notifier).downloadAsset(asset, context); } + handleLocateAsset() async { + // Go back to the gallery + await context.maybePop(); + await context + .navigateTo(const TabControllerRoute(children: [PhotosRoute()])); + ref.read(tabProvider.notifier).update((state) => state = TabEnum.home); + // Scroll to the asset's date + scrollToDateNotifierProvider.scrollToDate(asset.fileCreatedAt); + } + return IgnorePointer( ignoring: !showControls, child: AnimatedOpacity( @@ -107,6 +119,7 @@ class GalleryAppBar extends ConsumerWidget { isPartner: isPartner, asset: asset, onMoreInfoPressed: showInfo, + onLocatePressed: handleLocateAsset, onFavorite: toggleFavorite, onRestorePressed: () => handleRestore(asset), onUploadPressed: asset.isLocal ? () => handleUpload(asset) : null, diff --git a/mobile/lib/widgets/asset_viewer/top_control_app_bar.dart b/mobile/lib/widgets/asset_viewer/top_control_app_bar.dart index 2bdbb72ec03..ef8f2e687b0 100644 --- a/mobile/lib/widgets/asset_viewer/top_control_app_bar.dart +++ b/mobile/lib/widgets/asset_viewer/top_control_app_bar.dart @@ -5,6 +5,7 @@ import 'package:immich_mobile/providers/activity_statistics.provider.dart'; import 'package:immich_mobile/providers/album/current_album.provider.dart'; import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/providers/asset.provider.dart'; +import 'package:immich_mobile/providers/tab.provider.dart'; import 'package:immich_mobile/widgets/asset_viewer/motion_photo_button.dart'; class TopControlAppBar extends HookConsumerWidget { @@ -13,6 +14,7 @@ class TopControlAppBar extends HookConsumerWidget { required this.asset, required this.onMoreInfoPressed, required this.onDownloadPressed, + required this.onLocatePressed, required this.onAddToAlbumPressed, required this.onRestorePressed, required this.onFavorite, @@ -26,6 +28,7 @@ class TopControlAppBar extends HookConsumerWidget { final Function onMoreInfoPressed; final VoidCallback? onUploadPressed; final VoidCallback? onDownloadPressed; + final VoidCallback onLocatePressed; final VoidCallback onAddToAlbumPressed; final VoidCallback onRestorePressed; final VoidCallback onActivitiesPressed; @@ -54,6 +57,18 @@ class TopControlAppBar extends HookConsumerWidget { ); } + Widget buildLocateButton() { + return IconButton( + onPressed: () { + onLocatePressed(); + }, + icon: Icon( + Icons.image_search, + color: Colors.grey[200], + ), + ); + } + Widget buildMoreInfoButton() { return IconButton( onPressed: () { @@ -159,6 +174,8 @@ class TopControlAppBar extends HookConsumerWidget { shape: const Border(), actions: [ if (asset.isRemote && isOwner) buildFavoriteButton(a), + if (isOwner && ref.read(tabProvider.notifier).state != TabEnum.home) + buildLocateButton(), if (asset.livePhotoVideoId != null) const MotionPhotoButton(), if (asset.isLocal && !asset.isRemote) buildUploadButton(), if (asset.isRemote && !asset.isLocal && isOwner) buildDownloadButton(),