refactor(mobile): trash provider (#16219)

* refactor(mobile): trash provider

* refactor(mobile): trash provider

* pr feedback
This commit is contained in:
Alex 2025-02-20 22:14:41 -06:00 committed by GitHub
parent 34b88bb47a
commit 17a2043e76
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 115 additions and 164 deletions

View file

@ -2,150 +2,44 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';
import 'package:immich_mobile/services/trash.service.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/providers/asset.provider.dart';
import 'package:immich_mobile/providers/db.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/services/sync.service.dart';
import 'package:immich_mobile/utils/renderlist_generator.dart';
import 'package:isar/isar.dart';
import 'package:logging/logging.dart';
class TrashNotifier extends StateNotifier<bool> {
final Isar _db;
final Ref _ref;
final TrashService _trashService;
final _log = Logger('TrashNotifier');
TrashNotifier(
this._trashService,
this._db,
this._ref,
) : super(false);
Future<void> emptyTrash() async {
try {
final user = _ref.read(currentUserProvider);
if (user == null) {
return;
}
await _trashService.emptyTrash();
final idsToRemove = await _db.assets
.where()
.remoteIdIsNotNull()
.filter()
.ownerIdEqualTo(user.isarId)
.isTrashedEqualTo(true)
.remoteIdProperty()
.findAll();
// TODO: handle local asset removal on emptyTrash
_ref
.read(syncServiceProvider)
.handleRemoteAssetRemoval(idsToRemove.cast<String>().toList());
state = true;
} catch (error, stack) {
_log.severe("Cannot empty trash", error, stack);
state = false;
}
}
Future<bool> removeAssets(Iterable<Asset> assetList) async {
try {
final user = _ref.read(currentUserProvider);
if (user == null) {
return false;
}
final isRemoved = await _ref
.read(assetProvider.notifier)
.deleteRemoteAssets(assetList, shouldDeletePermanently: true);
if (isRemoved) {
final idsToRemove =
assetList.where((a) => a.isRemote).map((a) => a.remoteId!).toList();
_ref
.read(syncServiceProvider)
.handleRemoteAssetRemoval(idsToRemove.cast<String>().toList());
}
return isRemoved;
} catch (error, stack) {
_log.severe("Cannot remove assets", error, stack);
}
return false;
}
Future<bool> restoreAsset(Asset asset) async {
try {
final result = await _trashService.restoreAsset(asset);
if (result) {
final remoteAsset = asset.isRemote;
asset.isTrashed = false;
if (remoteAsset) {
await _db.writeTxn(() async {
await _db.assets.put(asset);
});
}
return true;
}
} catch (error, stack) {
_log.severe("Cannot restore asset", error, stack);
}
return false;
}
Future<bool> restoreAssets(Iterable<Asset> assetList) async {
try {
final result = await _trashService.restoreAssets(assetList);
if (result) {
final remoteAssets = assetList.where((a) => a.isRemote).toList();
final updatedAssets = remoteAssets.map((e) {
e.isTrashed = false;
return e;
}).toList();
await _db.writeTxn(() async {
await _db.assets.putAll(updatedAssets);
});
return true;
}
await _trashService.restoreAssets(assetList);
return true;
} catch (error, stack) {
_log.severe("Cannot restore assets", error, stack);
return false;
}
return false;
}
Future<void> restoreTrash() async {
try {
final user = _ref.read(currentUserProvider);
if (user == null) {
return;
}
await _trashService.restoreTrash();
final assets = await _db.assets
.where()
.remoteIdIsNotNull()
.filter()
.ownerIdEqualTo(user.isarId)
.isTrashedEqualTo(true)
.findAll();
final updatedAssets = assets.map((e) {
e.isTrashed = false;
return e;
}).toList();
await _db.writeTxn(() async {
await _db.assets.putAll(updatedAssets);
});
state = true;
} catch (error, stack) {
_log.severe("Cannot restore trash", error, stack);
state = false;
}
}
}
@ -153,20 +47,14 @@ class TrashNotifier extends StateNotifier<bool> {
final trashProvider = StateNotifierProvider<TrashNotifier, bool>((ref) {
return TrashNotifier(
ref.watch(trashServiceProvider),
ref.watch(dbProvider),
ref,
);
});
final trashedAssetsProvider = StreamProvider<RenderList>((ref) {
final user = ref.read(currentUserProvider);
if (user == null) return const Stream.empty();
final query = ref
.watch(dbProvider)
.assets
.filter()
.ownerIdEqualTo(user.isarId)
.isTrashedEqualTo(true)
.sortByFileCreatedAtDesc();
return renderListGeneratorWithGroupBy(query, GroupAssetsBy.none);
if (user == null) {
return const Stream.empty();
}
return ref.watch(trashServiceProvider).getRenderListGenerator(user.isarId);
});