[BUG] Fix duplicate load more emails

This commit is contained in:
dab246
2021-10-27 13:53:52 +07:00
committed by Dat H. Pham
parent ce941c4852
commit 32b8e714a3
6 changed files with 53 additions and 7 deletions
@@ -230,6 +230,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
Set<Comparator>? sort, Set<Comparator>? sort,
Filter? filter, Filter? filter,
Properties? properties, Properties? properties,
EmailId? lastEmailId,
} }
) async* { ) async* {
final emailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail( final emailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
@@ -240,7 +241,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
properties: properties); properties: properties);
final newEmailList = emailResponse.emailList != null && emailResponse.emailList!.isNotEmpty final newEmailList = emailResponse.emailList != null && emailResponse.emailList!.isNotEmpty
? emailResponse.emailList!.sublist(1) ? emailResponse.emailList!.where((email) => email.id != lastEmailId).toList()
: <Email>[]; : <Email>[];
if (newEmailList.isNotEmpty) { if (newEmailList.isNotEmpty) {
@@ -39,6 +39,7 @@ abstract class ThreadRepository {
Set<Comparator>? sort, Set<Comparator>? sort,
Filter? filter, Filter? filter,
Properties? properties, Properties? properties,
EmailId? lastEmailId,
} }
); );
@@ -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/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.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/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/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
@@ -21,7 +22,8 @@ class LoadMoreEmailsInMailboxInteractor {
UnsignedInt? limit, UnsignedInt? limit,
Set<Comparator>? sort, Set<Comparator>? sort,
Filter? filter, Filter? filter,
Properties? properties Properties? properties,
EmailId? lastEmailId,
} }
) async* { ) async* {
try { try {
@@ -33,7 +35,8 @@ class LoadMoreEmailsInMailboxInteractor {
limit: limit, limit: limit,
sort: sort, sort: sort,
filter: filter, filter: filter,
properties: properties) properties: properties,
lastEmailId: lastEmailId)
.map(_toGetEmailState); .map(_toGetEmailState);
} catch (e) { } catch (e) {
yield Left(LoadMoreEmailsFailure(e)); yield Left(LoadMoreEmailsFailure(e));
@@ -264,6 +264,7 @@ class ThreadController extends BaseController {
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id, inMailbox: mailboxDashBoardController.selectedMailbox.value?.id,
before: emailList.last.receivedAt), before: emailList.last.receivedAt),
properties: ThreadConstants.propertiesDefault, properties: ThreadConstants.propertiesDefault,
lastEmailId: emailList.last.id
)); ));
} }
} }
@@ -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/sort/comparator.dart' as _i7;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i10; 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/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:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/mockito.dart' as _i1;
import 'package:model/email/email_filter.dart' as _i8; import 'package:model/email/email_filter.dart' as _i8;
@@ -75,7 +76,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
{_i6.UnsignedInt? limit, {_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort, Set<_i7.Comparator>? sort,
_i12.Filter? filter, _i12.Filter? filter,
_i9.Properties? properties}) => _i9.Properties? properties,
_i13.EmailId? lastEmailId}) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#loadMoreEmails, [ Invocation.method(#loadMoreEmails, [
accountId accountId
@@ -83,8 +85,26 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
#limit: limit, #limit: limit,
#sort: sort, #sort: sort,
#filter: filter, #filter: filter,
#properties: properties #properties: properties,
#lastEmailId: lastEmailId
}), }),
returnValue: Stream<_i4.EmailsResponse>.empty()) returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>); as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Future<List<_i13.Email>> 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<List<_i13.Email>>.value(<_i13.Email>[]))
as _i3.Future<List<_i13.Email>>);
} }
@@ -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/sort/comparator.dart' as _i7;
import 'package:jmap_dart_client/jmap/core/state.dart' as _i10; 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/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:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11;
import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/mockito.dart' as _i1;
import 'package:model/email/email_filter.dart' as _i8; import 'package:model/email/email_filter.dart' as _i8;
@@ -75,7 +76,8 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
{_i6.UnsignedInt? limit, {_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort, Set<_i7.Comparator>? sort,
_i12.Filter? filter, _i12.Filter? filter,
_i9.Properties? properties}) => _i9.Properties? properties,
_i13.EmailId? lastEmailId}) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#loadMoreEmails, [ Invocation.method(#loadMoreEmails, [
accountId accountId
@@ -83,8 +85,26 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
#limit: limit, #limit: limit,
#sort: sort, #sort: sort,
#filter: filter, #filter: filter,
#properties: properties #properties: properties,
#lastEmailId: lastEmailId
}), }),
returnValue: Stream<_i4.EmailsResponse>.empty()) returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>); as _i3.Stream<_i4.EmailsResponse>);
@override
_i3.Future<List<_i13.Email>> 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<List<_i13.Email>>.value(<_i13.Email>[]))
as _i3.Future<List<_i13.Email>>);
} }