TF-495 Apply isolate for LoadMore emails

This commit is contained in:
dab246
2022-04-19 15:00:53 +07:00
committed by Dat H. Pham
parent 2f54a02b40
commit 3aa3c38e2d
6 changed files with 102 additions and 103 deletions
@@ -1,5 +1,6 @@
import 'package:core/core.dart';
import 'package:flutter/foundation.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/properties/properties.dart';
@@ -20,6 +21,7 @@ import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
class ThreadRepositoryImpl extends ThreadRepository {
@@ -240,34 +242,29 @@ class ThreadRepositoryImpl extends ThreadRepository {
}
@override
Stream<EmailsResponse> loadMoreEmails(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
EmailId? lastEmailId,
}
) async* {
log('ThreadRepositoryImpl::loadMoreEmails()');
final emailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
accountId,
limit: limit,
sort: sort,
filter: filter,
properties: properties);
Stream<EmailsResponse> loadMoreEmails(GetEmailRequest getEmailRequest) async* {
final response = await compute(_getAllEmailsWithoutLastEmailId, getEmailRequest);
await _updateEmailCache(newCreated: response.emailList);
yield response;
}
final newEmailList = emailResponse.emailList != null && emailResponse.emailList!.isNotEmpty
? emailResponse.emailList!.where((email) => email.id != lastEmailId).toList()
: <Email>[];
Future<EmailsResponse> _getAllEmailsWithoutLastEmailId(GetEmailRequest emailRequest) async {
final emailResponse = await mapDataSource[DataSourceType.network]!
.getAllEmail(
emailRequest.accountId,
limit: emailRequest.limit,
sort: emailRequest.sort,
filter: emailRequest.filter,
properties: emailRequest.properties)
.then((response) {
var listEmails = response.emailList;
if (listEmails != null && listEmails.isNotEmpty) {
listEmails = listEmails.where((email) => email.id != emailRequest.lastEmailId).toList();
}
return EmailsResponse(emailList: listEmails, state: response.state);
});
if (newEmailList.isNotEmpty) {
await _updateEmailCache(newCreated: newEmailList);
}
yield EmailsResponse(emailList: newEmailList, state: emailResponse.state);
return emailResponse;
}
@override
@@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
abstract class ThreadRepository {
Stream<EmailsResponse> getAllEmail(
@@ -44,16 +45,7 @@ abstract class ThreadRepository {
}
);
Stream<EmailsResponse> loadMoreEmails(
AccountId accountId,
{
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
EmailId? lastEmailId,
}
);
Stream<EmailsResponse> loadMoreEmails(GetEmailRequest emailRequest);
Future<List<Email>> searchEmails(
AccountId accountId,
@@ -1,12 +1,7 @@
import 'package:core/core.dart';
import 'package:dartz/dartz.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/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/model/get_email_request.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
@@ -16,28 +11,11 @@ class LoadMoreEmailsInMailboxInteractor {
LoadMoreEmailsInMailboxInteractor(this.threadRepository);
Stream<Either<Failure, Success>> execute(
AccountId accountId,
{
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
EmailId? lastEmailId,
}
) async* {
Stream<Either<Failure, Success>> execute(GetEmailRequest emailRequest) async* {
try {
yield Right<Failure, Success>(LoadingMoreState());
yield* threadRepository
.loadMoreEmails(
accountId,
limit: limit,
sort: sort,
filter: filter,
properties: properties,
lastEmailId: lastEmailId)
.map(_toGetEmailState);
yield* threadRepository.loadMoreEmails(emailRequest).map(_toGetEmailState);
} catch (e) {
yield Left(LoadMoreEmailsFailure(e));
}
@@ -39,6 +39,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_ema
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
@@ -382,18 +383,21 @@ class ThreadController extends BaseController {
void loadMoreEmails() {
if (canLoadMore && _accountId != null) {
log('ThreadController::loadMoreEmails(): latest: ${emailList.last.receivedAt}');
bench.start('loadMoreEmails');
consumeState(_loadMoreEmailsInMailboxInteractor.execute(
_accountId!,
limit: ThreadConstants.defaultLimit,
sort: _sortOrder,
filter: _getFilterCondition(isLoadMore: true),
properties: ThreadConstants.propertiesDefault,
lastEmailId: emailList.last.id
GetEmailRequest(
_accountId!,
limit: ThreadConstants.defaultLimit,
sort: _sortOrder,
filter: _getFilterCondition(isLoadMore: true),
properties: ThreadConstants.propertiesDefault,
lastEmailId: emailList.last.id)
));
}
}
void _loadMoreEmailsSuccess(LoadMoreEmailsSuccess success) {
bench.end('loadMoreEmails');
log('ThreadController::_loadMoreEmailsSuccess(): [BEFORE] totalEmailList = ${emailList.length}');
if (success.emailList.isNotEmpty) {
log('ThreadController::_loadMoreEmailsSuccess(): add success: ${success.emailList.length}');