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:
@@ -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
|
||||
));
|
||||
|
||||
Reference in New Issue
Block a user