From d4f72b7d815315f5109a262038a7050a1f621da2 Mon Sep 17 00:00:00 2001 From: hieubt Date: Sun, 26 Nov 2023 13:51:38 +0700 Subject: [PATCH] TF-2323 Implement from criterion with selection and follow search recommendation (cherry picked from commit 23817c87d602c370fc9a0ea5fc86e660d61b7f07) --- .../presentation/contact_controller.dart | 7 --- .../contact/presentation/contact_view.dart | 45 +++++++++++-------- .../mailbox_dashboard_controller.dart | 27 ++++++++++- .../controller/search_controller.dart | 15 +++++-- 4 files changed, 64 insertions(+), 30 deletions(-) diff --git a/lib/features/contact/presentation/contact_controller.dart b/lib/features/contact/presentation/contact_controller.dart index b90418e7e..c6cca3804 100644 --- a/lib/features/contact/presentation/contact_controller.dart +++ b/lib/features/contact/presentation/contact_controller.dart @@ -18,11 +18,9 @@ import 'package:tmail_ui_user/features/composer/domain/state/get_device_contact_ import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_all_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart'; -import 'package:tmail_ui_user/features/composer/presentation/model/suggestion_email_address.dart'; import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart'; import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_suggestion_box_item.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/routes/route_navigation.dart'; class ContactController extends BaseController { @@ -176,11 +174,6 @@ class ContactController extends BaseController { popBack(result: emailAddress); } - SuggestionEmailAddress getFromMeSuggestion(BuildContext context) { - final userEmailAddress = EmailAddress(AppLocalizations.of(context).me, userProfile.value?.email); - return SuggestionEmailAddress(userEmailAddress, state: SuggestionEmailState.valid); - } - void closeContactView(BuildContext context) { clearAllTextInputSearchForm(); KeyboardUtils.hideKeyboard(context); diff --git a/lib/features/contact/presentation/contact_view.dart b/lib/features/contact/presentation/contact_view.dart index 18974a40c..632917dc5 100644 --- a/lib/features/contact/presentation/contact_view.dart +++ b/lib/features/contact/presentation/contact_view.dart @@ -78,25 +78,34 @@ class ContactView extends GetWidget { onTextChangeSearchAction: controller.onTextSearchChange, onSearchTextAction: controller.onSearchTextAction, ), - if (PlatformInfo.isWeb && !controller.responsiveUtils.isMobile(context)) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Column( - children: [ - Obx(() => ContactSuggestionBoxItem( - controller.getFromMeSuggestion(context), - padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils), - selectedContactCallbackAction: (contact) { - controller.selectContact(context, contact); - }, - )), - Padding( - padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils), - child: const Divider(height: 1, color: AppColor.colorDivider), + if (PlatformInfo.isWeb) + Obx(() { + final userEmail = controller.userProfile.value?.email; + if (userEmail != null && userEmail.isNotEmpty) { + final userEmailAddress = EmailAddress(AppLocalizations.of(context).me, controller.userProfile.value?.email); + final fromMeSuggestionEmailAddress = SuggestionEmailAddress(userEmailAddress, state: SuggestionEmailState.valid); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: Column( + children: [ + ContactSuggestionBoxItem( + fromMeSuggestionEmailAddress, + padding: ContactUtils.getPaddingSearchResultList(context, controller.responsiveUtils), + selectedContactCallbackAction: (contact) { + controller.selectContact(context, contact); + }, + ), + Padding( + padding: ContactUtils.getPaddingDividerSearchResultList(context, controller.responsiveUtils), + child: const Divider(height: 1, color: AppColor.colorDivider), + ), + ], ), - ], - ), - ), + ); + } else { + return const SizedBox.shrink(); + } + }), Expanded(child: Obx(() { if (controller.listContactSearched.isNotEmpty) { if (PlatformInfo.isMobile) { diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 39b94406e..2d326a67a 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -40,6 +40,7 @@ import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.d import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/save_to_draft_arguments.dart'; +import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; @@ -1438,6 +1439,14 @@ class MailboxDashBoardController extends ReloadableController { return searchController.selectQuickSearchFilter(filter, userProfile.value!); } + void selectQuickSearchFilterFrom(EmailAddress fromEmailFilter) { + return searchController.selectQuickSearchFilter( + QuickSearchFilter.fromMe, + userProfile.value!, + fromEmailFilter: fromEmailFilter + ); + } + void addFilterToSuggestionForm(QuickSearchFilter filter) { searchController.addFilterToSuggestionForm(filter); } @@ -1518,9 +1527,23 @@ class MailboxDashBoardController extends ReloadableController { } } - void selectQuickSearchFilterAction(QuickSearchFilter filter) { + void selectQuickSearchFilterAction(QuickSearchFilter filter) async { log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter'); - selectQuickSearchFilter(filter); + if (filter == QuickSearchFilter.fromMe && + accountId.value != null && + sessionCurrent != null + ) { + final listContactSelected = searchController.searchEmailFilter.value.from; + final arguments = ContactArguments(accountId.value!, sessionCurrent!, listContactSelected); + + final newContact = await DialogRouter.pushGeneralDialog(routeName: AppRoutes.contact, arguments: arguments); + + if (newContact is EmailAddress) { + selectQuickSearchFilterFrom(newContact); + } + } else { + selectQuickSearchFilter(filter); + } dispatchAction(StartSearchEmailAction(filter: filter)); } diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index 65cb73322..caf5578a9 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -10,6 +10,7 @@ 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/utc_date.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.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_filter_condition.dart'; @@ -70,7 +71,11 @@ class SearchController extends BaseController with DateRangePickerMixin { searchEmailFilter.value = SearchEmailFilter.initial(); } - void selectQuickSearchFilter(QuickSearchFilter quickSearchFilter, UserProfile userProfile) { + void selectQuickSearchFilter( + QuickSearchFilter quickSearchFilter, + UserProfile userProfile, + {EmailAddress? fromEmailFilter} + ) { final isFilterSelected = quickSearchFilter.isSelected(searchEmailFilter.value, userProfile); switch (quickSearchFilter) { @@ -81,8 +86,12 @@ class SearchController extends BaseController with DateRangePickerMixin { updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime); return; case QuickSearchFilter.fromMe: - final newListEmailAddress = isFilterSelected ? {} : {userProfile.email}; - updateFilterEmail(fromOption: Some(newListEmailAddress)); + if (fromEmailFilter != null) { + final newListEmailAddress = (fromEmailFilter.email != null && fromEmailFilter.email!.isNotEmpty) + ? {fromEmailFilter.email!} + : {}; + updateFilterEmail(fromOption: Some(newListEmailAddress)); + } return; case QuickSearchFilter.sortBy: return;