TF-868: Unread/new emails are not loaded when opening folder

This commit is contained in:
ManhNTX
2022-09-07 10:32:04 +07:00
committed by Dat H. Pham
parent c213892746
commit 98f297f24d
13 changed files with 152 additions and 75 deletions
@@ -0,0 +1,22 @@
# 16. Fix some wrong cases email list presents
Date: 2022-09-13
## Status
- Issue: Mailbox A has cache with more than 20 filtered emails.
Then come back this mailbox in the next time, read-emails are not showed correctly.
## Context
- Root cause: list email cached not enough.
## Decision
- Fill the cache with the first page of this mailbox at the first time open this mailbox.
- Get only the first page in the cache when open mailbox
## Consequences
- Email list presents correctly
@@ -32,7 +32,7 @@ abstract class ThreadDataSource {
} }
); );
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption}); Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption, UnsignedInt? limit});
Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed}); Future<void> update({List<Email>? updated, List<Email>? created, List<EmailId>? destroyed});
@@ -46,9 +46,9 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
} }
@override @override
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption}) { Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption, UnsignedInt? limit}) {
return Future.sync(() async { return Future.sync(() async {
return await _emailCacheManager.getAllEmail(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption ?? FilterMessageOption.all); return await _emailCacheManager.getAllEmail(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption ?? FilterMessageOption.all, limit: limit);
}).catchError((error) { }).catchError((error) {
throw error; throw error;
}); });
@@ -65,7 +65,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
} }
@override @override
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption}) { Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, FilterMessageOption? filterOption, UnsignedInt? limit}) {
throw UnimplementedError(); throw UnimplementedError();
} }
@@ -1,5 +1,5 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
@@ -21,6 +21,7 @@ class EmailCacheManager {
Future<List<Email>> getAllEmail({ Future<List<Email>> getAllEmail({
MailboxId? inMailboxId, MailboxId? inMailboxId,
Set<Comparator>? sort, Set<Comparator>? sort,
UnsignedInt? limit,
FilterMessageOption filterOption = FilterMessageOption.all FilterMessageOption filterOption = FilterMessageOption.all
}) async { }) async {
final emailCacheList = inMailboxId != null final emailCacheList = inMailboxId != null
@@ -35,6 +36,10 @@ class EmailCacheManager {
emailList.sortBy(comparator); emailList.sortBy(comparator);
} }
} }
if (limit != null && emailList.length > limit.value.toInt()) {
return emailList.getRange(0, limit.value.toInt()).toList();
}
return emailList; return emailList;
} }
@@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/core/state.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:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
@@ -47,6 +48,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
mapDataSource[DataSourceType.local]!.getAllEmailCache( mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: emailFilter?.mailboxId, inMailboxId: emailFilter?.mailboxId,
sort: sort, sort: sort,
limit: limit,
filterOption: emailFilter?.filterOption), filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email) stateDataSource.getState(StateType.email)
]).then((List response) { ]).then((List response) {
@@ -64,7 +66,14 @@ class ThreadRepositoryImpl extends ThreadRepository {
sort: sort, sort: sort,
filter: emailFilter?.filter, filter: emailFilter?.filter,
properties: propertiesCreated); properties: propertiesCreated);
if (_isApproveFilterOption(emailFilter?.filterOption, networkEmailResponse.emailList)) {
_getFirstPage(
accountId,
sort: sort,
mailboxId: emailFilter?.mailboxId,
propertiesCreated: propertiesCreated,
);
}
yield networkEmailResponse; yield networkEmailResponse;
} else { } else {
yield localEmailResponse; yield localEmailResponse;
@@ -127,6 +136,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
mapDataSource[DataSourceType.local]!.getAllEmailCache( mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: emailFilter?.mailboxId, inMailboxId: emailFilter?.mailboxId,
sort: sort, sort: sort,
limit: limit,
filterOption: emailFilter?.filterOption), filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email) stateDataSource.getState(StateType.email)
]).then((List response) { ]).then((List response) {
@@ -136,6 +146,31 @@ class ThreadRepositoryImpl extends ThreadRepository {
yield newEmailResponse; yield newEmailResponse;
} }
bool _isApproveFilterOption(FilterMessageOption? filterOption, List<Email>? listEmailResponse) {
return filterOption != FilterMessageOption.all && listEmailResponse!.isNotEmpty;
}
Future<EmailsResponse> _getFirstPage(
AccountId accountId,
{
Set<Comparator>? sort,
MailboxId? mailboxId,
Properties? propertiesCreated,
Filter? filter,
}
) async {
final networkEmailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
accountId,
limit: ThreadConstants.defaultLimit,
sort: sort,
filter: filter ?? EmailFilterCondition(inMailbox: mailboxId),
properties: propertiesCreated,
);
await _updateEmailCache(newCreated: networkEmailResponse.emailList);
return networkEmailResponse;
}
Future<List<Email>?> _combineEmailCache({ Future<List<Email>?> _combineEmailCache({
List<Email>? emailUpdated, List<Email>? emailUpdated,
Properties? updatedProperties, Properties? updatedProperties,
@@ -185,19 +220,17 @@ class ThreadRepositoryImpl extends ThreadRepository {
AccountId accountId, AccountId accountId,
State currentState, State currentState,
{ {
UnsignedInt? limit,
Set<Comparator>? sort, Set<Comparator>? sort,
EmailFilter? emailFilter,
Properties? propertiesCreated, Properties? propertiesCreated,
Properties? propertiesUpdated, Properties? propertiesUpdated,
MailboxId? inMailboxId,
FilterMessageOption? filterOption,
} }
) async* { ) async* {
log('ThreadRepositoryImpl::refreshChanges(): $currentState'); log('ThreadRepositoryImpl::refreshChanges(): $currentState');
final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache( final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: inMailboxId, inMailboxId: emailFilter?.mailboxId,
sort: sort, sort: sort,
filterOption: filterOption); filterOption: emailFilter?.filterOption);
EmailChangeResponse? emailChangeResponse; EmailChangeResponse? emailChangeResponse;
bool hasMoreChanges = true; bool hasMoreChanges = true;
@@ -237,13 +270,26 @@ class ThreadRepositoryImpl extends ThreadRepository {
} }
final newEmailResponse = await Future.wait([ final newEmailResponse = await Future.wait([
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: inMailboxId, sort: sort, filterOption: filterOption), mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: emailFilter?.mailboxId, sort: sort, filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email) stateDataSource.getState(StateType.email)
]).then((List response) { ]).then((List response) {
return EmailsResponse(emailList: response.first, state: response.last); return EmailsResponse(emailList: response.first, state: response.last);
}); });
yield newEmailResponse; if (!newEmailResponse.hasEmails()
|| (newEmailResponse.emailList?.length ?? 0) < ThreadConstants.defaultLimit.value) {
final networkEmailResponse = await _getFirstPage(
accountId,
sort: sort,
filter: emailFilter?.filter,
mailboxId: emailFilter?.mailboxId,
propertiesCreated: propertiesCreated,
);
yield networkEmailResponse;
} else {
yield newEmailResponse;
}
} }
@override @override
@@ -5,12 +5,14 @@ import 'package:jmap_dart_client/jmap/core/properties/properties.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:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
class GetEmailRequest with EquatableMixin { class GetEmailRequest with EquatableMixin {
final AccountId accountId; final AccountId accountId;
final UnsignedInt? limit; final UnsignedInt? limit;
final Set<Comparator>? sort; final Set<Comparator>? sort;
final Filter? filter; final Filter? filter;
final FilterMessageOption? filterOption;
final Properties? properties; final Properties? properties;
final EmailId? lastEmailId; final EmailId? lastEmailId;
@@ -18,10 +20,11 @@ class GetEmailRequest with EquatableMixin {
this.limit, this.limit,
this.sort, this.sort,
this.filter, this.filter,
this.filterOption,
this.properties, this.properties,
this.lastEmailId, this.lastEmailId,
}); });
@override @override
List<Object?> get props => [limit, sort, filter, properties, lastEmailId]; List<Object?> get props => [limit, sort, filter, properties, lastEmailId, filterOption];
} }
@@ -1,7 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; 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';
@@ -12,9 +10,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_filter.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/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'; import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
import 'package:dartz/dartz.dart' as dartz;
abstract class ThreadRepository { abstract class ThreadRepository {
Stream<EmailsResponse> getAllEmail( Stream<EmailsResponse> getAllEmail(
@@ -33,10 +29,9 @@ abstract class ThreadRepository {
jmap.State currentState, jmap.State currentState,
{ {
Set<Comparator>? sort, Set<Comparator>? sort,
EmailFilter? emailFilter,
Properties? propertiesCreated, Properties? propertiesCreated,
Properties? propertiesUpdated, Properties? propertiesUpdated,
MailboxId? inMailboxId,
FilterMessageOption? filterOption,
} }
); );
@@ -3,9 +3,8 @@ import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.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/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_filter.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/model/filter_message_option.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';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
@@ -23,8 +22,7 @@ class RefreshChangesEmailsInMailboxInteractor {
Set<Comparator>? sort, Set<Comparator>? sort,
Properties? propertiesCreated, Properties? propertiesCreated,
Properties? propertiesUpdated, Properties? propertiesUpdated,
MailboxId? inMailboxId, EmailFilter? emailFilter,
FilterMessageOption? filterOption,
} }
) async* { ) async* {
yield Right<Failure, Success>(RefreshingState()); yield Right<Failure, Success>(RefreshingState());
@@ -37,8 +35,7 @@ class RefreshChangesEmailsInMailboxInteractor {
sort: sort, sort: sort,
propertiesCreated: propertiesCreated, propertiesCreated: propertiesCreated,
propertiesUpdated: propertiesUpdated, propertiesUpdated: propertiesUpdated,
inMailboxId: inMailboxId, emailFilter: emailFilter)
filterOption: filterOption)
.map(_toGetEmailState); .map(_toGetEmailState);
} catch (e) { } catch (e) {
yield Left(RefreshChangesAllEmailFailure(e)); yield Left(RefreshChangesAllEmailFailure(e));
@@ -431,8 +431,10 @@ class ThreadController extends BaseController {
sort: _sortOrder, sort: _sortOrder,
propertiesCreated: ThreadConstants.propertiesDefault, propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault, propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
inMailboxId: _currentMailboxId, emailFilter: EmailFilter(
filterOption: mailboxDashBoardController.filterMessageOption.value filter: _getFilterCondition(),
filterOption: mailboxDashBoardController.filterMessageOption.value,
mailboxId: _currentMailboxId),
)); ));
} }
} }
@@ -446,6 +448,7 @@ class ThreadController extends BaseController {
_accountId!, _accountId!,
limit: ThreadConstants.defaultLimit, limit: ThreadConstants.defaultLimit,
sort: _sortOrder, sort: _sortOrder,
filterOption: mailboxDashBoardController.filterMessageOption.value,
filter: _getFilterCondition(isLoadMore: true), filter: _getFilterCondition(isLoadMore: true),
properties: ThreadConstants.propertiesDefault, properties: ThreadConstants.propertiesDefault,
lastEmailId: emailList.last.id) lastEmailId: emailList.last.id)
@@ -453,9 +456,15 @@ class ThreadController extends BaseController {
} }
} }
bool _ableAppendLoadMore(List<PresentationEmail> listEmail) {
return !(emailList.where((email) => (email.mailboxIds != null && !email.mailboxIds!.keys.contains(currentMailbox?.id)) || emailList.contains(email)).isNotEmpty);
}
void _loadMoreEmailsSuccess(LoadMoreEmailsSuccess success) { void _loadMoreEmailsSuccess(LoadMoreEmailsSuccess success) {
if (success.emailList.isNotEmpty) { if (success.emailList.isNotEmpty) {
emailList.addAll(success.emailList); if (_ableAppendLoadMore(success.emailList)){
emailList.addAll(success.emailList);
}
} else { } else {
canLoadMore = false; canLoadMore = false;
} }
@@ -1,29 +1,29 @@
// Mocks generated by Mockito 5.0.17 from annotations // Mocks generated by Mockito 5.2.0 from annotations
// in tmail_ui_user/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart. // in tmail_ui_user/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart.
// Do not manually edit this file. // Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i3; import 'dart:async' as _i3;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5; import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i15; import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i13;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9; 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 _i14; import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i12;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i14;
import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/mockito.dart' as _i1;
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart' import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'
as _i8; as _i8;
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart' import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
as _i4; as _i4;
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'
as _i12;
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart' import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'
as _i13; as _i11;
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart' import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
as _i2; as _i2;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters // ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references // ignore_for_file: comment_references
@@ -64,34 +64,32 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
_i3.Stream<_i4.EmailsResponse> refreshChanges( _i3.Stream<_i4.EmailsResponse> refreshChanges(
_i5.AccountId? accountId, _i10.State? currentState, _i5.AccountId? accountId, _i10.State? currentState,
{Set<_i7.Comparator>? sort, {Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated, _i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated, _i9.Properties? propertiesUpdated}) =>
_i11.MailboxId? inMailboxId,
_i12.FilterMessageOption? filterOption}) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#refreshChanges, [ Invocation.method(#refreshChanges, [
accountId, accountId,
currentState currentState
], { ], {
#sort: sort, #sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated, #propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated, #propertiesUpdated: propertiesUpdated
#inMailboxId: inMailboxId,
#filterOption: filterOption
}), }),
returnValue: Stream<_i4.EmailsResponse>.empty()) returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>); as _i3.Stream<_i4.EmailsResponse>);
@override @override
_i3.Stream<_i4.EmailsResponse> loadMoreEmails( _i3.Stream<_i4.EmailsResponse> loadMoreEmails(
_i13.GetEmailRequest? emailRequest) => _i11.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]), (super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]),
returnValue: Stream<_i4.EmailsResponse>.empty()) returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>); as _i3.Stream<_i4.EmailsResponse>);
@override @override
_i3.Future<List<_i14.Email>> searchEmails(_i5.AccountId? accountId, _i3.Future<List<_i12.Email>> searchEmails(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit, {_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort, Set<_i7.Comparator>? sort,
_i15.Filter? filter, _i13.Filter? filter,
_i9.Properties? properties}) => _i9.Properties? properties}) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#searchEmails, [ Invocation.method(#searchEmails, [
@@ -102,13 +100,13 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
#filter: filter, #filter: filter,
#properties: properties #properties: properties
}), }),
returnValue: Future<List<_i14.Email>>.value(<_i14.Email>[])) returnValue: Future<List<_i12.Email>>.value(<_i12.Email>[]))
as _i3.Future<List<_i14.Email>>); as _i3.Future<List<_i12.Email>>);
@override @override
_i3.Future<List<_i14.EmailId>> emptyTrashFolder( _i3.Future<List<_i12.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i11.MailboxId? trashMailboxId) => _i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]),
returnValue: Future<List<_i14.EmailId>>.value(<_i14.EmailId>[])) returnValue: Future<List<_i12.EmailId>>.value(<_i12.EmailId>[]))
as _i3.Future<List<_i14.EmailId>>); as _i3.Future<List<_i12.EmailId>>);
} }
@@ -9,6 +9,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:mockito/annotations.dart'; import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.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/constants/thread_constants.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.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';
@@ -40,7 +41,8 @@ void main() {
sort: Set()..add(EmailComparator(EmailComparatorProperty.sentAt)..setIsAscending(false)), sort: Set()..add(EmailComparator(EmailComparatorProperty.sentAt)..setIsAscending(false)),
propertiesCreated: ThreadConstants.propertiesDefault, propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault, propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
inMailboxId: MailboxFixtures.inboxMailbox.id emailFilter: EmailFilter(
mailboxId: MailboxFixtures.inboxMailbox.id)
)).thenAnswer((_) => Stream.fromIterable({ )).thenAnswer((_) => Stream.fromIterable({
EmailsResponse( EmailsResponse(
emailList: { emailList: {
@@ -59,7 +61,9 @@ void main() {
sort: Set()..add(EmailComparator(EmailComparatorProperty.sentAt)..setIsAscending(false)), sort: Set()..add(EmailComparator(EmailComparatorProperty.sentAt)..setIsAscending(false)),
propertiesCreated: ThreadConstants.propertiesDefault, propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault, propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
inMailboxId: MailboxFixtures.inboxMailbox.id); emailFilter: EmailFilter(
mailboxId: MailboxFixtures.inboxMailbox.id),
);
final states = await streamStates.toList(); final states = await streamStates.toList();
@@ -1,29 +1,29 @@
// Mocks generated by Mockito 5.0.17 from annotations // Mocks generated by Mockito 5.2.0 from annotations
// in tmail_ui_user/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart. // in tmail_ui_user/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart.
// Do not manually edit this file. // Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i3; import 'dart:async' as _i3;
import 'package:jmap_dart_client/jmap/account_id.dart' as _i5; import 'package:jmap_dart_client/jmap/account_id.dart' as _i5;
import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i15; import 'package:jmap_dart_client/jmap/core/filter/filter.dart' as _i13;
import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i9; 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 _i14; import 'package:jmap_dart_client/jmap/mail/email/email.dart' as _i12;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i11; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart' as _i14;
import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/mockito.dart' as _i1;
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart' import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'
as _i8; as _i8;
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart' import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'
as _i4; as _i4;
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'
as _i12;
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart' import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'
as _i13; as _i11;
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart' import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'
as _i2; as _i2;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters // ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references // ignore_for_file: comment_references
@@ -64,34 +64,32 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
_i3.Stream<_i4.EmailsResponse> refreshChanges( _i3.Stream<_i4.EmailsResponse> refreshChanges(
_i5.AccountId? accountId, _i10.State? currentState, _i5.AccountId? accountId, _i10.State? currentState,
{Set<_i7.Comparator>? sort, {Set<_i7.Comparator>? sort,
_i8.EmailFilter? emailFilter,
_i9.Properties? propertiesCreated, _i9.Properties? propertiesCreated,
_i9.Properties? propertiesUpdated, _i9.Properties? propertiesUpdated}) =>
_i11.MailboxId? inMailboxId,
_i12.FilterMessageOption? filterOption}) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#refreshChanges, [ Invocation.method(#refreshChanges, [
accountId, accountId,
currentState currentState
], { ], {
#sort: sort, #sort: sort,
#emailFilter: emailFilter,
#propertiesCreated: propertiesCreated, #propertiesCreated: propertiesCreated,
#propertiesUpdated: propertiesUpdated, #propertiesUpdated: propertiesUpdated
#inMailboxId: inMailboxId,
#filterOption: filterOption
}), }),
returnValue: Stream<_i4.EmailsResponse>.empty()) returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>); as _i3.Stream<_i4.EmailsResponse>);
@override @override
_i3.Stream<_i4.EmailsResponse> loadMoreEmails( _i3.Stream<_i4.EmailsResponse> loadMoreEmails(
_i13.GetEmailRequest? emailRequest) => _i11.GetEmailRequest? emailRequest) =>
(super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]), (super.noSuchMethod(Invocation.method(#loadMoreEmails, [emailRequest]),
returnValue: Stream<_i4.EmailsResponse>.empty()) returnValue: Stream<_i4.EmailsResponse>.empty())
as _i3.Stream<_i4.EmailsResponse>); as _i3.Stream<_i4.EmailsResponse>);
@override @override
_i3.Future<List<_i14.Email>> searchEmails(_i5.AccountId? accountId, _i3.Future<List<_i12.Email>> searchEmails(_i5.AccountId? accountId,
{_i6.UnsignedInt? limit, {_i6.UnsignedInt? limit,
Set<_i7.Comparator>? sort, Set<_i7.Comparator>? sort,
_i15.Filter? filter, _i13.Filter? filter,
_i9.Properties? properties}) => _i9.Properties? properties}) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#searchEmails, [ Invocation.method(#searchEmails, [
@@ -102,13 +100,13 @@ class MockThreadRepository extends _i1.Mock implements _i2.ThreadRepository {
#filter: filter, #filter: filter,
#properties: properties #properties: properties
}), }),
returnValue: Future<List<_i14.Email>>.value(<_i14.Email>[])) returnValue: Future<List<_i12.Email>>.value(<_i12.Email>[]))
as _i3.Future<List<_i14.Email>>); as _i3.Future<List<_i12.Email>>);
@override @override
_i3.Future<List<_i14.EmailId>> emptyTrashFolder( _i3.Future<List<_i12.EmailId>> emptyTrashFolder(
_i5.AccountId? accountId, _i11.MailboxId? trashMailboxId) => _i5.AccountId? accountId, _i14.MailboxId? trashMailboxId) =>
(super.noSuchMethod( (super.noSuchMethod(
Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]), Invocation.method(#emptyTrashFolder, [accountId, trashMailboxId]),
returnValue: Future<List<_i14.EmailId>>.value(<_i14.EmailId>[])) returnValue: Future<List<_i12.EmailId>>.value(<_i12.EmailId>[]))
as _i3.Future<List<_i14.EmailId>>); as _i3.Future<List<_i12.EmailId>>);
} }