diff --git a/app/lib/controller/collection_items_controller.dart b/app/lib/controller/collection_items_controller.dart index e8e20913..7739c721 100644 --- a/app/lib/controller/collection_items_controller.dart +++ b/app/lib/controller/collection_items_controller.dart @@ -327,18 +327,25 @@ class CollectionItemsController { return; } await _mutex.protect(() async { - final newItems = _dataStreamController.value.items.where((e) { - if (e is CollectionFileItem) { - return ev.dataMap.containsKey(e.file.fdId); - } else { - return true; - } - }).toList(); - if (newItems.length != _dataStreamController.value.items.length) { - _dataStreamController.addWithValue((value) => value.copyWith( - items: newItems, - )); - } + final newItems = _dataStreamController.value.items + .map((e) { + if (e is CollectionFileItem) { + final file = ev.dataMap[e.file.fdId]; + if (file == null) { + // removed + return null; + } else { + return e.copyWith(file: file); + } + } else { + return e; + } + }) + .whereNotNull() + .toList(); + _dataStreamController.addWithValue((value) => value.copyWith( + items: newItems, + )); }); } diff --git a/app/lib/entity/album/item.dart b/app/lib/entity/album/item.dart index 94a8ce3f..f136022d 100644 --- a/app/lib/entity/album/item.dart +++ b/app/lib/entity/album/item.dart @@ -1,3 +1,4 @@ +import 'package:copy_with/copy_with.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; @@ -73,6 +74,7 @@ abstract class AlbumItem with EquatableMixin { static final _log = _$AlbumItemNpLog.log; } +@genCopyWith @toString class AlbumFileItem extends AlbumItem { AlbumFileItem({ @@ -110,20 +112,6 @@ class AlbumFileItem extends AlbumItem { addedBy == other.addedBy && addedAt == other.addedAt; - AlbumFileItem copyWith({ - CiString? addedBy, - DateTime? addedAt, - FileDescriptor? file, - CiString? ownerId, - }) { - return AlbumFileItem( - addedBy: addedBy ?? this.addedBy, - addedAt: addedAt ?? this.addedAt, - file: file ?? this.file, - ownerId: ownerId ?? this.ownerId, - ); - } - @override List get props => [ ...super.props, diff --git a/app/lib/entity/album/item.g.dart b/app/lib/entity/album/item.g.dart index fe8fdd1a..12bb28f5 100644 --- a/app/lib/entity/album/item.g.dart +++ b/app/lib/entity/album/item.g.dart @@ -2,6 +2,47 @@ part of 'item.dart'; +// ************************************************************************** +// CopyWithLintRuleGenerator +// ************************************************************************** + +// ignore_for_file: library_private_types_in_public_api, duplicate_ignore + +// ************************************************************************** +// CopyWithGenerator +// ************************************************************************** + +abstract class $AlbumFileItemCopyWithWorker { + AlbumFileItem call( + {CiString? addedBy, + DateTime? addedAt, + FileDescriptor? file, + CiString? ownerId}); +} + +class _$AlbumFileItemCopyWithWorkerImpl + implements $AlbumFileItemCopyWithWorker { + _$AlbumFileItemCopyWithWorkerImpl(this.that); + + @override + AlbumFileItem call( + {dynamic addedBy, dynamic addedAt, dynamic file, dynamic ownerId}) { + return AlbumFileItem( + addedBy: addedBy as CiString? ?? that.addedBy, + addedAt: addedAt as DateTime? ?? that.addedAt, + file: file as FileDescriptor? ?? that.file, + ownerId: ownerId as CiString? ?? that.ownerId); + } + + final AlbumFileItem that; +} + +extension $AlbumFileItemCopyWith on AlbumFileItem { + $AlbumFileItemCopyWithWorker get copyWith => _$copyWith; + $AlbumFileItemCopyWithWorker get _$copyWith => + _$AlbumFileItemCopyWithWorkerImpl(this); +} + // ************************************************************************** // NpLogGenerator // ************************************************************************** diff --git a/app/lib/entity/collection_item.dart b/app/lib/entity/collection_item.dart index 376c66b0..d8b5e5a2 100644 --- a/app/lib/entity/collection_item.dart +++ b/app/lib/entity/collection_item.dart @@ -8,6 +8,10 @@ abstract class CollectionItem { abstract class CollectionFileItem implements CollectionItem { const CollectionFileItem(); + CollectionFileItem copyWith({ + FileDescriptor? file, + }); + FileDescriptor get file; } diff --git a/app/lib/entity/collection_item/album_item_adapter.dart b/app/lib/entity/collection_item/album_item_adapter.dart index 8071c359..59fd77be 100644 --- a/app/lib/entity/collection_item/album_item_adapter.dart +++ b/app/lib/entity/collection_item/album_item_adapter.dart @@ -24,6 +24,15 @@ class CollectionFileItemAlbumAdapter extends CollectionFileItem with AlbumAdaptedCollectionItem { const CollectionFileItemAlbumAdapter(this.item); + @override + CollectionFileItemAlbumAdapter copyWith({ + FileDescriptor? file, + }) { + return CollectionFileItemAlbumAdapter(item.copyWith( + file: file, + )); + } + @override String toString() => _$toString(); diff --git a/app/lib/entity/collection_item/basic_item.dart b/app/lib/entity/collection_item/basic_item.dart index 3411264e..0d5e7a7e 100644 --- a/app/lib/entity/collection_item/basic_item.dart +++ b/app/lib/entity/collection_item/basic_item.dart @@ -9,6 +9,13 @@ part 'basic_item.g.dart'; class BasicCollectionFileItem implements CollectionFileItem { const BasicCollectionFileItem(this.file); + @override + BasicCollectionFileItem copyWith({ + FileDescriptor? file, + }) { + return BasicCollectionFileItem(file ?? this.file); + } + @override String toString() => _$toString(); diff --git a/app/lib/entity/collection_item/nc_album_item_adapter.dart b/app/lib/entity/collection_item/nc_album_item_adapter.dart index a497b1df..aee0abc7 100644 --- a/app/lib/entity/collection_item/nc_album_item_adapter.dart +++ b/app/lib/entity/collection_item/nc_album_item_adapter.dart @@ -9,6 +9,13 @@ part 'nc_album_item_adapter.g.dart'; class CollectionFileItemNcAlbumItemAdapter extends CollectionFileItem { const CollectionFileItemNcAlbumItemAdapter(this.item, [this.localFile]); + @override + CollectionFileItemNcAlbumItemAdapter copyWith({ + FileDescriptor? file, + }) { + return CollectionFileItemNcAlbumItemAdapter(item, file ?? this.file); + } + @override String toString() => _$toString(); diff --git a/app/lib/entity/collection_item/new_item.dart b/app/lib/entity/collection_item/new_item.dart index efd4e95a..9d75fd05 100644 --- a/app/lib/entity/collection_item/new_item.dart +++ b/app/lib/entity/collection_item/new_item.dart @@ -14,6 +14,13 @@ abstract class NewCollectionItem implements CollectionItem {} class NewCollectionFileItem implements CollectionFileItem, NewCollectionItem { const NewCollectionFileItem(this.file); + @override + NewCollectionFileItem copyWith({ + FileDescriptor? file, + }) { + return NewCollectionFileItem(file ?? this.file); + } + @override String toString() => _$toString();