From 46fa9b3006689109920f564dcbfa90c2c8b755c8 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 3 Nov 2022 01:24:27 +0700 Subject: [PATCH] TF-1063 Disable search email when open mailbox --- .../presentation/mailbox_controller.dart | 15 ++- .../presentation/action/dashboard_action.dart | 22 ++-- .../advanced_filter_controller.dart | 57 ++++++++- .../mailbox_dashboard_controller.dart | 5 +- .../controller/search_controller.dart | 71 ++++++++--- .../model/search/search_email_filter.dart | 20 ++- .../icon_open_advanced_search_widget.dart | 4 +- .../presentation/search_email_controller.dart | 4 +- .../presentation/search_email_view.dart | 3 +- .../mixin/base_email_item_tile.dart | 40 +++--- .../presentation/thread_controller.dart | 26 +--- .../thread/presentation/thread_view.dart | 42 +++--- .../widgets/email_tile_builder.dart | 42 +++--- .../widgets/email_tile_web_builder.dart | 120 +++++++++--------- 14 files changed, 275 insertions(+), 196 deletions(-) diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 20da1483a..eb6a261fe 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -239,8 +239,10 @@ class MailboxController extends BaseMailboxController { }); dashboardActionWorker = ever(mailboxDashBoardController.dashBoardAction, (action) { - if(action is DashBoardAction) { - if(action is ClearSearchEmailAction) { + if (action is ClearSearchEmailAction) { + _switchBackToMailboxDefault(); + } else if (action is SelectMailboxDefaultAction) { + if (mailboxDashBoardController.selectedMailbox.value == null) { _switchBackToMailboxDefault(); } } @@ -369,9 +371,7 @@ class MailboxController extends BaseMailboxController { mailboxDashBoardController.setSelectedMailbox(presentationMailboxSelected); mailboxDashBoardController.clearSelectedEmail(); - if (mailboxDashBoardController.searchController.isSearchActive()) { - mailboxDashBoardController.searchController.disableSearch(); - } + _disableAllSearchEmail(); if (_responsiveUtils.hasLeftMenuDrawerActive(context)) { mailboxDashBoardController.closeMailboxMenuDrawer(); @@ -380,6 +380,11 @@ class MailboxController extends BaseMailboxController { } } + void _disableAllSearchEmail() { + mailboxDashBoardController.dispatchAction(ClearAllFieldOfAdvancedSearchAction()); + mailboxDashBoardController.searchController.disableAllSearchEmail(); + } + void openMailbox( BuildContext context, PresentationMailbox presentationMailboxSelected diff --git a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart index ac040f4e0..28c4eebe9 100644 --- a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart +++ b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart @@ -72,14 +72,6 @@ class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction { List get props => [presentationEmail]; } -class DisableSearchEmailAction extends DashBoardAction { - - DisableSearchEmailAction(); - - @override - List get props => []; -} - class StartSearchEmailAction extends DashBoardAction { StartSearchEmailAction(); @@ -101,6 +93,20 @@ class EmptyTrashAction extends DashBoardAction { class ClearSearchEmailAction extends DashBoardAction { ClearSearchEmailAction(); + @override + List get props => []; +} + +class ClearAllFieldOfAdvancedSearchAction extends DashBoardAction { + ClearAllFieldOfAdvancedSearchAction(); + + @override + List get props => []; +} + +class SelectMailboxDefaultAction extends DashBoardAction { + SelectMailboxDefaultAction(); + @override List get props => []; } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart index 269ecc927..5cbc1ac4e 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/input_field_focus_manager.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; @@ -62,6 +63,14 @@ class AdvancedFilterController extends BaseController { DateTime? get endDate => _endDate; + late Worker _dashboardActionWorker; + + @override + void onInit() { + _registerWorkerListener(); + super.onInit(); + } + @override void onReady() { if (!BuildUtils.isWeb) { @@ -80,7 +89,7 @@ class AdvancedFilterController extends BaseController { } void cleanSearchFilter(BuildContext context) { - searchController.cleanSearchFilter(); + searchController.clearSearchFilter(); dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime; clearDateRangeOfFilter(); subjectFilterInputController.text = ''; @@ -88,7 +97,7 @@ class AdvancedFilterController extends BaseController { notKeyWordFilterInputController.text = ''; dateFilterInputController.text = ''; hasAttachment.value = false; - searchController.isAdvancedSearchHasApply.value = false; + searchController.deactivateAdvancedSearch(); searchController.isAdvancedSearchViewOpen.toggle(); _mailboxDashBoardController.searchEmail( context, StringConvert.writeNullToEmpty(searchEmailFilter.text?.value)); @@ -167,7 +176,11 @@ class AdvancedFilterController extends BaseController { void applyAdvancedSearchFilter(BuildContext context) { _updateFilterEmailFromAdvancedSearchView(); - searchController.isAdvancedSearchHasApply.value = isAdvancedSearchHasApplied; + if (isAdvancedSearchHasApplied) { + searchController.activateAdvancedSearch(); + } else { + searchController.deactivateAdvancedSearch(); + } if (!isAdvancedSearchHasApplied) { final newSearchEmailFilter = searchController.searchEmailFilter.value.clearBeforeDate(); searchController.searchEmailFilter.value = newSearchEmailFilter; @@ -357,6 +370,43 @@ class AdvancedFilterController extends BaseController { endDate: _endDate.toUTCDate()); } + void _resetAllToOriginalValue() { + dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime; + hasAttachment.value = false; + lastTextForm.value = ''; + lastTextTo.value = ''; + _startDate = null; + _endDate = null; + } + + void _clearAllTextFieldInput() { + subjectFilterInputController.clear(); + hasKeyWordFilterInputController.clear(); + notKeyWordFilterInputController.clear(); + dateFilterInputController.clear(); + mailBoxFilterInputController.clear(); + } + + void _registerWorkerListener() { + _dashboardActionWorker = ever( + _mailboxDashBoardController.dashBoardAction, + (action) { + if (action is ClearAllFieldOfAdvancedSearchAction) { + _handleClearAllFieldOfAdvancedSearch(); + } + } + ); + } + + void _unregisterWorkerListener() { + _dashboardActionWorker.dispose(); + } + + void _handleClearAllFieldOfAdvancedSearch() { + _resetAllToOriginalValue(); + _clearAllTextFieldInput(); + } + @override void onClose() { focusManager.dispose(); @@ -365,6 +415,7 @@ class AdvancedFilterController extends BaseController { notKeyWordFilterInputController.dispose(); mailBoxFilterInputController.dispose(); dateFilterInputController.dispose(); + _unregisterWorkerListener(); super.onClose(); } diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index fcef73680..7eae795d2 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -426,7 +426,7 @@ class MailboxDashBoardController extends ReloadableController { void clearSearchEmail() { dispatchAction(ClearSearchEmailAction()); - searchController.disableSearch(); + searchController.disableSimpleSearch(); } void _unSelectedMailbox() { @@ -1009,7 +1009,7 @@ class MailboxDashBoardController extends ReloadableController { dashboardRoute.value = route; if (dashboardRoute.value == DashboardRoutes.searchEmail) { - searchController.enableSearch(); + searchController.activateSimpleSearch(); } } @@ -1200,6 +1200,7 @@ class MailboxDashBoardController extends ReloadableController { } void selectQuickSearchFilterAction(QuickSearchFilter filter) { + log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter'); selectQuickSearchFilter(quickSearchFilter: filter); dispatchAction(StartSearchEmailAction()); } diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index e04f2c622..ff11280fa 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -34,17 +34,12 @@ class SearchController extends BaseController { final ResponsiveUtils _responsiveUtils = Get.find(); final searchInputController = TextEditingController(); - final searchEmailFilter = SearchEmailFilter().obs; + final searchEmailFilter = SearchEmailFilter.initial().obs; final searchState = SearchState.initial().obs; final isAdvancedSearchViewOpen = false.obs; - final isAdvancedSearchHasApply = false.obs; - final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs; - final mailboxFilterSelectedFormAdvancedSearch = Rxn(); - final hasAttachment = false.obs; final emailReceiveTimeType = Rxn(); - final searchIsActive = RxBool(false); - - SearchEmailFilter get searchEmailFilterValue => searchEmailFilter.value; + final simpleSearchIsActivated = RxBool(false); + final advancedSearchIsActivated = RxBool(false); SearchQuery? get searchQuery => searchEmailFilter.value.text; @@ -66,8 +61,8 @@ class SearchController extends BaseController { isAdvancedSearchViewOpen.toggle(); } - cleanSearchFilter() { - searchEmailFilter.value = SearchEmailFilter(); + void clearSearchFilter() { + searchEmailFilter.value = SearchEmailFilter.initial(); } void selectQuickSearchFilter({ @@ -145,6 +140,7 @@ class SearchController extends BaseController { startDate: startDate, endDate: endDate, ); + searchEmailFilter.refresh(); } void _registerSearchFocusListener() { @@ -152,10 +148,10 @@ class SearchController extends BaseController { final hasFocus = searchFocus.hasFocus; final query = searchEmailFilter.value.text?.value; log('SearchController::_registerSearchFocusListener(): hasFocus: $hasFocus | query: $query'); - if (!hasFocus && (query == null || query.isEmpty) && isAdvancedSearchHasApply.isFalse) { + if (!hasFocus && (query == null || query.isEmpty) && advancedSearchIsActivated.isFalse) { updateFilterEmail(text: SearchQuery.initial()); searchInputController.clear(); - cleanSearchFilter(); + clearSearchFilter(); searchFocus.unfocus(); } }); @@ -164,19 +160,16 @@ class SearchController extends BaseController { bool isSearchActive() => searchState.value.searchStatus == SearchStatus.ACTIVE; - bool isAdvanceSearchActive() => isAdvancedSearchHasApply.isTrue; - - bool get isSearchEmailRunning => isSearchActive() || isAdvanceSearchActive(); + bool get isSearchEmailRunning => simpleSearchIsActivated.isTrue || advancedSearchIsActivated.isTrue; void enableSearch() { searchState.value = searchState.value.enableSearchState(); } - void disableSearch() { - searchState.value = searchState.value.disableSearchState(); + void disableSimpleSearch() { updateFilterEmail(text: SearchQuery.initial()); - searchInputController.clear(); - searchFocus.unfocus(); + _clearAllTextInputSimpleSearch(); + hideSimpleSearchFormView(); } void clearTextSearch() { @@ -237,6 +230,46 @@ class SearchController extends BaseController { } } + void activateSimpleSearch() { + simpleSearchIsActivated.value = true; + } + + void deactivateSimpleSearch() { + simpleSearchIsActivated.value = false; + } + + void activateAdvancedSearch() { + advancedSearchIsActivated.value = true; + } + + void deactivateAdvancedSearch() { + advancedSearchIsActivated.value = false; + } + + void hideAdvancedSearchFormView() { + isAdvancedSearchViewOpen.value = false; + } + + void hideSimpleSearchFormView() { + searchState.value = searchState.value.disableSearchState(); + } + + void _clearAllTextInputSimpleSearch() { + searchInputController.clear(); + searchFocus.unfocus(); + emailReceiveTimeType.value = null; + } + + void disableAllSearchEmail() { + _clearAllTextInputSimpleSearch(); + deactivateSimpleSearch(); + hideSimpleSearchFormView(); + + clearSearchFilter(); + deactivateAdvancedSearch(); + hideAdvancedSearchFormView(); + } + @override void onDone() {} diff --git a/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart index dc9557173..2481f2379 100644 --- a/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart +++ b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart @@ -1,3 +1,4 @@ +import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter_operator.dart'; import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.dart'; @@ -7,7 +8,7 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; -class SearchEmailFilter { +class SearchEmailFilter with EquatableMixin { final Set from; final Set to; final SearchQuery? text; @@ -20,6 +21,8 @@ class SearchEmailFilter { final UTCDate? startDate; final UTCDate? endDate; + factory SearchEmailFilter.initial() => SearchEmailFilter(); + SearchEmailFilter({ Set? from, Set? to, @@ -108,6 +111,21 @@ class SearchEmailFilter { ? LogicFilterOperator(Operator.AND, listEmailCondition) : null; } + + @override + List get props => [ + from, + to, + text, + subject, + notKeyword, + mailbox, + emailReceiveTimeType, + hasAttachment, + before, + startDate, + endDate + ]; } extension SearchEmailFilterExtension on SearchEmailFilter { diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart index 73def93ad..2035bf047 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart @@ -28,13 +28,13 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget { minSize: 40, iconPadding: const EdgeInsets.only(right: 2), icon: SvgPicture.asset(_imagePaths.icFilterAdvanced, - color: searchController.isAdvancedSearchViewOpen.isTrue || searchController.isAdvancedSearchHasApply.isTrue + color: searchController.isAdvancedSearchViewOpen.isTrue || searchController.advancedSearchIsActivated.isTrue ? AppColor.colorFilterMessageEnabled : AppColor.colorFilterMessageDisabled, width: 16, height: 16), onTap: () { - if(searchController.isAdvancedSearchViewOpen.isFalse && searchController.isAdvancedSearchHasApply.isFalse){ + if(searchController.isAdvancedSearchViewOpen.isFalse && searchController.advancedSearchIsActivated.isFalse){ advancedFilterController.initSearchFilterField(context); } searchController.showAdvancedFilterView(_parentContext); diff --git a/lib/features/search/presentation/search_email_controller.dart b/lib/features/search/presentation/search_email_controller.dart index 19622f26e..bd5aff42d 100644 --- a/lib/features/search/presentation/search_email_controller.dart +++ b/lib/features/search/presentation/search_email_controller.dart @@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_sear import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.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/quick_search_filter.dart'; @@ -583,7 +584,8 @@ class SearchEmailController extends BaseController clearAllTextInputSearchForm(); clearAllResultSearch(); FocusScope.of(context).unfocus(); - mailboxDashBoardController.searchController.disableSearch(); + mailboxDashBoardController.searchController.disableAllSearchEmail(); + mailboxDashBoardController.dispatchAction(SelectMailboxDefaultAction()); mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread); SearchEmailBindings().disposeBindings(); } diff --git a/lib/features/search/presentation/search_email_view.dart b/lib/features/search/presentation/search_email_view.dart index 1b900b63d..2c7765b31 100644 --- a/lib/features/search/presentation/search_email_view.dart +++ b/lib/features/search/presentation/search_email_view.dart @@ -27,7 +27,6 @@ import 'package:tmail_ui_user/features/search/presentation/widgets/email_receive import 'package:tmail_ui_user/features/search/presentation/widgets/email_receive_time_cupertino_action_sheet_action_builder.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart'; -import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart' if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart'; @@ -425,9 +424,9 @@ class SearchEmailView extends GetWidget context, listPresentationEmail[index], controller.selectionMode.value, - SearchStatus.ACTIVE, controller.searchQuery, controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id, + isSearchEmailRunning: true, padding: SearchEmailUtils.getPaddingSearchResultList(context, _responsiveUtils), paddingDivider: SearchEmailUtils.getPaddingDividerSearchResultList(context, _responsiveUtils), mailboxCurrent: listPresentationEmail[index].findMailboxContain( diff --git a/lib/features/thread/presentation/mixin/base_email_item_tile.dart b/lib/features/thread/presentation/mixin/base_email_item_tile.dart index aca87e340..d1ad35349 100644 --- a/lib/features/thread/presentation/mixin/base_email_item_tile.dart +++ b/lib/features/thread/presentation/mixin/base_email_item_tile.dart @@ -14,7 +14,6 @@ import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; -import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; typedef OnPressEmailActionClick = void Function(EmailActionType, PresentationEmail); typedef OnMoreActionClick = void Function(PresentationEmail, RelativeRect?); @@ -25,11 +24,10 @@ mixin BaseEmailItemTile { final imagePaths = Get.find(); Widget buildMailboxContain( - SearchStatus state, - bool advancedSearchActivated, - PresentationEmail email + bool isSearchEmailRunning, + PresentationEmail email ) { - if (hasMailboxLabel(state, advancedSearchActivated, email)) { + if (hasMailboxLabel(isSearchEmailRunning, email)) { return Container( margin: const EdgeInsets.only(left: 8), padding: const EdgeInsets.symmetric( @@ -55,8 +53,9 @@ mixin BaseEmailItemTile { } } - bool isSearchEnabled(SearchStatus state, bool advancedSearchActivated, SearchQuery? query) => - (state == SearchStatus.ACTIVE || advancedSearchActivated) && query?.value.isNotEmpty == true; + bool isSearchEnabled(bool isSearchEmailRunning, SearchQuery? query) { + return isSearchEmailRunning && query?.value.isNotEmpty == true; + } FontWeight buildFontForReadEmail(PresentationEmail email) => !email.hasRead ? FontWeight.w600 : FontWeight.normal; @@ -64,8 +63,8 @@ mixin BaseEmailItemTile { Color buildTextColorForReadEmail(PresentationEmail email) => email.hasRead ? AppColor.colorContentEmail : AppColor.colorNameEmail; - bool hasMailboxLabel(SearchStatus state, bool advancedSearchActivated, PresentationEmail email) { - return (state == SearchStatus.ACTIVE || advancedSearchActivated) && email.mailboxName.isNotEmpty; + bool hasMailboxLabel(bool isSearchEmailRunning, PresentationEmail email) { + return isSearchEmailRunning && email.mailboxName.isNotEmpty; } String informationSender(PresentationEmail email, PresentationMailbox? mailbox) { @@ -79,11 +78,10 @@ mixin BaseEmailItemTile { Widget buildInformationSender( PresentationEmail email, PresentationMailbox? mailbox, - SearchStatus state, - bool advancedSearchActivated, + bool isSearchEmailRunning, SearchQuery? query ) { - if (isSearchEnabled(state, advancedSearchActivated, query)) { + if (isSearchEnabled(isSearchEmailRunning, query)) { return RichTextBuilder( informationSender(email, mailbox), query?.value ?? '', @@ -113,12 +111,11 @@ mixin BaseEmailItemTile { } Widget buildEmailTitle( - PresentationEmail email, - SearchStatus state, - bool advancedSearchActivated, - SearchQuery? query + PresentationEmail email, + bool isSearchEmailRunning, + SearchQuery? query ) { - if (isSearchEnabled(state, advancedSearchActivated, query)) { + if (isSearchEnabled(isSearchEmailRunning, query)) { return RichTextBuilder( email.getEmailTitle(), query?.value ?? '', @@ -147,12 +144,11 @@ mixin BaseEmailItemTile { } Widget buildEmailPartialContent( - PresentationEmail email, - SearchStatus state, - bool advancedSearchActivated, - SearchQuery? query + PresentationEmail email, + bool isSearchEmailRunning, + SearchQuery? query ) { - if (isSearchEnabled(state, advancedSearchActivated, query)) { + if (isSearchEnabled(isSearchEmailRunning, query)) { return RichTextBuilder( email.getPartialContent(), query?.value ?? '', diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index b559a17e5..0bafb3c15 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -243,7 +243,6 @@ class ThreadController extends BaseController { if (_currentMailboxId != mailbox.id) { _currentMailboxId = mailbox.id; _resetToOriginalValue(); - disableSearch(); _getAllEmail(); } } else if (mailbox == null) { // disable current mailbox when search active @@ -292,9 +291,6 @@ class ThreadController extends BaseController { action.presentationEmail, mailboxContain: mailboxContain); mailboxDashBoardController.clearDashBoardAction(); - } else if (action is DisableSearchEmailAction) { - closeSearchEmailAction(); - mailboxDashBoardController.clearDashBoardAction(); } else if (action is StartSearchEmailAction) { _searchEmail(); mailboxDashBoardController.clearDashBoardAction(); @@ -639,7 +635,7 @@ class ThreadController extends BaseController { message: newFilterOption.getMessageToast(context), icon: newFilterOption.getIconToast(_imagePaths)); - if (isSearchActive() || searchController.isAdvancedSearchHasApply.isTrue) { + if (isSearchActive() || searchController.advancedSearchIsActivated.isTrue) { _searchEmail(filterMessageOption: _getFilterCondition()); } else { refreshAllEmail(); @@ -926,34 +922,16 @@ class ThreadController extends BaseController { bool isSearchActive() => searchController.isSearchActive(); - bool isAdvanceSearchActive() => searchController.isAdvanceSearchActive(); - - bool get isAllSearchInActive => !searchController.isSearchActive() && searchController.isAdvancedSearchViewOpen.isFalse; - void enableSearch(BuildContext context) { - searchController.enableSearch(); - } - - void disableSearch() { - searchController.searchIsActive.value = false; - searchController.disableSearch(); - } - - void closeSearchEmailAction() { - disableSearch(); - cancelSelectEmail(); - refreshAllEmail(); - } - void clearTextSearch() { searchController.clearTextSearch(); } void _searchEmail({UnsignedInt? limit, EmailFilterCondition? filterMessageOption}) { if (_accountId != null && searchQuery != null) { - searchController.searchIsActive.value = true; + searchController.activateSimpleSearch(); filterMessageOption = EmailFilterCondition( notKeyword: filterMessageOption?.notKeyword, diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 268fe4f66..40c7e3911 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -84,22 +84,15 @@ class ThreadView extends GetWidget with AppLoaderMixin, } Widget _buildSearchBarView(BuildContext context) { - return Obx(() { - if (!controller.searchController.isSearchActive()) { - return Container( - color: Colors.white, - padding: EdgeInsets.symmetric( - horizontal: 16, - vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0), - margin: const EdgeInsets.only( - bottom: !BuildUtils.isWeb ? 16 : 0), - child: SearchBarView(_imagePaths, - hintTextSearch: AppLocalizations.of(context).search_emails, - onOpenSearchViewAction: () => controller.goToSearchView())); - } else { - return const SizedBox.shrink(); - } - }); + return Container( + color: Colors.white, + padding: EdgeInsets.symmetric( + horizontal: 16, + vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0), + margin: const EdgeInsets.only(bottom: !BuildUtils.isWeb ? 16 : 0), + child: SearchBarView(_imagePaths, + hintTextSearch: AppLocalizations.of(context).search_emails, + onOpenSearchViewAction: controller.goToSearchView)); } Widget _buildVacationNotificationMessage(BuildContext context) { @@ -251,7 +244,7 @@ class ThreadView extends GetWidget with AppLoaderMixin, return Obx(() => controller.viewState.value.fold( (failure) => const SizedBox.shrink(), (success) { - if (controller.isSearchActive() || controller.isAdvanceSearchActive()) { + if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) { return success is SearchingState ? Padding(padding: const EdgeInsets.symmetric(vertical: 16), child: loadingWidget) : const SizedBox.shrink(); @@ -318,7 +311,7 @@ class ThreadView extends GetWidget with AppLoaderMixin, && !controller.isLoadingMore && scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent ) { - if (controller.isSearchActive() || controller.isAdvanceSearchActive()) { + if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) { controller.searchMoreEmails(); } else { controller.loadMoreEmails(); @@ -341,13 +334,12 @@ class ThreadView extends GetWidget with AppLoaderMixin, context, listPresentationEmail[index], controller.mailboxDashBoardController.currentSelectMode.value, - controller.searchController.searchState.value.searchStatus, controller.searchQuery, controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id, mailboxCurrent: controller.searchController.isSearchEmailRunning ? listPresentationEmail[index].findMailboxContain(controller.mailboxDashBoardController.mapMailboxById) : controller.currentMailbox, - advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue) + isSearchEmailRunning: controller.searchController.isSearchEmailRunning) ..addOnPressEmailActionClick((action, email) => controller.pressEmailAction( context, @@ -358,22 +350,22 @@ class ThreadView extends GetWidget with AppLoaderMixin, : controller.currentMailbox)) ..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context) ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) - : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))) - .build(), + : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))) + ).build(), feedback: _buildFeedBackWidget(context), childWhenDragging: (EmailTileBuilder( context, listPresentationEmail[index], controller.mailboxDashBoardController.currentSelectMode.value, - controller.searchController.searchState.value.searchStatus, controller.searchQuery, controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id, mailboxCurrent: controller.searchController.isSearchEmailRunning ? listPresentationEmail[index].findMailboxContain( controller.mailboxDashBoardController.mapMailboxById) : controller.currentMailbox, - advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue, isDrag: true)) - .build(), + isSearchEmailRunning: controller.searchController.isSearchEmailRunning, + isDrag: true) + ).build(), dragAnchorStrategy: pointerDragAnchorStrategy, onDragStarted: () { controller.calculateDragValue(listPresentationEmail[index]); diff --git a/lib/features/thread/presentation/widgets/email_tile_builder.dart b/lib/features/thread/presentation/widgets/email_tile_builder.dart index dc026816a..d1e40f13b 100644 --- a/lib/features/thread/presentation/widgets/email_tile_builder.dart +++ b/lib/features/thread/presentation/widgets/email_tile_builder.dart @@ -1,10 +1,12 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:model/model.dart'; +import 'package:model/email/email_action_type.dart'; +import 'package:model/email/presentation_email.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/presentation/mixin/base_email_item_tile.dart'; -import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; class EmailTileBuilder with BaseEmailItemTile { @@ -12,9 +14,8 @@ class EmailTileBuilder with BaseEmailItemTile { final BuildContext _context; final SelectMode _selectModeAll; final PresentationMailbox? mailboxCurrent; - final SearchStatus _searchStatus; final SearchQuery? _searchQuery; - final bool advancedSearchActivated; + final bool isSearchEmailRunning; final EdgeInsets? padding; final EdgeInsets? paddingDivider; final bool isDrag; @@ -26,11 +27,10 @@ class EmailTileBuilder with BaseEmailItemTile { this._context, this._presentationEmail, this._selectModeAll, - this._searchStatus, this._searchQuery, this._isShowingEmailContent, { - this.advancedSearchActivated = false, + this.isSearchEmailRunning = false, this.mailboxCurrent, this.padding, this.paddingDivider, @@ -82,11 +82,10 @@ class EmailTileBuilder with BaseEmailItemTile { height: 9, fit: BoxFit.fill)), Expanded(child: buildInformationSender( - _presentationEmail, - mailboxCurrent, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + mailboxCurrent, + isSearchEmailRunning, + _searchQuery)), if (_presentationEmail.hasAttachment == true) Padding( padding: const EdgeInsets.only(left: 8), @@ -107,14 +106,12 @@ class EmailTileBuilder with BaseEmailItemTile { mainAxisSize: MainAxisSize.min, children: [ Expanded(child: buildEmailTitle( - _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + isSearchEmailRunning, + _searchQuery)), buildMailboxContain( - _searchStatus, - advancedSearchActivated, - _presentationEmail), + isSearchEmailRunning, + _presentationEmail), if (_presentationEmail.hasStarred) Padding( padding: const EdgeInsets.only(left: 8), @@ -126,10 +123,9 @@ class EmailTileBuilder with BaseEmailItemTile { padding: const EdgeInsets.only(top: 6), child: Row(children: [ Expanded(child: buildEmailPartialContent( - _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + isSearchEmailRunning, + _searchQuery)), ]) ), ], diff --git a/lib/features/thread/presentation/widgets/email_tile_web_builder.dart b/lib/features/thread/presentation/widgets/email_tile_web_builder.dart index 5389919d1..05a55d720 100644 --- a/lib/features/thread/presentation/widgets/email_tile_web_builder.dart +++ b/lib/features/thread/presentation/widgets/email_tile_web_builder.dart @@ -1,11 +1,15 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/views/button/icon_button_web.dart'; +import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:model/model.dart'; +import 'package:model/email/email_action_type.dart'; +import 'package:model/email/presentation_email.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/presentation/mixin/base_email_item_tile.dart'; -import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class EmailTileBuilder with BaseEmailItemTile { @@ -14,9 +18,8 @@ class EmailTileBuilder with BaseEmailItemTile { final BuildContext _context; final SelectMode _selectModeAll; final PresentationMailbox? mailboxCurrent; - final SearchStatus _searchStatus; final SearchQuery? _searchQuery; - final bool advancedSearchActivated; + final bool isSearchEmailRunning; final EdgeInsets? padding; final EdgeInsets? paddingDivider; final bool isDrag; @@ -32,11 +35,10 @@ class EmailTileBuilder with BaseEmailItemTile { this._context, this._presentationEmail, this._selectModeAll, - this._searchStatus, this._searchQuery, this._isShowingEmailContent, { - this.advancedSearchActivated = false, + this.isSearchEmailRunning = false, this.mailboxCurrent, this.padding, this.paddingDivider, @@ -137,11 +139,11 @@ class EmailTileBuilder with BaseEmailItemTile { height: 9, fit: BoxFit.fill)), Expanded(child: buildInformationSender( - _presentationEmail, - mailboxCurrent, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + mailboxCurrent, + isSearchEmailRunning, + _searchQuery + )), if (_presentationEmail.hasAttachment == true) Padding( padding: const EdgeInsets.only(left: 8), @@ -160,14 +162,14 @@ class EmailTileBuilder with BaseEmailItemTile { mainAxisSize: MainAxisSize.min, children: [ Expanded(child: buildEmailTitle( - _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + isSearchEmailRunning, + _searchQuery + )), buildMailboxContain( - _searchStatus, - advancedSearchActivated, - _presentationEmail), + isSearchEmailRunning, + _presentationEmail + ), if (_presentationEmail.hasStarred) Padding( padding: const EdgeInsets.only(left: 8), @@ -178,10 +180,10 @@ class EmailTileBuilder with BaseEmailItemTile { const SizedBox(height: 8), Row(children: [ Expanded(child: buildEmailPartialContent( - _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + isSearchEmailRunning, + _searchQuery + )), ]), ]), ) @@ -233,11 +235,11 @@ class EmailTileBuilder with BaseEmailItemTile { height: 9, fit: BoxFit.fill)), Expanded(child: buildInformationSender( - _presentationEmail, - mailboxCurrent, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + mailboxCurrent, + isSearchEmailRunning, + _searchQuery + )), if (isHoverItem) const SizedBox(width: 120) else @@ -248,14 +250,14 @@ class EmailTileBuilder with BaseEmailItemTile { mainAxisSize: MainAxisSize.min, children: [ Expanded(child: buildEmailTitle( - _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + isSearchEmailRunning, + _searchQuery + )), buildMailboxContain( - _searchStatus, - advancedSearchActivated, - _presentationEmail), + isSearchEmailRunning, + _presentationEmail + ), if (_presentationEmail.hasStarred) Padding( padding: const EdgeInsets.only(left: 8), @@ -266,10 +268,10 @@ class EmailTileBuilder with BaseEmailItemTile { const SizedBox(height: 8), Row(children: [ Expanded(child: buildEmailPartialContent( - _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + isSearchEmailRunning, + _searchQuery + )), ]), ]), if (_selectModeAll == SelectMode.INACTIVE) @@ -354,11 +356,11 @@ class EmailTileBuilder with BaseEmailItemTile { SizedBox( width: 160, child: buildInformationSender( - _presentationEmail, - mailboxCurrent, - _searchStatus, - advancedSearchActivated, - _searchQuery)), + _presentationEmail, + mailboxCurrent, + isSearchEmailRunning, + _searchQuery + )), const SizedBox(width: 24), Expanded(child: _buildSubjectAndContent()), const SizedBox(width: 16), @@ -476,9 +478,9 @@ class EmailTileBuilder with BaseEmailItemTile { Widget _buildDateTimeForDesktopScreen() { return Row(children: [ buildMailboxContain( - _searchStatus, - advancedSearchActivated, - _presentationEmail), + isSearchEmailRunning, + _presentationEmail + ), if (_presentationEmail.hasAttachment == true) Padding( padding: const EdgeInsets.only(left: 8), @@ -508,19 +510,19 @@ class EmailTileBuilder with BaseEmailItemTile { return Row(children: [ if (_presentationEmail.getEmailTitle().isNotEmpty) Container( - constraints: BoxConstraints(maxWidth: constraints.maxWidth / 2), - padding: const EdgeInsets.only(right: 12), - child: buildEmailTitle( - _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)), - Expanded(child: Container( - child: buildEmailPartialContent( + constraints: BoxConstraints(maxWidth: constraints.maxWidth / 2), + padding: const EdgeInsets.only(right: 12), + child: buildEmailTitle( _presentationEmail, - _searchStatus, - advancedSearchActivated, - _searchQuery)) + isSearchEmailRunning, + _searchQuery + )), + Expanded(child: Container( + child: buildEmailPartialContent( + _presentationEmail, + isSearchEmailRunning, + _searchQuery + )) ), ]); });