code: updated impl inside deleteLocalOnlyAssets
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/providers/memory.provider.dart';
|
import 'package:immich_mobile/providers/memory.provider.dart';
|
||||||
import 'package:immich_mobile/repositories/asset_media.repository.dart';
|
import 'package:immich_mobile/repositories/asset_media.repository.dart';
|
||||||
@@ -14,6 +15,7 @@ import 'package:immich_mobile/services/sync.service.dart';
|
|||||||
import 'package:immich_mobile/services/user.service.dart';
|
import 'package:immich_mobile/services/user.service.dart';
|
||||||
import 'package:immich_mobile/utils/db.dart';
|
import 'package:immich_mobile/utils/db.dart';
|
||||||
import 'package:immich_mobile/utils/renderlist_generator.dart';
|
import 'package:immich_mobile/utils/renderlist_generator.dart';
|
||||||
|
import 'package:immich_mobile/widgets/common/immich_toast.dart';
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
@@ -78,27 +80,48 @@ class AssetNotifier extends StateNotifier<bool> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> deleteLocalOnlyAssets(
|
Future<bool> deleteLocalOnlyAssets(
|
||||||
|
BuildContext context,
|
||||||
Iterable<Asset> deleteAssets, {
|
Iterable<Asset> deleteAssets, {
|
||||||
bool onlyBackedUp = false,
|
bool onlyBackedUp = false,
|
||||||
}) async {
|
}) async {
|
||||||
_deleteInProgress = true;
|
_deleteInProgress = true;
|
||||||
state = true;
|
state = true;
|
||||||
try {
|
try {
|
||||||
|
// Filter local assets based on the backup status (`isRemote`).
|
||||||
|
// If `onlyBackedUp` is true, only select assets that are also present on the server (`isRemote`).
|
||||||
|
final assetsToDelete = deleteAssets
|
||||||
|
.where((e) => e.isLocal && (!onlyBackedUp || e.isRemote))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
if (assetsToDelete.isEmpty) {
|
||||||
|
// No assets to delete, exit early
|
||||||
|
ImmichToast.show(
|
||||||
|
context: context,
|
||||||
|
msg: 'No backed-up assets selected for deletion.',
|
||||||
|
gravity: ToastGravity.BOTTOM,
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Continue with deletion of the filtered assets
|
||||||
final assets = onlyBackedUp
|
final assets = onlyBackedUp
|
||||||
? deleteAssets.where((e) => e.storage == AssetState.merged)
|
? assetsToDelete.where((e) => e.storage == AssetState.merged)
|
||||||
: deleteAssets;
|
: assetsToDelete;
|
||||||
|
|
||||||
final localDeleted = await _deleteLocalAssets(assets);
|
final localDeleted = await _deleteLocalAssets(assets);
|
||||||
if (localDeleted.isNotEmpty) {
|
if (localDeleted.isNotEmpty) {
|
||||||
final localOnlyIds = deleteAssets
|
final localOnlyIds = assetsToDelete
|
||||||
.where((e) => e.storage == AssetState.local)
|
.where((e) => e.storage == AssetState.local)
|
||||||
.map((e) => e.id)
|
.map((e) => e.id)
|
||||||
.toList();
|
.toList();
|
||||||
// Update merged assets to remote only
|
// Update merged assets to remote only
|
||||||
final mergedAssets =
|
final mergedAssets = assetsToDelete
|
||||||
deleteAssets.where((e) => e.storage == AssetState.merged).map((e) {
|
.where((e) => e.storage == AssetState.merged)
|
||||||
|
.map((e) {
|
||||||
e.localId = null;
|
e.localId = null;
|
||||||
return e;
|
return e;
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
await _db.writeTxn(() async {
|
await _db.writeTxn(() async {
|
||||||
if (mergedAssets.isNotEmpty) {
|
if (mergedAssets.isNotEmpty) {
|
||||||
await _db.assets.putAll(mergedAssets);
|
await _db.assets.putAll(mergedAssets);
|
||||||
|
|||||||
@@ -204,25 +204,11 @@ class MultiselectGrid extends HookConsumerWidget {
|
|||||||
void onDeleteLocal(bool onlyBackedUp) async {
|
void onDeleteLocal(bool onlyBackedUp) async {
|
||||||
processing.value = true;
|
processing.value = true;
|
||||||
try {
|
try {
|
||||||
// Filter local assets based on the backup status (`isRemote`).
|
final localIds = selection.value.where((a) => a.isLocal).toList();
|
||||||
// If `onlyBackedUp` is true, only select assets that are also present on the server (`isRemote`).
|
|
||||||
final localIds = selection.value
|
|
||||||
.where((a) => a.isLocal && (!onlyBackedUp || a.isRemote))
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
if (localIds.isEmpty) {
|
|
||||||
ImmichToast.show(
|
|
||||||
context: context,
|
|
||||||
msg: 'No backed-up assets selected for deletion.',
|
|
||||||
gravity: ToastGravity.BOTTOM,
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed with deletion of filtered assets
|
|
||||||
final isDeleted = await ref
|
final isDeleted = await ref
|
||||||
.read(assetProvider.notifier)
|
.read(assetProvider.notifier)
|
||||||
.deleteLocalOnlyAssets(localIds, onlyBackedUp: onlyBackedUp);
|
.deleteLocalOnlyAssets(context, localIds,
|
||||||
|
onlyBackedUp: onlyBackedUp);
|
||||||
|
|
||||||
if (isDeleted) {
|
if (isDeleted) {
|
||||||
ImmichToast.show(
|
ImmichToast.show(
|
||||||
|
|||||||
Reference in New Issue
Block a user