TF-2323 Use position to load more emails when sort by Subject & Sender

Signed-off-by: dab246 <tdvu@linagora.com>
(cherry picked from commit 847a56bfd331dc29f05493a861fb6f21da2b2cde)
This commit is contained in:
dab246
2023-12-18 11:26:14 +07:00
committed by Dat H. Pham
parent 1ad18e5ecc
commit d5f646af79
18 changed files with 257 additions and 55 deletions
@@ -21,6 +21,7 @@ abstract class ThreadDataSource {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
Filter? filter,
Properties? properties
@@ -31,6 +31,7 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
Filter? filter,
Properties? properties
@@ -14,9 +14,9 @@ import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/email_extension.dart';
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
@@ -38,6 +38,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
@@ -48,6 +49,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
session,
accountId,
limit: limit,
position: position,
sort: sort,
filter: filter,
properties: properties);
@@ -31,6 +31,7 @@ class ThreadAPI {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
Filter? filter,
Properties? properties
@@ -44,6 +45,8 @@ class ThreadAPI {
if (limit != null) queryEmailMethod.addLimit(limit);
if (position != null) queryEmailMethod.addPosition(position);
if (sort != null) queryEmailMethod.addSorts(sort);
if (filter != null) queryEmailMethod.addFilters(filter);
@@ -39,6 +39,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
EmailFilter? emailFilter,
Properties? propertiesCreated,
@@ -67,6 +68,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
session,
accountId,
limit: limit,
position: position,
sort: sort,
filter: emailFilter?.filter,
properties: propertiesCreated);
@@ -75,6 +77,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
session,
accountId,
sort: sort,
position: position,
mailboxId: emailFilter?.mailboxId,
propertiesCreated: propertiesCreated,
);
@@ -131,6 +134,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
AccountId accountId,
{
Set<Comparator>? sort,
int? position,
MailboxId? mailboxId,
Properties? propertiesCreated,
Filter? filter,
@@ -140,6 +144,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
session,
accountId,
limit: ThreadConstants.defaultLimit,
position: position,
sort: sort,
filter: filter ?? EmailFilterCondition(inMailbox: mailboxId),
properties: propertiesCreated,
@@ -266,6 +271,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
emailRequest.session,
emailRequest.accountId,
limit: emailRequest.limit,
position: emailRequest.position,
sort: emailRequest.sort,
filter: emailRequest.filter,
properties: emailRequest.properties)
@@ -283,6 +289,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
Filter? filter,
Properties? properties
@@ -292,6 +299,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
session,
accountId,
limit: limit,
position: position,
sort: sort,
filter: filter,
properties: properties);
@@ -3,15 +3,16 @@ 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/session/session.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: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 {
final Session session;
final AccountId accountId;
final UnsignedInt? limit;
final int? position;
final Set<Comparator>? sort;
final Filter? filter;
final FilterMessageOption? filterOption;
@@ -23,6 +24,7 @@ class GetEmailRequest with EquatableMixin {
this.accountId,
{
this.limit,
this.position,
this.sort,
this.filter,
this.filterOption,
@@ -36,6 +38,7 @@ class GetEmailRequest with EquatableMixin {
session,
accountId,
limit,
position,
sort,
filter,
properties,
@@ -46,6 +46,7 @@ abstract class ThreadRepository {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
@@ -1,13 +1,13 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:model/model.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/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
@@ -22,6 +22,7 @@ class SearchEmailInteractor {
AccountId accountId,
{
UnsignedInt? limit,
int? position,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
@@ -34,6 +35,7 @@ class SearchEmailInteractor {
session,
accountId,
limit: limit,
position: position,
sort: sort,
filter: filter,
properties: properties);
@@ -1,14 +1,14 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.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/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/session/session.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:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
@@ -24,6 +24,7 @@ class SearchMoreEmailInteractor {
{
UnsignedInt? limit,
Set<Comparator>? sort,
int? position,
Filter? filter,
Properties? properties,
EmailId? lastEmailId
@@ -36,6 +37,7 @@ class SearchMoreEmailInteractor {
session,
accountId,
limit: limit,
position: position,
sort: sort,
filter: filter,
properties: properties);
@@ -536,6 +536,7 @@ class ThreadController extends BaseController with EmailActionController {
_session!,
_accountId!,
limit: ThreadConstants.defaultLimit,
position: _searchEmailFilter.position,
sort: _searchEmailFilter.sortOrder ?? _sortOrder,
filterOption: mailboxDashBoardController.filterMessageOption.value,
filter: _getFilterCondition(oldestEmail: oldestEmail, mailboxIdSelected: _currentMailboxId),
@@ -726,7 +727,18 @@ class ThreadController extends BaseController with EmailActionController {
}
mailboxDashBoardController.emailsInCurrentMailbox.clear();
canSearchMore = true;
searchController.updateFilterEmail(beforeOption: const None());
if (searchController.sortOrderFiltered.value.isScrollByPosition()) {
searchController.updateFilterEmail(
positionOption: const Some(0),
beforeOption: const None(),
);
} else {
searchController.updateFilterEmail(
positionOption: const None(),
beforeOption: const None(),
);
}
searchController.activateSimpleSearch();
@@ -734,8 +746,12 @@ class ThreadController extends BaseController with EmailActionController {
_session!,
_accountId!,
limit: limit ?? ThreadConstants.defaultLimit,
position: _searchEmailFilter.position,
sort: _searchEmailFilter.sortOrder,
filter: _searchEmailFilter.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()),
filter: _searchEmailFilter.mappingToEmailFilterCondition(
sortOrderType: searchController.sortOrderFiltered.value,
moreFilterCondition: _getFilterCondition()
),
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
));
} else {
@@ -783,20 +799,30 @@ class ThreadController extends BaseController with EmailActionController {
final lastEmail = mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty
? mailboxDashBoardController.emailsInCurrentMailbox.last
: null;
final firstEmail = mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty
? mailboxDashBoardController.emailsInCurrentMailbox.first
: null;
if (optionOf(_searchEmailFilter.sortOrder).toString() == EmailSortOrderType.oldest.getSortOrder().toString()) {
searchController.updateFilterEmail(beforeOption: optionOf(firstEmail?.receivedAt));
if (searchController.sortOrderFiltered.value.isScrollByPosition()) {
final nextPosition = mailboxDashBoardController.emailsInCurrentMailbox.length;
log('ThreadController::searchMoreEmails:nextPosition: $nextPosition');
searchController.updateFilterEmail(
positionOption: Some(nextPosition),
beforeOption: const None()
);
} else if (searchController.sortOrderFiltered.value == EmailSortOrderType.oldest) {
searchController.updateFilterEmail(startDateOption: optionOf(lastEmail?.receivedAt));
} else {
searchController.updateFilterEmail(beforeOption: optionOf(lastEmail?.receivedAt));
}
consumeState(_searchMoreEmailInteractor.execute(
_session!,
_accountId!,
limit: ThreadConstants.defaultLimit,
sort: _searchEmailFilter.sortOrder ?? _sortOrder,
filter: _searchEmailFilter.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()),
position: _searchEmailFilter.position,
filter: _searchEmailFilter.mappingToEmailFilterCondition(
sortOrderType: searchController.sortOrderFiltered.value,
moreFilterCondition: _getFilterCondition()
),
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
lastEmailId: lastEmail?.id
));