diff --git a/lib/features/thread/data/repository/thread_repository_impl.dart b/lib/features/thread/data/repository/thread_repository_impl.dart index cd5ecd4be..f226da758 100644 --- a/lib/features/thread/data/repository/thread_repository_impl.dart +++ b/lib/features/thread/data/repository/thread_repository_impl.dart @@ -230,6 +230,7 @@ class ThreadRepositoryImpl extends ThreadRepository { Set? sort, Filter? filter, Properties? properties, + EmailId? lastEmailId, } ) async* { final emailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail( @@ -240,7 +241,7 @@ class ThreadRepositoryImpl extends ThreadRepository { properties: properties); final newEmailList = emailResponse.emailList != null && emailResponse.emailList!.isNotEmpty - ? emailResponse.emailList!.sublist(1) + ? emailResponse.emailList!.where((email) => email.id != lastEmailId).toList() : []; if (newEmailList.isNotEmpty) { diff --git a/lib/features/thread/domain/repository/thread_repository.dart b/lib/features/thread/domain/repository/thread_repository.dart index 77091c7e5..79b0d8c72 100644 --- a/lib/features/thread/domain/repository/thread_repository.dart +++ b/lib/features/thread/domain/repository/thread_repository.dart @@ -39,6 +39,7 @@ abstract class ThreadRepository { Set? sort, Filter? filter, Properties? properties, + EmailId? lastEmailId, } ); diff --git a/lib/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart b/lib/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart index d0f16cf8e..af45430be 100644 --- a/lib/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart +++ b/lib/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart @@ -5,6 +5,7 @@ import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'; import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; import 'package:model/model.dart'; @@ -21,7 +22,8 @@ class LoadMoreEmailsInMailboxInteractor { UnsignedInt? limit, Set? sort, Filter? filter, - Properties? properties + Properties? properties, + EmailId? lastEmailId, } ) async* { try { @@ -33,7 +35,8 @@ class LoadMoreEmailsInMailboxInteractor { limit: limit, sort: sort, filter: filter, - properties: properties) + properties: properties, + lastEmailId: lastEmailId) .map(_toGetEmailState); } catch (e) { yield Left(LoadMoreEmailsFailure(e)); diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index b9890fb0d..aa224b610 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -264,6 +264,7 @@ class ThreadController extends BaseController { inMailbox: mailboxDashBoardController.selectedMailbox.value?.id, before: emailList.last.receivedAt), properties: ThreadConstants.propertiesDefault, + lastEmailId: emailList.last.id )); } } diff --git a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart index 6886aca01..540fa99b5 100644 --- a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart +++ b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.mocks.dart @@ -10,6 +10,7 @@ import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i7; import 'package:jmap_dart_client/jmap/core/state.dart' as _i10; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6; +import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11; import 'package:mockito/mockito.dart' as _i1; import 'package:model/email/email_filter.dart' as _i8; @@ -75,7 +76,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository { {_i6.UnsignedInt? limit, Set<_i7.Comparator>? sort, _i12.Filter? filter, - _i9.Properties? properties}) => + _i9.Properties? properties, + _i13.EmailId? lastEmailId}) => (super.noSuchMethod( Invocation.method(#loadMoreEmails, [ accountId @@ -83,8 +85,26 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository { #limit: limit, #sort: sort, #filter: filter, - #properties: properties + #properties: properties, + #lastEmailId: lastEmailId }), returnValue: Stream<_i4.EmailsResponse>.empty()) as _i3.Stream<_i4.EmailsResponse>); + @override + _i3.Future> searchEmails(_i5.AccountId? accountId, + {_i6.UnsignedInt? limit, + Set<_i7.Comparator>? sort, + _i12.Filter? filter, + _i9.Properties? properties}) => + (super.noSuchMethod( + Invocation.method(#searchEmails, [ + accountId + ], { + #limit: limit, + #sort: sort, + #filter: filter, + #properties: properties + }), + returnValue: Future>.value(<_i13.Email>[])) + as _i3.Future>); } diff --git a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart index ffe7db6df..e8f720800 100644 --- a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart +++ b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.mocks.dart @@ -10,6 +10,7 @@ import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart' as _i7; import 'package:jmap_dart_client/jmap/core/state.dart' as _i10; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart' as _i6; +import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i13; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11; import 'package:mockito/mockito.dart' as _i1; import 'package:model/email/email_filter.dart' as _i8; @@ -75,7 +76,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository { {_i6.UnsignedInt? limit, Set<_i7.Comparator>? sort, _i12.Filter? filter, - _i9.Properties? properties}) => + _i9.Properties? properties, + _i13.EmailId? lastEmailId}) => (super.noSuchMethod( Invocation.method(#loadMoreEmails, [ accountId @@ -83,8 +85,26 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository { #limit: limit, #sort: sort, #filter: filter, - #properties: properties + #properties: properties, + #lastEmailId: lastEmailId }), returnValue: Stream<_i4.EmailsResponse>.empty()) as _i3.Stream<_i4.EmailsResponse>); + @override + _i3.Future> searchEmails(_i5.AccountId? accountId, + {_i6.UnsignedInt? limit, + Set<_i7.Comparator>? sort, + _i12.Filter? filter, + _i9.Properties? properties}) => + (super.noSuchMethod( + Invocation.method(#searchEmails, [ + accountId + ], { + #limit: limit, + #sort: sort, + #filter: filter, + #properties: properties + }), + returnValue: Future>.value(<_i13.Email>[])) + as _i3.Future>); }