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:
+42
-2
@@ -168,6 +168,14 @@ packages:
|
|||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "1.0.0+1"
|
version: "1.0.0+1"
|
||||||
|
cross_file:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: cross_file
|
||||||
|
sha256: "2f9d2cbccb76127ba28528cb3ae2c2326a122446a83de5a056aaa3880d3882c5"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.3+7"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -297,10 +305,42 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_image_compress
|
name: flutter_image_compress
|
||||||
sha256: "37f1b26399098e5f97b74c1483f534855e7dff68ead6ddaccf747029fb03f29f"
|
sha256: f159d2e8c4ed04b8e36994124fd4a5017a0f01e831ae3358c74095c340e9ae5e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.3"
|
version: "2.1.0"
|
||||||
|
flutter_image_compress_common:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_common
|
||||||
|
sha256: "7cad12802628706655920089cfe9ee1d1098300e7f39a079eb160458bbc47652"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.3"
|
||||||
|
flutter_image_compress_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_macos
|
||||||
|
sha256: fea1e3d71150d03373916b832c49b5c2f56c3e7e13da82a929274a2c6f88251e
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.1"
|
||||||
|
flutter_image_compress_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_platform_interface
|
||||||
|
sha256: eb4f055138b29b04498ebcb6d569aaaee34b64d75fb74ea0d40f9790bf47ee9d
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.3"
|
||||||
|
flutter_image_compress_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_web
|
||||||
|
sha256: da41cc3859f19d11c7d10be615f6a9dcf0907e7daffde7442bf4cc2486663660
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.3+2"
|
||||||
flutter_inappwebview:
|
flutter_inappwebview:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
|
|||||||
Option<UTCDate>? startDateOption,
|
Option<UTCDate>? startDateOption,
|
||||||
Option<UTCDate>? endDateOption,
|
Option<UTCDate>? endDateOption,
|
||||||
Option<Set<Comparator>>? sortOrderOption,
|
Option<Set<Comparator>>? sortOrderOption,
|
||||||
|
Option<int>? positionOption,
|
||||||
}) {
|
}) {
|
||||||
searchEmailFilter.value = searchEmailFilter.value.copyWith(
|
searchEmailFilter.value = searchEmailFilter.value.copyWith(
|
||||||
fromOption: fromOption,
|
fromOption: fromOption,
|
||||||
@@ -208,6 +209,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
|
|||||||
startDateOption: startDateOption,
|
startDateOption: startDateOption,
|
||||||
endDateOption: endDateOption,
|
endDateOption: endDateOption,
|
||||||
sortOrderOption: sortOrderOption,
|
sortOrderOption: sortOrderOption,
|
||||||
|
positionOption: positionOption,
|
||||||
);
|
);
|
||||||
searchEmailFilter.refresh();
|
searchEmailFilter.refresh();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
|
||||||
|
|
||||||
enum EmailSortOrderType {
|
enum EmailSortOrderType {
|
||||||
mostRecent,
|
mostRecent,
|
||||||
@@ -83,4 +83,11 @@ enum EmailSortOrderType {
|
|||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isScrollByPosition() {
|
||||||
|
return this == EmailSortOrderType.subjectDescending ||
|
||||||
|
this == EmailSortOrderType.subjectAscending ||
|
||||||
|
this == EmailSortOrderType.senderDescending ||
|
||||||
|
this == EmailSortOrderType.senderAscending;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,14 +3,15 @@ import 'package:equatable/equatable.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/filter/filter_operator.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/filter_operator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||||
import 'package:model/extensions/email_filter_condition_extension.dart';
|
import 'package:model/extensions/email_filter_condition_extension.dart';
|
||||||
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
||||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
|
||||||
|
|
||||||
class SearchEmailFilter with EquatableMixin {
|
class SearchEmailFilter with EquatableMixin {
|
||||||
final Set<String> from;
|
final Set<String> from;
|
||||||
@@ -25,6 +26,7 @@ class SearchEmailFilter with EquatableMixin {
|
|||||||
final UTCDate? startDate;
|
final UTCDate? startDate;
|
||||||
final UTCDate? endDate;
|
final UTCDate? endDate;
|
||||||
final Set<Comparator>? sortOrder;
|
final Set<Comparator>? sortOrder;
|
||||||
|
final int? position;
|
||||||
|
|
||||||
factory SearchEmailFilter.initial() => SearchEmailFilter();
|
factory SearchEmailFilter.initial() => SearchEmailFilter();
|
||||||
|
|
||||||
@@ -41,6 +43,7 @@ class SearchEmailFilter with EquatableMixin {
|
|||||||
this.startDate,
|
this.startDate,
|
||||||
this.endDate,
|
this.endDate,
|
||||||
this.sortOrder,
|
this.sortOrder,
|
||||||
|
this.position,
|
||||||
}) : from = from ?? <String>{},
|
}) : from = from ?? <String>{},
|
||||||
to = to ?? <String>{},
|
to = to ?? <String>{},
|
||||||
notKeyword = notKeyword ?? <String>{},
|
notKeyword = notKeyword ?? <String>{},
|
||||||
@@ -61,6 +64,7 @@ class SearchEmailFilter with EquatableMixin {
|
|||||||
Option<UTCDate>? startDateOption,
|
Option<UTCDate>? startDateOption,
|
||||||
Option<UTCDate>? endDateOption,
|
Option<UTCDate>? endDateOption,
|
||||||
Option<Set<Comparator>>? sortOrderOption,
|
Option<Set<Comparator>>? sortOrderOption,
|
||||||
|
Option<int>? positionOption,
|
||||||
}) {
|
}) {
|
||||||
return SearchEmailFilter(
|
return SearchEmailFilter(
|
||||||
from: _getOptionParam(fromOption, from),
|
from: _getOptionParam(fromOption, from),
|
||||||
@@ -75,6 +79,7 @@ class SearchEmailFilter with EquatableMixin {
|
|||||||
startDate: _getOptionParam(startDateOption, startDate),
|
startDate: _getOptionParam(startDateOption, startDate),
|
||||||
endDate: _getOptionParam(endDateOption, endDate),
|
endDate: _getOptionParam(endDateOption, endDate),
|
||||||
sortOrder: _getOptionParam(sortOrderOption, sortOrder),
|
sortOrder: _getOptionParam(sortOrderOption, sortOrder),
|
||||||
|
position: _getOptionParam(positionOption, position),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,18 +91,25 @@ class SearchEmailFilter with EquatableMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Filter? mappingToEmailFilterCondition({EmailFilterCondition? moreFilterCondition}) {
|
Filter? mappingToEmailFilterCondition({
|
||||||
|
required EmailSortOrderType sortOrderType,
|
||||||
|
EmailFilterCondition? moreFilterCondition
|
||||||
|
}) {
|
||||||
final emailEmailFilterConditionShared = EmailFilterCondition(
|
final emailEmailFilterConditionShared = EmailFilterCondition(
|
||||||
text: text?.value.trim().isNotEmpty == true
|
text: text?.value.trim().isNotEmpty == true
|
||||||
? text?.value
|
? text?.value
|
||||||
: null,
|
: null,
|
||||||
inMailbox: mailbox?.mailboxId,
|
inMailbox: mailbox?.mailboxId,
|
||||||
after: emailReceiveTimeType.getAfterDate(startDate),
|
after: sortOrderType.isScrollByPosition()
|
||||||
|
? null
|
||||||
|
: emailReceiveTimeType.getAfterDate(startDate),
|
||||||
hasAttachment: hasAttachment == false ? null : hasAttachment,
|
hasAttachment: hasAttachment == false ? null : hasAttachment,
|
||||||
subject: subject?.trim().isNotEmpty == true
|
subject: subject?.trim().isNotEmpty == true
|
||||||
? subject
|
? subject
|
||||||
: null,
|
: null,
|
||||||
before: emailReceiveTimeType.getBeforeDate(endDate, before)
|
before: sortOrderType.isScrollByPosition()
|
||||||
|
? null
|
||||||
|
: emailReceiveTimeType.getBeforeDate(endDate, before)
|
||||||
);
|
);
|
||||||
|
|
||||||
final listEmailCondition = {
|
final listEmailCondition = {
|
||||||
@@ -138,5 +150,6 @@ class SearchEmailFilter with EquatableMixin {
|
|||||||
startDate,
|
startDate,
|
||||||
endDate,
|
endDate,
|
||||||
sortOrder,
|
sortOrder,
|
||||||
|
position,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
+3
-1
@@ -6,8 +6,8 @@ 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';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.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/core/unsigned_int.dart';
|
||||||
import 'package:model/extensions/email_extension.dart';
|
import 'package:model/extensions/email_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/search/email/domain/state/refresh_changes_search_email_state.dart';
|
import 'package:tmail_ui_user/features/search/email/domain/state/refresh_changes_search_email_state.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';
|
||||||
@@ -23,6 +23,7 @@ class RefreshChangesSearchEmailInteractor {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties,
|
Properties? properties,
|
||||||
@@ -35,6 +36,7 @@ class RefreshChangesSearchEmailInteractor {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
position: position,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
filter: filter,
|
filter: filter,
|
||||||
properties: properties);
|
properties: properties);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:flutter/material.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/filter/filter_operator.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/filter_operator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.dart';
|
import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||||
import 'package:model/email/prefix_email_address.dart';
|
import 'package:model/email/prefix_email_address.dart';
|
||||||
@@ -11,9 +12,9 @@ import 'package:model/extensions/email_filter_condition_extension.dart';
|
|||||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
|
||||||
|
|
||||||
class SimpleSearchFilter with EquatableMixin {
|
class SimpleSearchFilter with EquatableMixin {
|
||||||
final Set<String> from;
|
final Set<String> from;
|
||||||
@@ -26,6 +27,7 @@ class SimpleSearchFilter with EquatableMixin {
|
|||||||
final UTCDate? startDate;
|
final UTCDate? startDate;
|
||||||
final UTCDate? endDate;
|
final UTCDate? endDate;
|
||||||
final Set<Comparator>? sortOrder;
|
final Set<Comparator>? sortOrder;
|
||||||
|
final int? position;
|
||||||
|
|
||||||
SimpleSearchFilter({
|
SimpleSearchFilter({
|
||||||
Set<String>? from,
|
Set<String>? from,
|
||||||
@@ -38,6 +40,7 @@ class SimpleSearchFilter with EquatableMixin {
|
|||||||
this.startDate,
|
this.startDate,
|
||||||
this.endDate,
|
this.endDate,
|
||||||
this.sortOrder,
|
this.sortOrder,
|
||||||
|
this.position,
|
||||||
}) : from = from ?? <String>{},
|
}) : from = from ?? <String>{},
|
||||||
to = to ?? <String>{},
|
to = to ?? <String>{},
|
||||||
hasAttachment = hasAttachment ?? false,
|
hasAttachment = hasAttachment ?? false,
|
||||||
@@ -54,6 +57,7 @@ class SimpleSearchFilter with EquatableMixin {
|
|||||||
Option<UTCDate>? startDateOption,
|
Option<UTCDate>? startDateOption,
|
||||||
Option<UTCDate>? endDateOption,
|
Option<UTCDate>? endDateOption,
|
||||||
Option<Set<Comparator>>? sortOrderOption,
|
Option<Set<Comparator>>? sortOrderOption,
|
||||||
|
Option<int>? positionOption,
|
||||||
}) {
|
}) {
|
||||||
return SimpleSearchFilter(
|
return SimpleSearchFilter(
|
||||||
from: _getOptionParam(fromOption, from),
|
from: _getOptionParam(fromOption, from),
|
||||||
@@ -65,7 +69,8 @@ class SimpleSearchFilter with EquatableMixin {
|
|||||||
before: _getOptionParam(beforeOption, before),
|
before: _getOptionParam(beforeOption, before),
|
||||||
startDate: _getOptionParam(startDateOption, startDate),
|
startDate: _getOptionParam(startDateOption, startDate),
|
||||||
endDate: _getOptionParam(endDateOption, endDate),
|
endDate: _getOptionParam(endDateOption, endDate),
|
||||||
sortOrder: _getOptionParam(sortOrderOption, sortOrder)
|
sortOrder: _getOptionParam(sortOrderOption, sortOrder),
|
||||||
|
position: _getOptionParam(positionOption, position),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,15 +82,19 @@ class SimpleSearchFilter with EquatableMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Filter? mappingToEmailFilterCondition() {
|
Filter? mappingToEmailFilterCondition({required EmailSortOrderType sortOrderType}) {
|
||||||
final emailEmailFilterConditionShared = EmailFilterCondition(
|
final emailEmailFilterConditionShared = EmailFilterCondition(
|
||||||
text: text?.value.trim().isNotEmpty == true
|
text: text?.value.trim().isNotEmpty == true
|
||||||
? text?.value
|
? text?.value
|
||||||
: null,
|
: null,
|
||||||
inMailbox: mailbox?.id,
|
inMailbox: mailbox?.id,
|
||||||
after: emailReceiveTimeType.getAfterDate(startDate),
|
after: sortOrderType.isScrollByPosition()
|
||||||
|
? null
|
||||||
|
: emailReceiveTimeType.getAfterDate(startDate),
|
||||||
hasAttachment: hasAttachment == false ? null : hasAttachment,
|
hasAttachment: hasAttachment == false ? null : hasAttachment,
|
||||||
before: emailReceiveTimeType.getBeforeDate(endDate, before)
|
before: sortOrderType.isScrollByPosition()
|
||||||
|
? null
|
||||||
|
: emailReceiveTimeType.getBeforeDate(endDate, before)
|
||||||
);
|
);
|
||||||
|
|
||||||
final listEmailCondition = {
|
final listEmailCondition = {
|
||||||
@@ -117,7 +126,8 @@ class SimpleSearchFilter with EquatableMixin {
|
|||||||
before,
|
before,
|
||||||
startDate,
|
startDate,
|
||||||
endDate,
|
endDate,
|
||||||
sortOrder
|
sortOrder,
|
||||||
|
position,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -176,7 +176,8 @@ class SearchEmailController extends BaseController
|
|||||||
currentSearchText.value = value;
|
currentSearchText.value = value;
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
textOption: value.isNotEmpty ? Some(SearchQuery(value)) : const None(),
|
textOption: value.isNotEmpty ? Some(SearchQuery(value)) : const None(),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
if (value.isNotEmpty && session != null && accountId != null) {
|
if (value.isNotEmpty && session != null && accountId != null) {
|
||||||
listSuggestionSearch.value = await quickSearchEmails(session: session!, accountId: accountId!);
|
listSuggestionSearch.value = await quickSearchEmails(session: session!, accountId: accountId!);
|
||||||
@@ -240,13 +241,17 @@ class SearchEmailController extends BaseController
|
|||||||
final limit = listResultSearch.isNotEmpty
|
final limit = listResultSearch.isNotEmpty
|
||||||
? UnsignedInt(listResultSearch.length)
|
? UnsignedInt(listResultSearch.length)
|
||||||
: ThreadConstants.defaultLimit;
|
: ThreadConstants.defaultLimit;
|
||||||
_updateSimpleSearchFilter(beforeOption: const None());
|
_updateSimpleSearchFilter(
|
||||||
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
|
);
|
||||||
consumeState(_refreshChangesSearchEmailInteractor.execute(
|
consumeState(_refreshChangesSearchEmailInteractor.execute(
|
||||||
session!,
|
session!,
|
||||||
accountId!,
|
accountId!,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
position: simpleSearchFilter.value.position,
|
||||||
sort: emailSortOrderType.value.getSortOrder().toNullable(),
|
sort: emailSortOrderType.value.getSortOrder().toNullable(),
|
||||||
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
|
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
|
||||||
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -288,8 +293,8 @@ class SearchEmailController extends BaseController
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: UnsignedInt(5),
|
limit: UnsignedInt(5),
|
||||||
sort: emailSortOrderType.value.getSortOrder().toNullable(),
|
sort: emailSortOrderType.value.getSortOrder().toNullable(),
|
||||||
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
|
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
|
||||||
properties: ThreadConstants.propertiesQuickSearch)
|
properties: ThreadConstants.propertiesQuickSearch)
|
||||||
.then((result) => result.fold(
|
.then((result) => result.fold(
|
||||||
(failure) => <PresentationEmail>[],
|
(failure) => <PresentationEmail>[],
|
||||||
@@ -321,12 +326,26 @@ class SearchEmailController extends BaseController
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (emailSortOrderType.value.isScrollByPosition()) {
|
||||||
|
_updateSimpleSearchFilter(
|
||||||
|
positionOption: const Some(0),
|
||||||
|
beforeOption: const None(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
_updateSimpleSearchFilter(
|
||||||
|
positionOption: const None(),
|
||||||
|
beforeOption: const None(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
consumeState(_searchEmailInteractor.execute(
|
consumeState(_searchEmailInteractor.execute(
|
||||||
session!,
|
session!,
|
||||||
accountId!,
|
accountId!,
|
||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
|
position: simpleSearchFilter.value.position,
|
||||||
sort: emailSortOrderType.value.getSortOrder().toNullable(),
|
sort: emailSortOrderType.value.getSortOrder().toNullable(),
|
||||||
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
|
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
|
||||||
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -362,9 +381,14 @@ class SearchEmailController extends BaseController
|
|||||||
void searchMoreEmailsAction() {
|
void searchMoreEmailsAction() {
|
||||||
if (canSearchMore && session != null && accountId != null) {
|
if (canSearchMore && session != null && accountId != null) {
|
||||||
final lastEmail = listResultSearch.last;
|
final lastEmail = listResultSearch.last;
|
||||||
final firstEmail = listResultSearch.first;
|
|
||||||
if (emailSortOrderType.value == EmailSortOrderType.oldest) {
|
if (emailSortOrderType.value.isScrollByPosition()) {
|
||||||
_updateSimpleSearchFilter(beforeOption: optionOf(firstEmail.receivedAt));
|
_updateSimpleSearchFilter(
|
||||||
|
positionOption: Some(listResultSearch.length),
|
||||||
|
beforeOption: const None()
|
||||||
|
);
|
||||||
|
} else if (emailSortOrderType.value == EmailSortOrderType.oldest) {
|
||||||
|
_updateSimpleSearchFilter(startDateOption: optionOf(lastEmail.receivedAt));
|
||||||
} else {
|
} else {
|
||||||
_updateSimpleSearchFilter(beforeOption: optionOf(lastEmail.receivedAt));
|
_updateSimpleSearchFilter(beforeOption: optionOf(lastEmail.receivedAt));
|
||||||
}
|
}
|
||||||
@@ -374,7 +398,8 @@ class SearchEmailController extends BaseController
|
|||||||
accountId!,
|
accountId!,
|
||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
sort: simpleSearchFilter.value.sortOrder,
|
sort: simpleSearchFilter.value.sortOrder,
|
||||||
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
|
position: simpleSearchFilter.value.position,
|
||||||
|
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
|
||||||
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
||||||
lastEmailId: lastEmail.id
|
lastEmailId: lastEmail.id
|
||||||
));
|
));
|
||||||
@@ -407,7 +432,8 @@ class SearchEmailController extends BaseController
|
|||||||
setTextInputSearchForm(query);
|
setTextInputSearchForm(query);
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
textOption: Some(SearchQuery(query)),
|
textOption: Some(SearchQuery(query)),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
_searchEmailAction(context);
|
_searchEmailAction(context);
|
||||||
}
|
}
|
||||||
@@ -416,7 +442,8 @@ class SearchEmailController extends BaseController
|
|||||||
setTextInputSearchForm(recentSearch.value);
|
setTextInputSearchForm(recentSearch.value);
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
textOption: Some(SearchQuery(recentSearch.value)),
|
textOption: Some(SearchQuery(recentSearch.value)),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
_searchEmailAction(context);
|
_searchEmailAction(context);
|
||||||
}
|
}
|
||||||
@@ -424,7 +451,8 @@ class SearchEmailController extends BaseController
|
|||||||
void submitSearchAction(BuildContext context, String query) {
|
void submitSearchAction(BuildContext context, String query) {
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
textOption: Some(SearchQuery(query)),
|
textOption: Some(SearchQuery(query)),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
_searchEmailAction(context);
|
_searchEmailAction(context);
|
||||||
}
|
}
|
||||||
@@ -453,19 +481,22 @@ class SearchEmailController extends BaseController
|
|||||||
case QuickSearchFilter.hasAttachment:
|
case QuickSearchFilter.hasAttachment:
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
hasAttachmentOption: Some(!filterSelected),
|
hasAttachmentOption: Some(!filterSelected),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case QuickSearchFilter.last7Days:
|
case QuickSearchFilter.last7Days:
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
emailReceiveTimeTypeOption: optionOf(emailReceiveTimeType.value),
|
emailReceiveTimeTypeOption: optionOf(emailReceiveTimeType.value),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case QuickSearchFilter.sortBy:
|
case QuickSearchFilter.sortBy:
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
sortOrderOption: emailSortOrderType.value.getSortOrder(),
|
sortOrderOption: emailSortOrderType.value.getSortOrder(),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -493,6 +524,7 @@ class SearchEmailController extends BaseController
|
|||||||
beforeOption: const None(),
|
beforeOption: const None(),
|
||||||
startDateOption: optionOf(newStartDate?.toUTCDate()),
|
startDateOption: optionOf(newStartDate?.toUTCDate()),
|
||||||
endDateOption: optionOf(newEndDate?.toUTCDate()),
|
endDateOption: optionOf(newEndDate?.toUTCDate()),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
|
|
||||||
_setEmailReceiveTimeType(emailReceiveTimeType);
|
_setEmailReceiveTimeType(emailReceiveTimeType);
|
||||||
@@ -507,7 +539,8 @@ class SearchEmailController extends BaseController
|
|||||||
: optionOf(simpleSearchFilter.value.text),
|
: optionOf(simpleSearchFilter.value.text),
|
||||||
beforeOption: const None(),
|
beforeOption: const None(),
|
||||||
startDateOption: const None(),
|
startDateOption: const None(),
|
||||||
endDateOption: const None()
|
endDateOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
|
|
||||||
_setEmailReceiveTimeType(emailReceiveTimeType);
|
_setEmailReceiveTimeType(emailReceiveTimeType);
|
||||||
@@ -519,7 +552,8 @@ class SearchEmailController extends BaseController
|
|||||||
popBack();
|
popBack();
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
sortOrderOption: sortOrderType.getSortOrder(),
|
sortOrderOption: sortOrderType.getSortOrder(),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
emailSortOrderType.value = sortOrderType;
|
emailSortOrderType.value = sortOrderType;
|
||||||
_searchEmailAction(context);
|
_searchEmailAction(context);
|
||||||
@@ -541,7 +575,8 @@ class SearchEmailController extends BaseController
|
|||||||
if (mailboxSelected != null && mailbox?.id != mailboxSelected.id) {
|
if (mailboxSelected != null && mailbox?.id != mailboxSelected.id) {
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
mailboxOption: Some(mailboxSelected),
|
mailboxOption: Some(mailboxSelected),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
|
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
@@ -615,13 +650,15 @@ class SearchEmailController extends BaseController
|
|||||||
case PrefixEmailAddress.from:
|
case PrefixEmailAddress.from:
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
fromOption: Some(simpleSearchFilter.value.from),
|
fromOption: Some(simpleSearchFilter.value.from),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case PrefixEmailAddress.to:
|
case PrefixEmailAddress.to:
|
||||||
_updateSimpleSearchFilter(
|
_updateSimpleSearchFilter(
|
||||||
toOption: Some(simpleSearchFilter.value.to),
|
toOption: Some(simpleSearchFilter.value.to),
|
||||||
beforeOption: const None()
|
beforeOption: const None(),
|
||||||
|
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -642,6 +679,7 @@ class SearchEmailController extends BaseController
|
|||||||
Option<UTCDate>? startDateOption,
|
Option<UTCDate>? startDateOption,
|
||||||
Option<UTCDate>? endDateOption,
|
Option<UTCDate>? endDateOption,
|
||||||
Option<Set<Comparator>>? sortOrderOption,
|
Option<Set<Comparator>>? sortOrderOption,
|
||||||
|
Option<int>? positionOption,
|
||||||
}) {
|
}) {
|
||||||
simpleSearchFilter.value = simpleSearchFilter.value.copyWith(
|
simpleSearchFilter.value = simpleSearchFilter.value.copyWith(
|
||||||
fromOption: fromOption,
|
fromOption: fromOption,
|
||||||
@@ -653,7 +691,8 @@ class SearchEmailController extends BaseController
|
|||||||
beforeOption: beforeOption,
|
beforeOption: beforeOption,
|
||||||
startDateOption: startDateOption,
|
startDateOption: startDateOption,
|
||||||
endDateOption: endDateOption,
|
endDateOption: endDateOption,
|
||||||
sortOrderOption: sortOrderOption
|
sortOrderOption: sortOrderOption,
|
||||||
|
positionOption: positionOption,
|
||||||
);
|
);
|
||||||
simpleSearchFilter.refresh();
|
simpleSearchFilter.refresh();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ abstract class ThreadDataSource {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties
|
Properties? properties
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties
|
Properties? properties
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ import 'package:model/email/presentation_email.dart';
|
|||||||
import 'package:model/extensions/email_extension.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/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/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/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/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/features/thread/domain/model/filter_message_option.dart';
|
||||||
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
||||||
|
|
||||||
@@ -38,6 +38,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties,
|
Properties? properties,
|
||||||
@@ -48,6 +49,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
position: position,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
filter: filter,
|
filter: filter,
|
||||||
properties: properties);
|
properties: properties);
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class ThreadAPI {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties
|
Properties? properties
|
||||||
@@ -44,6 +45,8 @@ class ThreadAPI {
|
|||||||
|
|
||||||
if (limit != null) queryEmailMethod.addLimit(limit);
|
if (limit != null) queryEmailMethod.addLimit(limit);
|
||||||
|
|
||||||
|
if (position != null) queryEmailMethod.addPosition(position);
|
||||||
|
|
||||||
if (sort != null) queryEmailMethod.addSorts(sort);
|
if (sort != null) queryEmailMethod.addSorts(sort);
|
||||||
|
|
||||||
if (filter != null) queryEmailMethod.addFilters(filter);
|
if (filter != null) queryEmailMethod.addFilters(filter);
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
EmailFilter? emailFilter,
|
EmailFilter? emailFilter,
|
||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
@@ -67,6 +68,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
position: position,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
filter: emailFilter?.filter,
|
filter: emailFilter?.filter,
|
||||||
properties: propertiesCreated);
|
properties: propertiesCreated);
|
||||||
@@ -75,6 +77,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
|
position: position,
|
||||||
mailboxId: emailFilter?.mailboxId,
|
mailboxId: emailFilter?.mailboxId,
|
||||||
propertiesCreated: propertiesCreated,
|
propertiesCreated: propertiesCreated,
|
||||||
);
|
);
|
||||||
@@ -131,6 +134,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
|
int? position,
|
||||||
MailboxId? mailboxId,
|
MailboxId? mailboxId,
|
||||||
Properties? propertiesCreated,
|
Properties? propertiesCreated,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
@@ -140,6 +144,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
|
position: position,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
filter: filter ?? EmailFilterCondition(inMailbox: mailboxId),
|
filter: filter ?? EmailFilterCondition(inMailbox: mailboxId),
|
||||||
properties: propertiesCreated,
|
properties: propertiesCreated,
|
||||||
@@ -266,6 +271,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
emailRequest.session,
|
emailRequest.session,
|
||||||
emailRequest.accountId,
|
emailRequest.accountId,
|
||||||
limit: emailRequest.limit,
|
limit: emailRequest.limit,
|
||||||
|
position: emailRequest.position,
|
||||||
sort: emailRequest.sort,
|
sort: emailRequest.sort,
|
||||||
filter: emailRequest.filter,
|
filter: emailRequest.filter,
|
||||||
properties: emailRequest.properties)
|
properties: emailRequest.properties)
|
||||||
@@ -283,6 +289,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties
|
Properties? properties
|
||||||
@@ -292,6 +299,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
position: position,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
filter: filter,
|
filter: filter,
|
||||||
properties: properties);
|
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/filter/filter.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/session/session.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/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:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
||||||
|
|
||||||
class GetEmailRequest with EquatableMixin {
|
class GetEmailRequest with EquatableMixin {
|
||||||
final Session session;
|
final Session session;
|
||||||
final AccountId accountId;
|
final AccountId accountId;
|
||||||
final UnsignedInt? limit;
|
final UnsignedInt? limit;
|
||||||
|
final int? position;
|
||||||
final Set<Comparator>? sort;
|
final Set<Comparator>? sort;
|
||||||
final Filter? filter;
|
final Filter? filter;
|
||||||
final FilterMessageOption? filterOption;
|
final FilterMessageOption? filterOption;
|
||||||
@@ -23,6 +24,7 @@ class GetEmailRequest with EquatableMixin {
|
|||||||
this.accountId,
|
this.accountId,
|
||||||
{
|
{
|
||||||
this.limit,
|
this.limit,
|
||||||
|
this.position,
|
||||||
this.sort,
|
this.sort,
|
||||||
this.filter,
|
this.filter,
|
||||||
this.filterOption,
|
this.filterOption,
|
||||||
@@ -36,6 +38,7 @@ class GetEmailRequest with EquatableMixin {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit,
|
limit,
|
||||||
|
position,
|
||||||
sort,
|
sort,
|
||||||
filter,
|
filter,
|
||||||
properties,
|
properties,
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ abstract class ThreadRepository {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties,
|
Properties? properties,
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
|
|
||||||
import 'package:core/core.dart';
|
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: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/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';
|
||||||
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/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/repository/thread_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
|
|
||||||
@@ -22,6 +22,7 @@ class SearchEmailInteractor {
|
|||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
|
int? position,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties,
|
Properties? properties,
|
||||||
@@ -34,6 +35,7 @@ class SearchEmailInteractor {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
position: position,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
filter: filter,
|
filter: filter,
|
||||||
properties: properties);
|
properties: properties);
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
|
|
||||||
import 'package:core/core.dart';
|
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: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/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';
|
||||||
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/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/repository/thread_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||||
|
|
||||||
@@ -24,6 +24,7 @@ class SearchMoreEmailInteractor {
|
|||||||
{
|
{
|
||||||
UnsignedInt? limit,
|
UnsignedInt? limit,
|
||||||
Set<Comparator>? sort,
|
Set<Comparator>? sort,
|
||||||
|
int? position,
|
||||||
Filter? filter,
|
Filter? filter,
|
||||||
Properties? properties,
|
Properties? properties,
|
||||||
EmailId? lastEmailId
|
EmailId? lastEmailId
|
||||||
@@ -36,6 +37,7 @@ class SearchMoreEmailInteractor {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
position: position,
|
||||||
sort: sort,
|
sort: sort,
|
||||||
filter: filter,
|
filter: filter,
|
||||||
properties: properties);
|
properties: properties);
|
||||||
|
|||||||
@@ -536,6 +536,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
_session!,
|
_session!,
|
||||||
_accountId!,
|
_accountId!,
|
||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
|
position: _searchEmailFilter.position,
|
||||||
sort: _searchEmailFilter.sortOrder ?? _sortOrder,
|
sort: _searchEmailFilter.sortOrder ?? _sortOrder,
|
||||||
filterOption: mailboxDashBoardController.filterMessageOption.value,
|
filterOption: mailboxDashBoardController.filterMessageOption.value,
|
||||||
filter: _getFilterCondition(oldestEmail: oldestEmail, mailboxIdSelected: _currentMailboxId),
|
filter: _getFilterCondition(oldestEmail: oldestEmail, mailboxIdSelected: _currentMailboxId),
|
||||||
@@ -726,7 +727,18 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
}
|
}
|
||||||
mailboxDashBoardController.emailsInCurrentMailbox.clear();
|
mailboxDashBoardController.emailsInCurrentMailbox.clear();
|
||||||
canSearchMore = true;
|
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();
|
searchController.activateSimpleSearch();
|
||||||
|
|
||||||
@@ -734,8 +746,12 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
_session!,
|
_session!,
|
||||||
_accountId!,
|
_accountId!,
|
||||||
limit: limit ?? ThreadConstants.defaultLimit,
|
limit: limit ?? ThreadConstants.defaultLimit,
|
||||||
|
position: _searchEmailFilter.position,
|
||||||
sort: _searchEmailFilter.sortOrder,
|
sort: _searchEmailFilter.sortOrder,
|
||||||
filter: _searchEmailFilter.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()),
|
filter: _searchEmailFilter.mappingToEmailFilterCondition(
|
||||||
|
sortOrderType: searchController.sortOrderFiltered.value,
|
||||||
|
moreFilterCondition: _getFilterCondition()
|
||||||
|
),
|
||||||
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
@@ -783,20 +799,30 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
final lastEmail = mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty
|
final lastEmail = mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty
|
||||||
? mailboxDashBoardController.emailsInCurrentMailbox.last
|
? mailboxDashBoardController.emailsInCurrentMailbox.last
|
||||||
: null;
|
: null;
|
||||||
final firstEmail = mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty
|
|
||||||
? mailboxDashBoardController.emailsInCurrentMailbox.first
|
if (searchController.sortOrderFiltered.value.isScrollByPosition()) {
|
||||||
: null;
|
final nextPosition = mailboxDashBoardController.emailsInCurrentMailbox.length;
|
||||||
if (optionOf(_searchEmailFilter.sortOrder).toString() == EmailSortOrderType.oldest.getSortOrder().toString()) {
|
log('ThreadController::searchMoreEmails:nextPosition: $nextPosition');
|
||||||
searchController.updateFilterEmail(beforeOption: optionOf(firstEmail?.receivedAt));
|
searchController.updateFilterEmail(
|
||||||
|
positionOption: Some(nextPosition),
|
||||||
|
beforeOption: const None()
|
||||||
|
);
|
||||||
|
} else if (searchController.sortOrderFiltered.value == EmailSortOrderType.oldest) {
|
||||||
|
searchController.updateFilterEmail(startDateOption: optionOf(lastEmail?.receivedAt));
|
||||||
} else {
|
} else {
|
||||||
searchController.updateFilterEmail(beforeOption: optionOf(lastEmail?.receivedAt));
|
searchController.updateFilterEmail(beforeOption: optionOf(lastEmail?.receivedAt));
|
||||||
}
|
}
|
||||||
|
|
||||||
consumeState(_searchMoreEmailInteractor.execute(
|
consumeState(_searchMoreEmailInteractor.execute(
|
||||||
_session!,
|
_session!,
|
||||||
_accountId!,
|
_accountId!,
|
||||||
limit: ThreadConstants.defaultLimit,
|
limit: ThreadConstants.defaultLimit,
|
||||||
sort: _searchEmailFilter.sortOrder ?? _sortOrder,
|
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!),
|
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
||||||
lastEmailId: lastEmail?.id
|
lastEmailId: lastEmail?.id
|
||||||
));
|
));
|
||||||
|
|||||||
+42
-2
@@ -168,6 +168,14 @@ packages:
|
|||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "1.0.0+1"
|
version: "1.0.0+1"
|
||||||
|
cross_file:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: cross_file
|
||||||
|
sha256: "2f9d2cbccb76127ba28528cb3ae2c2326a122446a83de5a056aaa3880d3882c5"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.3+7"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -297,10 +305,42 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_image_compress
|
name: flutter_image_compress
|
||||||
sha256: "37f1b26399098e5f97b74c1483f534855e7dff68ead6ddaccf747029fb03f29f"
|
sha256: f159d2e8c4ed04b8e36994124fd4a5017a0f01e831ae3358c74095c340e9ae5e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.3"
|
version: "2.1.0"
|
||||||
|
flutter_image_compress_common:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_common
|
||||||
|
sha256: "7cad12802628706655920089cfe9ee1d1098300e7f39a079eb160458bbc47652"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.3"
|
||||||
|
flutter_image_compress_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_macos
|
||||||
|
sha256: fea1e3d71150d03373916b832c49b5c2f56c3e7e13da82a929274a2c6f88251e
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.1"
|
||||||
|
flutter_image_compress_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_platform_interface
|
||||||
|
sha256: eb4f055138b29b04498ebcb6d569aaaee34b64d75fb74ea0d40f9790bf47ee9d
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.3"
|
||||||
|
flutter_image_compress_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_web
|
||||||
|
sha256: da41cc3859f19d11c7d10be615f6a9dcf0907e7daffde7442bf4cc2486663660
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.3+2"
|
||||||
flutter_inappwebview:
|
flutter_inappwebview:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
Reference in New Issue
Block a user