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/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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user