diff --git a/lib/core/storage/file_metadata_cache.dart b/lib/core/storage/file_metadata_cache.dart index 627706d..b444f5b 100644 --- a/lib/core/storage/file_metadata_cache.dart +++ b/lib/core/storage/file_metadata_cache.dart @@ -78,6 +78,29 @@ class FileMetadataCache { }); } + static Future removeFilesFromAllFolders(Iterable fileIDs) { + final removed = fileIDs.toSet(); + if (removed.isEmpty) return Future.value(); + return _enqueue(() async { + final folders = _map(StorageKeys.folderChildrenIndex); + for (final entry in folders.entries.toList()) { + final snapshot = entry.value; + if (snapshot is! Map || snapshot['children'] is! List) continue; + final children = (snapshot['children'] as List) + .whereType() + .where((child) => !removed.contains(_fileID(child))) + .toList(); + final original = snapshot['children'] as List; + if (children.length == original.length) continue; + folders[entry.key] = { + 'childIds': children.map(_fileID).whereType().toList(), + 'children': children, + }; + } + await StorageManager.set(StorageKeys.folderChildrenIndex, folders); + }); + } + static List? folderChildren(String? folderID) { final folders = _map(StorageKeys.folderChildrenIndex); final entry = folders[_folderKey(folderID)]; @@ -125,6 +148,16 @@ class FileMetadataCache { } } + static String? _fileID(Map value) { + for (final key in const ['id', 'fileId', 'file_id', 'resId', 'res_id']) { + final candidate = value[key]; + if (candidate != null && candidate.toString().isNotEmpty) { + return candidate.toString(); + } + } + return null; + } + static Future _enqueue(Future Function() operation) { _writes = _writes.then((_) => operation()); return _writes; diff --git a/lib/providers/file_provider.dart b/lib/providers/file_provider.dart index d73c216..99e762b 100644 --- a/lib/providers/file_provider.dart +++ b/lib/providers/file_provider.dart @@ -549,6 +549,9 @@ class FileNotifier extends StateNotifier { state = state.copyWith(statusMessage: '正在删除…'); try { await _api!.fsDelete(files.map((f) => f.id).toList()); + await FileMetadataCache.removeFilesFromAllFolders( + files.map((file) => file.id), + ); await FileMetadataCache.updateFolderChildren( _currentParentID, removeIDs: files.map((file) => file.id), @@ -568,6 +571,9 @@ class FileNotifier extends StateNotifier { if (_api == null) return; try { await _api!.fsRecycle(files.map((f) => f.id).toList()); + await FileMetadataCache.removeFilesFromAllFolders( + files.map((file) => file.id), + ); await FileMetadataCache.updateFolderChildren( _currentParentID, removeIDs: files.map((file) => file.id), @@ -609,6 +615,7 @@ class FileNotifier extends StateNotifier { final ids = state.clipboard!.map((f) => f.id).toList(); if (state.clipboardIsMove) { await _api!.fsMove(ids, parentID: _currentParentID); + await FileMetadataCache.removeFilesFromAllFolders(ids); await FileMetadataCache.updateFolderChildren( _currentParentID, addOrReplace: state.clipboard!, @@ -743,6 +750,9 @@ class FileNotifier extends StateNotifier { files.map((file) => file.id).toList(), parentID: parentID, ); + await FileMetadataCache.removeFilesFromAllFolders( + files.map((file) => file.id), + ); await FileMetadataCache.updateFolderChildren( _currentParentID, removeIDs: files.map((file) => file.id),