From 6609e70fa86a3ea43747bb7ffbf347bcfe2956e7 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Mon, 22 Sep 2025 01:04:48 +0530 Subject: [PATCH] fix: local share action not working on iPad (#22238) fix: share photo not working on iPad Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- .../share_action_button.widget.dart | 2 +- .../infrastructure/action.provider.dart | 4 ++-- .../lib/repositories/asset_media.repository.dart | 16 +++++++++++----- mobile/lib/services/action.service.dart | 4 ++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart index 3c943f0501..740ac528b0 100644 --- a/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart @@ -42,7 +42,7 @@ class ShareActionButton extends ConsumerWidget { showDialog( context: context, builder: (BuildContext buildContext) { - ref.read(actionProvider.notifier).shareAssets(source).then((ActionResult result) { + ref.read(actionProvider.notifier).shareAssets(source, context).then((ActionResult result) { ref.read(multiSelectProvider.notifier).reset(); if (!context.mounted) { diff --git a/mobile/lib/providers/infrastructure/action.provider.dart b/mobile/lib/providers/infrastructure/action.provider.dart index f62791fb57..9a343aa358 100644 --- a/mobile/lib/providers/infrastructure/action.provider.dart +++ b/mobile/lib/providers/infrastructure/action.provider.dart @@ -342,11 +342,11 @@ class ActionNotifier extends Notifier { } } - Future shareAssets(ActionSource source) async { + Future shareAssets(ActionSource source, BuildContext context) async { final ids = _getAssets(source).toList(growable: false); try { - await _service.shareAssets(ids); + await _service.shareAssets(ids, context); return ActionResult(count: ids.length, success: true); } catch (error, stack) { _logger.severe('Failed to share assets', error, stack); diff --git a/mobile/lib/repositories/asset_media.repository.dart b/mobile/lib/repositories/asset_media.repository.dart index 83b5dfb9fd..bfcf7060e0 100644 --- a/mobile/lib/repositories/asset_media.repository.dart +++ b/mobile/lib/repositories/asset_media.repository.dart @@ -1,17 +1,19 @@ import 'dart:io'; +import 'package:flutter/widgets.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/exif.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/asset.entity.dart' as asset_entity; import 'package:immich_mobile/entities/store.entity.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/extensions/response_extensions.dart'; import 'package:immich_mobile/repositories/asset_api.repository.dart'; import 'package:immich_mobile/utils/hash.dart'; import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; import 'package:photo_manager/photo_manager.dart'; -import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; -import 'package:immich_mobile/extensions/response_extensions.dart'; import 'package:share_plus/share_plus.dart'; final assetMediaRepositoryProvider = Provider((ref) => AssetMediaRepository(ref.watch(assetApiRepositoryProvider))); @@ -68,7 +70,7 @@ class AssetMediaRepository { } // TODO: make this more efficient - Future shareAssets(List assets) async { + Future shareAssets(List assets, BuildContext context) async { final downloadedXFiles = []; for (var asset in assets) { @@ -105,8 +107,12 @@ class AssetMediaRepository { } // we dont want to await the share result since the - // "preparing" dialog will not disappear unti - Share.shareXFiles(downloadedXFiles).then((result) async { + // "preparing" dialog will not disappear until + final size = context.sizeData; + Share.shareXFiles( + downloadedXFiles, + sharePositionOrigin: Rect.fromPoints(Offset.zero, Offset(size.width / 3, size.height)), + ).then((result) async { for (var file in downloadedXFiles) { try { await File(file.path).delete(); diff --git a/mobile/lib/services/action.service.dart b/mobile/lib/services/action.service.dart index 4edd49fec2..9c3768080b 100644 --- a/mobile/lib/services/action.service.dart +++ b/mobile/lib/services/action.service.dart @@ -224,8 +224,8 @@ class ActionService { await _assetApiRepository.unStack(stackIds); } - Future shareAssets(List assets) { - return _assetMediaRepository.shareAssets(assets); + Future shareAssets(List assets, BuildContext context) { + return _assetMediaRepository.shareAssets(assets, context); } Future> downloadAll(List assets) {