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
+42 -2
View File
@@ -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,
]; ];
} }
@@ -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
View File
@@ -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: