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
@@ -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});
@@ -46,9 +46,9 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
}
@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 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) {
throw error;
});
@@ -65,7 +65,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
}
@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();
}
@@ -1,5 +1,5 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:model/model.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
@@ -21,6 +21,7 @@ class EmailCacheManager {
Future<List<Email>> getAllEmail({
MailboxId? inMailboxId,
Set<Comparator>? sort,
UnsignedInt? limit,
FilterMessageOption filterOption = FilterMessageOption.all
}) async {
final emailCacheList = inMailboxId != null
@@ -35,6 +36,10 @@ class EmailCacheManager {
emailList.sortBy(comparator);
}
}
if (limit != null && emailList.length > limit.value.toInt()) {
return emailList.getRange(0, limit.value.toInt()).toList();
}
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/unsigned_int.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:model/model.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(
inMailboxId: emailFilter?.mailboxId,
sort: sort,
limit: limit,
filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email)
]).then((List response) {
@@ -64,7 +66,14 @@ class ThreadRepositoryImpl extends ThreadRepository {
sort: sort,
filter: emailFilter?.filter,
properties: propertiesCreated);
if (_isApproveFilterOption(emailFilter?.filterOption, networkEmailResponse.emailList)) {
_getFirstPage(
accountId,
sort: sort,
mailboxId: emailFilter?.mailboxId,
propertiesCreated: propertiesCreated,
);
}
yield networkEmailResponse;
} else {
yield localEmailResponse;
@@ -127,6 +136,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: emailFilter?.mailboxId,
sort: sort,
limit: limit,
filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email)
]).then((List response) {
@@ -136,6 +146,31 @@ class ThreadRepositoryImpl extends ThreadRepository {
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({
List<Email>? emailUpdated,
Properties? updatedProperties,
@@ -185,19 +220,17 @@ class ThreadRepositoryImpl extends ThreadRepository {
AccountId accountId,
State currentState,
{
UnsignedInt? limit,
Set<Comparator>? sort,
EmailFilter? emailFilter,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId,
FilterMessageOption? filterOption,
}
) async* {
log('ThreadRepositoryImpl::refreshChanges(): $currentState');
final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: inMailboxId,
inMailboxId: emailFilter?.mailboxId,
sort: sort,
filterOption: filterOption);
filterOption: emailFilter?.filterOption);
EmailChangeResponse? emailChangeResponse;
bool hasMoreChanges = true;
@@ -237,13 +270,26 @@ class ThreadRepositoryImpl extends ThreadRepository {
}
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)
]).then((List response) {
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