diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index 348bb97a0..dd0d63e35 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -19,6 +19,7 @@ import 'package:model/email/mark_star_action.dart'; import 'package:model/email/prefix_email_address.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/email/read_actions.dart'; +import 'package:model/extensions/email_address_extension.dart'; import 'package:model/extensions/list_presentation_email_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart'; @@ -97,6 +98,7 @@ class SearchEmailController extends BaseController final currentSearchText = RxString(''); final listRecentSearch = RxList(); final listSuggestionSearch = RxList(); + final listContactSuggestionSearch = RxList(); final simpleSearchFilter = Rx(SimpleSearchFilter()); final searchIsRunning = RxBool(false); final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs; @@ -182,9 +184,16 @@ class SearchEmailController extends BaseController positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None() ); if (value.isNotEmpty && session != null && accountId != null) { - listSuggestionSearch.value = await quickSearchEmails(session: session!, accountId: accountId!); + final tupleListSuggestion = await Future.wait([ + quickSearchEmails(session: session!, accountId: accountId!), + mailboxDashBoardController.getContactSuggestion(value) + ]); + + listSuggestionSearch.value = tupleListSuggestion[0] as List; + listContactSuggestionSearch.value = tupleListSuggestion[1] as List; } else { listSuggestionSearch.clear(); + listContactSuggestionSearch.clear(); } if (listSuggestionSearch.isEmpty && currentSearchText.isEmpty) { listRecentSearch.value = await getAllRecentSearchAction(pattern: value); @@ -454,6 +463,18 @@ class SearchEmailController extends BaseController _searchEmailAction(context); } + void searchEmailByEmailAddressAction( + BuildContext context, + EmailAddress emailAddress + ) { + _updateSimpleSearchFilter( + fromOption: Some({emailAddress.emailAddress}), + beforeOption: const None(), + positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None() + ); + _searchEmailAction(context); + } + void submitSearchAction(BuildContext context, String query) { _updateSimpleSearchFilter( textOption: Some(SearchQuery(query)), @@ -723,6 +744,7 @@ class SearchEmailController extends BaseController textInputSearchController.clear(); currentSearchText.value = ''; listSuggestionSearch.clear(); + listContactSuggestionSearch.clear(); } void clearAllResultSearch() { @@ -730,6 +752,7 @@ class SearchEmailController extends BaseController currentSearchText.value = ''; listRecentSearch.clear(); listSuggestionSearch.clear(); + listContactSuggestionSearch.clear(); listResultSearch.clear(); simpleSearchFilter.value = SimpleSearchFilter(); } diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index d9761e1e8..fdfbc0322 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -8,6 +8,7 @@ import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; @@ -15,6 +16,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_sea 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/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/contact_quick_search_item.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/email_quick_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/recent_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart'; @@ -80,6 +82,12 @@ class SearchEmailView extends GetWidget child: Column(children: [ if (controller.currentSearchText.value.isNotEmpty) _buildShowAllResultSearchButton(context, controller.currentSearchText.value), + if (controller.listContactSuggestionSearch.isNotEmpty + && controller.currentSearchText.isNotEmpty) + _buildListContactSuggestionSearch(context, controller.listContactSuggestionSearch), + if (controller.listContactSuggestionSearch.isNotEmpty + && controller.listSuggestionSearch.isNotEmpty) + const Divider(), if (controller.listSuggestionSearch.isNotEmpty && controller.currentSearchText.isNotEmpty) _buildListSuggestionSearch(context, controller.listSuggestionSearch) else if (controller.listRecentSearch.isNotEmpty && controller.listSuggestionSearch.isEmpty) @@ -463,6 +471,30 @@ class SearchEmailView extends GetWidget }); } + Widget _buildListContactSuggestionSearch( + BuildContext context, + List listContactSuggestionSearch + ) { + return ListView.builder( + shrinkWrap: true, + primary: false, + itemCount: listContactSuggestionSearch.length, + itemBuilder: (context, index) { + final emailAddress = listContactSuggestionSearch[index]; + return Material( + type: MaterialType.transparency, + child: InkWell( + child: ContactQuickSearchItem(emailAddress: emailAddress), + onTap: () => controller.searchEmailByEmailAddressAction( + context, + emailAddress + ), + ), + ); + } + ); + } + Widget _buildEmptyEmail(BuildContext context) { return Obx(() => controller.viewState.value.fold( (failure) => const SizedBox.shrink(),