diff --git a/mobile/assets/i18n/en-US.json b/mobile/assets/i18n/en-US.json index 0f8ed9dff..eb2472c1b 100644 --- a/mobile/assets/i18n/en-US.json +++ b/mobile/assets/i18n/en-US.json @@ -142,8 +142,9 @@ "control_bottom_app_bar_archive": "Archive", "control_bottom_app_bar_create_new_album": "Create new album", "control_bottom_app_bar_delete_from_immich": "Delete from Immich", + "control_bottom_app_bar_trash_from_immich": "Move to Trash", "control_bottom_app_bar_delete_from_local": "Delete from device", - "control_bottom_app_bar_delete": "Delete Everywhere", + "control_bottom_app_bar_delete": "Remove Everywhere", "control_bottom_app_bar_edit_location": "Edit Location", "control_bottom_app_bar_edit_time": "Edit Date & Time", "control_bottom_app_bar_favorite": "Favorite", diff --git a/mobile/lib/modules/home/ui/control_bottom_app_bar.dart b/mobile/lib/modules/home/ui/control_bottom_app_bar.dart index 9b3280f53..b24aad5a3 100644 --- a/mobile/lib/modules/home/ui/control_bottom_app_bar.dart +++ b/mobile/lib/modules/home/ui/control_bottom_app_bar.dart @@ -122,7 +122,9 @@ class ControlBottomAppBar extends ConsumerWidget { constraints: const BoxConstraints(maxWidth: 85), child: ControlBoxButton( iconData: Icons.cloud_off_outlined, - label: "control_bottom_app_bar_delete_from_immich".tr(), + label: trashEnabled + ? "control_bottom_app_bar_trash_from_immich".tr() + : "control_bottom_app_bar_delete_from_immich".tr(), onPressed: enabled ? () => handleRemoteDelete( !trashEnabled, diff --git a/mobile/lib/modules/trash/providers/trashed_asset.provider.dart b/mobile/lib/modules/trash/providers/trashed_asset.provider.dart index 04f8d5f16..177e7d2d4 100644 --- a/mobile/lib/modules/trash/providers/trashed_asset.provider.dart +++ b/mobile/lib/modules/trash/providers/trashed_asset.provider.dart @@ -2,6 +2,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/modules/home/ui/asset_grid/asset_grid_data_structure.dart'; import 'package:immich_mobile/modules/trash/services/trash.service.dart'; import 'package:immich_mobile/shared/models/asset.dart'; +import 'package:immich_mobile/shared/providers/asset.provider.dart'; import 'package:immich_mobile/shared/providers/db.provider.dart'; import 'package:immich_mobile/shared/providers/user.provider.dart'; import 'package:immich_mobile/shared/services/sync.service.dart'; @@ -47,6 +48,33 @@ class TrashNotifier extends StateNotifier { } } + Future removeAssets(Iterable assetList) async { + try { + final user = _ref.read(currentUserProvider); + if (user == null) { + return false; + } + + final isRemoved = await _ref + .read(assetProvider.notifier) + .deleteRemoteOnlyAssets(assetList, force: true); + + if (isRemoved) { + final idsToRemove = + assetList.where((a) => a.isRemote).map((a) => a.remoteId!).toList(); + + _ref + .read(syncServiceProvider) + .handleRemoteAssetRemoval(idsToRemove.cast().toList()); + } + + return isRemoved; + } catch (error, stack) { + _log.severe("Cannot empty trash ${error.toString()}", error, stack); + } + return false; + } + Future restoreAssets(Iterable assetList) async { try { final result = await _trashService.restoreAssets(assetList); diff --git a/mobile/lib/modules/trash/views/trash_page.dart b/mobile/lib/modules/trash/views/trash_page.dart index 46cd325f0..d99cacc0b 100644 --- a/mobile/lib/modules/trash/views/trash_page.dart +++ b/mobile/lib/modules/trash/views/trash_page.dart @@ -10,7 +10,6 @@ import 'package:immich_mobile/modules/home/ui/asset_grid/immich_asset_grid.dart' import 'package:immich_mobile/modules/home/ui/delete_dialog.dart'; import 'package:immich_mobile/modules/trash/providers/trashed_asset.provider.dart'; import 'package:immich_mobile/shared/models/asset.dart'; -import 'package:immich_mobile/shared/providers/asset.provider.dart'; import 'package:immich_mobile/shared/providers/server_info.provider.dart'; import 'package:immich_mobile/shared/ui/confirm_dialog.dart'; import 'package:immich_mobile/shared/ui/immich_toast.dart'; @@ -67,18 +66,21 @@ class TrashPage extends HookConsumerWidget { processing.value = true; try { if (selection.value.isNotEmpty) { - await ref - .read(assetProvider.notifier) - .deleteAssets(selection.value, force: true); + final isRemoved = await ref + .read(trashProvider.notifier) + .removeAssets(selection.value); - final assetOrAssets = selection.value.length > 1 ? 'assets' : 'asset'; - if (context.mounted) { - ImmichToast.show( - context: context, - msg: - '${selection.value.length} $assetOrAssets deleted permanently', - gravity: ToastGravity.BOTTOM, - ); + if (isRemoved) { + final assetOrAssets = + selection.value.length > 1 ? 'assets' : 'asset'; + if (context.mounted) { + ImmichToast.show( + context: context, + msg: + '${selection.value.length} $assetOrAssets deleted permanently', + gravity: ToastGravity.BOTTOM, + ); + } } } } finally {