diff --git a/core/lib/core.dart b/core/lib/core.dart index b0d5f4e6f..f86d52b58 100644 --- a/core/lib/core.dart +++ b/core/lib/core.dart @@ -32,6 +32,7 @@ export 'utils/app_logger.dart'; export 'utils/benchmark.dart'; export 'utils/fps_manager.dart'; export 'utils/build_utils.dart'; +export 'utils/wrapper.dart'; // Views export 'presentation/views/text/slogan_builder.dart'; diff --git a/core/lib/utils/wrapper.dart b/core/lib/utils/wrapper.dart new file mode 100644 index 000000000..21b52349f --- /dev/null +++ b/core/lib/utils/wrapper.dart @@ -0,0 +1,4 @@ +class Wrapped { + final T value; + const Wrapped.value(this.value); +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart new file mode 100644 index 000000000..afb4d3f13 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart @@ -0,0 +1,79 @@ +import 'package:core/core.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/operator/logic_filter_operator.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; +import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; + +class SearchEmailFilter { + final Set from; + final Set to; + final SearchQuery? text; + final String? subject; + final String? hasKeyword; + final String? notKeyword; + final PresentationMailbox? mailbox; + final EmailReceiveTimeType emailReceiveTimeType; + final bool hasAttachment; + + SearchEmailFilter({ + Set? from, + Set? to, + EmailReceiveTimeType? emailReceiveTimeType, + bool? hasAttachment, + this.text, + this.subject, + this.hasKeyword, + this.notKeyword, + this.mailbox, + }) : from = from ?? {}, + to = to ?? {}, + hasAttachment = hasAttachment ?? false, + emailReceiveTimeType = + emailReceiveTimeType ?? EmailReceiveTimeType.allTime; + + SearchEmailFilter copyWith({ + Set? from, + Set? to, + SearchQuery? text, + String? subject, + Wrapped? hasKeyword, + Wrapped? notKeyword, + PresentationMailbox? mailbox, + EmailReceiveTimeType? emailReceiveTimeType, + bool? hasAttachment, + }) { + return SearchEmailFilter( + from: from ?? this.from, + to: to ?? this.to, + text: text ?? this.text, + subject: subject ?? this.subject, + hasKeyword: hasKeyword != null ? hasKeyword.value : this.hasKeyword, + notKeyword: notKeyword !=null ? notKeyword.value : this.notKeyword, + mailbox: mailbox ?? this.mailbox, + emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType, + hasAttachment: hasAttachment ?? this.hasAttachment, + ); + } + + Filter? mappingToEmailFilterCondition() { + final emailEmailFilterConditionShared = EmailFilterCondition( + text: text?.value, + inMailbox: mailbox?.id, + after: emailReceiveTimeType.toUTCDate(), + hasKeyword: hasKeyword, + notKeyword: notKeyword, + hasAttachment: hasAttachment == false ? null : hasAttachment, + subject: subject, + ); + return LogicFilterOperator(Operator.AND, { + emailEmailFilterConditionShared, + LogicFilterOperator( + Operator.AND, to.map((e) => EmailFilterCondition(to: e)).toSet()), + LogicFilterOperator( + Operator.AND, from.map((e) => EmailFilterCondition(from: e)).toSet()), + }); + } +}