TF-3087 [MOBILE] Apply new design suggestions search for email address in search bar

This commit is contained in:
dab246
2024-08-30 14:45:30 +07:00
committed by Dat H. Pham
parent 208a6cde0d
commit 4494f7bdaf
2 changed files with 56 additions and 1 deletions
@@ -19,6 +19,7 @@ import 'package:model/email/mark_star_action.dart';
import 'package:model/email/prefix_email_address.dart'; import 'package:model/email/prefix_email_address.dart';
import 'package:model/email/presentation_email.dart'; import 'package:model/email/presentation_email.dart';
import 'package:model/email/read_actions.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/list_presentation_email_extension.dart';
import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart';
@@ -97,6 +98,7 @@ class SearchEmailController extends BaseController
final currentSearchText = RxString(''); final currentSearchText = RxString('');
final listRecentSearch = RxList<RecentSearch>(); final listRecentSearch = RxList<RecentSearch>();
final listSuggestionSearch = RxList<PresentationEmail>(); final listSuggestionSearch = RxList<PresentationEmail>();
final listContactSuggestionSearch = RxList<EmailAddress>();
final simpleSearchFilter = Rx<SimpleSearchFilter>(SimpleSearchFilter()); final simpleSearchFilter = Rx<SimpleSearchFilter>(SimpleSearchFilter());
final searchIsRunning = RxBool(false); final searchIsRunning = RxBool(false);
final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs; final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs;
@@ -182,9 +184,16 @@ class SearchEmailController extends BaseController
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : 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!); final tupleListSuggestion = await Future.wait([
quickSearchEmails(session: session!, accountId: accountId!),
mailboxDashBoardController.getContactSuggestion(value)
]);
listSuggestionSearch.value = tupleListSuggestion[0] as List<PresentationEmail>;
listContactSuggestionSearch.value = tupleListSuggestion[1] as List<EmailAddress>;
} else { } else {
listSuggestionSearch.clear(); listSuggestionSearch.clear();
listContactSuggestionSearch.clear();
} }
if (listSuggestionSearch.isEmpty && currentSearchText.isEmpty) { if (listSuggestionSearch.isEmpty && currentSearchText.isEmpty) {
listRecentSearch.value = await getAllRecentSearchAction(pattern: value); listRecentSearch.value = await getAllRecentSearchAction(pattern: value);
@@ -454,6 +463,18 @@ class SearchEmailController extends BaseController
_searchEmailAction(context); _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) { void submitSearchAction(BuildContext context, String query) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
textOption: Some(SearchQuery(query)), textOption: Some(SearchQuery(query)),
@@ -723,6 +744,7 @@ class SearchEmailController extends BaseController
textInputSearchController.clear(); textInputSearchController.clear();
currentSearchText.value = ''; currentSearchText.value = '';
listSuggestionSearch.clear(); listSuggestionSearch.clear();
listContactSuggestionSearch.clear();
} }
void clearAllResultSearch() { void clearAllResultSearch() {
@@ -730,6 +752,7 @@ class SearchEmailController extends BaseController
currentSearchText.value = ''; currentSearchText.value = '';
listRecentSearch.clear(); listRecentSearch.clear();
listSuggestionSearch.clear(); listSuggestionSearch.clear();
listContactSuggestionSearch.clear();
listResultSearch.clear(); listResultSearch.clear();
simpleSearchFilter.value = SimpleSearchFilter(); simpleSearchFilter.value = SimpleSearchFilter();
} }
@@ -8,6 +8,7 @@ import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.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'; 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_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/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/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/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/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'; import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart';
@@ -80,6 +82,12 @@ class SearchEmailView extends GetWidget<SearchEmailController>
child: Column(children: [ child: Column(children: [
if (controller.currentSearchText.value.isNotEmpty) if (controller.currentSearchText.value.isNotEmpty)
_buildShowAllResultSearchButton(context, controller.currentSearchText.value), _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) if (controller.listSuggestionSearch.isNotEmpty && controller.currentSearchText.isNotEmpty)
_buildListSuggestionSearch(context, controller.listSuggestionSearch) _buildListSuggestionSearch(context, controller.listSuggestionSearch)
else if (controller.listRecentSearch.isNotEmpty && controller.listSuggestionSearch.isEmpty) else if (controller.listRecentSearch.isNotEmpty && controller.listSuggestionSearch.isEmpty)
@@ -463,6 +471,30 @@ class SearchEmailView extends GetWidget<SearchEmailController>
}); });
} }
Widget _buildListContactSuggestionSearch(
BuildContext context,
List<EmailAddress> 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) { Widget _buildEmptyEmail(BuildContext context) {
return Obx(() => controller.viewState.value.fold( return Obx(() => controller.viewState.value.fold(
(failure) => const SizedBox.shrink(), (failure) => const SizedBox.shrink(),