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/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<RecentSearch>();
final listSuggestionSearch = RxList<PresentationEmail>();
final listContactSuggestionSearch = RxList<EmailAddress>();
final simpleSearchFilter = Rx<SimpleSearchFilter>(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<PresentationEmail>;
listContactSuggestionSearch.value = tupleListSuggestion[1] as List<EmailAddress>;
} 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();
}
@@ -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<SearchEmailController>
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<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) {
return Obx(() => controller.viewState.value.fold(
(failure) => const SizedBox.shrink(),