TF-3087 [MOBILE] Apply new design suggestions search for email address in search bar
This commit is contained in:
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user