From 203f93ae7f6f38eab9a13cce8e631ab7f5a74350 Mon Sep 17 00:00:00 2001 From: ManhNT Date: Fri, 24 Jun 2022 17:14:47 +0700 Subject: [PATCH] refactor code UI follow refactor code controller --- .../presentation/mailbox_controller.dart | 4 +- .../base_mailbox_dashboard_view.dart | 8 ++- .../controller/search_controller.dart | 16 ++--- .../mailbox_dashboard_view_web.dart | 44 ++++++------ .../presentation/thread_controller.dart | 70 +++++-------------- .../thread/presentation/thread_view.dart | 52 +++++++------- 6 files changed, 76 insertions(+), 118 deletions(-) diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index ad82c96f0..2c51ecc9b 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -339,8 +339,8 @@ class MailboxController extends BaseMailboxController { mailboxDashBoardController.setSelectedMailbox(presentationMailboxSelected); mailboxDashBoardController.clearSelectedEmail(); - if (mailboxDashBoardController.isSearchActive()) { - mailboxDashBoardController.disableSearch(); + if (mailboxDashBoardController.searchController.isSearchActive()) { + mailboxDashBoardController.searchController.disableSearch(); } if (!_responsiveUtils.isDesktop(context) && !_responsiveUtils.isTabletLarge(context)) { diff --git a/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart b/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart index 2b4505c63..d7cc0a122 100644 --- a/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart +++ b/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart @@ -20,14 +20,16 @@ abstract class BaseMailboxDashBoardView extends GetWidget !controller.isSearchActive() ? const Spacer() : const SizedBox.shrink()), - Obx(() => controller.isSearchActive() + Obx(() => !controller.searchController.isSearchActive() ? const Spacer() : const SizedBox.shrink()), + Obx(() => controller.searchController.isSearchActive() ? Expanded(child: _buildSearchForm(context)) : (SearchBarView(imagePaths) ..hintTextSearch(AppLocalizations.of(context).search_emails) ..maxSizeWidth(240) - ..addOnOpenSearchViewAction(() => controller.enableSearch())) + ..addOnOpenSearchViewAction(() => controller.searchController.enableSearch())) .build()), - Obx(() => !controller.isSearchActive() ? const SizedBox(width: 16) : const SizedBox.shrink()), + Obx(() => !controller.searchController.isSearchActive() ? const SizedBox(width: 16) : const SizedBox.shrink()), Obx(() => (AvatarBuilder() ..text(controller.userProfile.value?.getAvatarText() ?? '') ..backgroundColor(Colors.white) @@ -410,19 +410,19 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { height: 45, child: QuickSearchInputForm( textFieldConfiguration: QuickSearchTextFieldConfiguration( - controller: controller.searchInputController, + controller: controller.searchController.searchInputController, autofocus: true, - focusNode: controller.searchFocus, + focusNode: controller.searchController.searchFocus, textInputAction: TextInputAction.done, onSubmitted: (keyword) { if (keyword.trim().isNotEmpty) { - controller.saveRecentSearch(RecentSearch.now(keyword)); + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); } - controller.searchEmail(context, keyword); + controller.searchEmail(context); }, onChanged: (query) { log('MailboxDashBoardView::_buildSearchForm(): onChanged: $query'); - controller.onChangeTextSearch(query); + controller.searchController.onChangeTextSearch(query); }, decoration: InputDecoration( border: InputBorder.none, @@ -444,11 +444,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { height: 16, fit: BoxFit.fill), onTap: () { - final keyword = controller.searchInputController.text; + final keyword = controller.searchController.searchInputController.text; if (keyword.trim().isNotEmpty) { - controller.saveRecentSearch(RecentSearch.now(keyword)); + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); } - controller.searchEmail(context, keyword); + controller.searchEmail(context); }), clearTextButton: buildIconWeb( icon: SvgPicture.asset( @@ -457,7 +457,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { height: 16, fit: BoxFit.fill), onTap: () { - controller.clearTextSearch(); + controller.searchController.clearTextSearch(); }) ), suggestionsBoxDecoration: QuickSearchSuggestionsBoxDecoration( @@ -482,8 +482,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { }, buttonActionCallback: (filterAction) { if (filterAction is QuickSearchFilter) { - controller.selectQuickSearchFilter( - filterAction, + controller.searchController.selectQuickSearchFilter( + quickSearchFilter: filterAction, fromSuggestionBox: true); } }, @@ -505,9 +505,9 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { return InkWell( onTap: () { if (keyword.trim().isNotEmpty) { - controller.saveRecentSearch(RecentSearch.now(keyword)); + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); } - controller.searchEmail(context, keyword); + controller.searchEmail(context); }, child: Padding( padding: const EdgeInsets.symmetric( @@ -537,17 +537,17 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { child: loadingWidget, ), fetchRecentActionCallback: (pattern) async { - return controller.getAllRecentSearchAction(pattern); + return controller.searchController.getAllRecentSearchAction(pattern); }, itemRecentBuilder: (context, recent) { return RecentSearchItemTileWidget(recent); }, onRecentSelected: (recent) { - controller.searchInputController.text = recent.value; - controller.searchEmail(context, recent.value); + controller.searchController.searchInputController.text = recent.value; + controller.searchEmail(context); }, suggestionsCallback: (pattern) async { - return controller.quickSearchEmailsAction(pattern); + return controller.searchController.quickSearchEmails(); }, itemBuilder: (context, email) { return EmailQuickSearchItemTileWidget( diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index ec900dd3c..f236f2fd3 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -8,7 +8,6 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; -import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'; @@ -40,8 +39,10 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/mark_as_ma import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.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'; 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'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; @@ -105,7 +106,7 @@ class ThreadController extends BaseController { final ScrollController listEmailController = ScrollController(); late Worker mailboxWorker, searchWorker, dashboardActionWorker, viewStateWorker; - SearchQuery? get searchQuery => mailboxDashBoardController.searchQuery; + SearchQuery? get searchQuery => searchController.searchQuery; Set? get _sortOrder => {} ..add(EmailComparator(EmailComparatorProperty.receivedAt) @@ -115,9 +116,11 @@ class ThreadController extends BaseController { PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value; - TextEditingController get searchController => mailboxDashBoardController.searchInputController; + SearchController get searchController => mailboxDashBoardController.searchController; - String get currentTextSearch => mailboxDashBoardController.searchInputController.text; + SearchEmailFilter get _searchEmailFilter => searchController.searchEmailFilter.value; + + String get currentTextSearch => searchController.searchInputController.text; ThreadController( this._getEmailsInMailboxInteractor, @@ -241,7 +244,7 @@ class ThreadController extends BaseController { } }); - searchWorker = ever(mailboxDashBoardController.searchState, (searchState) { + searchWorker = ever(searchController.searchState, (searchState) { if (searchState is SearchState) { if (searchState.searchStatus == SearchStatus.ACTIVE) { cancelSelectEmail(); @@ -793,15 +796,15 @@ class ThreadController extends BaseController { } } - bool isSearchActive() => mailboxDashBoardController.isSearchActive(); + bool isSearchActive() => searchController.isSearchActive(); void enableSearch(BuildContext context) { - mailboxDashBoardController.enableSearch(); + searchController.enableSearch(); } void disableSearch() { searchIsActive.value = false; - mailboxDashBoardController.disableSearch(); + searchController.disableSearch(); } void closeSearchEmailAction() { @@ -811,53 +814,20 @@ class ThreadController extends BaseController { } void clearTextSearch() { - mailboxDashBoardController.clearTextSearch(); + searchController.clearTextSearch(); } void _searchEmail({UnsignedInt? limit}) { if (_accountId != null && searchQuery != null) { searchIsActive.value = true; - UTCDate? afterTime; - bool? hasAttachment; - String? fromAddress; - String? keywordUnread; - String? keywordStarred; - - if (mailboxDashBoardController.quickSearchFilterForLast7DaysIsActive()) { - afterTime = mailboxDashBoardController.emailReceiveTimeType.value!.toUTCDate(); - } - - if (mailboxDashBoardController.filterForHasAttachmentIsActive()) { - hasAttachment = true; - } - - if (mailboxDashBoardController.quickSearchFilterForFromMeIsActive()) { - fromAddress = mailboxDashBoardController.userProfile.value?.email; - } - - if (mailboxDashBoardController.filterMessageUnreadIsActive()) { - keywordUnread = KeyWordIdentifier.emailSeen.value; - } - - if (mailboxDashBoardController.filterMessageStarredIsActive()) { - keywordStarred = KeyWordIdentifier.emailFlagged.value; - } - - final emailFilterCondition = EmailFilterCondition( - text: searchQuery!.value, - hasAttachment: hasAttachment, - from: fromAddress, - after: afterTime, - hasKeyword: keywordStarred, - notKeyword: keywordUnread, - inMailbox: _currentMailboxId); + searchController.updateFilterEmail(mailbox: currentMailbox); consumeState(_searchEmailInteractor.execute( _accountId!, limit: limit ?? ThreadConstants.defaultLimit, sort: _sortOrder, - filter: emailFilterCondition, + filter: _searchEmailFilter.mappingToEmailFilterCondition(), properties: ThreadConstants.propertiesDefault, )); } @@ -1236,7 +1206,7 @@ class ThreadController extends BaseController { } void selectQuickSearchFilter(QuickSearchFilter filter) { - mailboxDashBoardController.selectQuickSearchFilter(filter); + searchController.selectQuickSearchFilter(quickSearchFilter: filter); _searchEmail(); } @@ -1250,14 +1220,8 @@ class ThreadController extends BaseController { void selectReceiveTimeQuickSearchFilter(EmailReceiveTimeType? emailReceiveTimeType) { popBack(); - if (emailReceiveTimeType != null) { - if (!mailboxDashBoardController.listFilterQuickSearch.contains(QuickSearchFilter.last7Days)) { - mailboxDashBoardController.selectQuickSearchFilter(QuickSearchFilter.last7Days); - } - } else { - mailboxDashBoardController.listFilterQuickSearch.remove(QuickSearchFilter.last7Days); - } - mailboxDashBoardController.setEmailReceiveTimeType(emailReceiveTimeType); + searchController.updateFilterEmail(emailReceiveTimeType: emailReceiveTimeType); + _searchEmail(); } diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index f08e4ba8d..66ecd3f2a 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -182,16 +182,15 @@ class ThreadView extends GetWidget with AppLoaderMixin, height: 45, child: QuickSearchInputForm( textFieldConfiguration: QuickSearchTextFieldConfiguration( - controller: controller.searchController, + controller: controller.searchController.searchInputController, autofocus: true, - focusNode: controller.mailboxDashBoardController.searchFocus, + focusNode: controller.searchController.searchFocus, textInputAction: TextInputAction.done, onSubmitted: (keyword) { if (keyword.trim().isNotEmpty) { - controller.mailboxDashBoardController - .saveRecentSearch(RecentSearch.now(keyword)); + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); } - controller.mailboxDashBoardController.searchEmail(context, keyword); + controller.mailboxDashBoardController.searchEmail(context); }, decoration: InputDecoration( border: InputBorder.none, @@ -215,10 +214,9 @@ class ThreadView extends GetWidget with AppLoaderMixin, onTap: () { final keyword = controller.currentTextSearch; if (keyword.trim().isNotEmpty) { - controller.mailboxDashBoardController - .saveRecentSearch(RecentSearch.now(keyword)); + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); } - controller.mailboxDashBoardController.searchEmail(context, keyword); + controller.mailboxDashBoardController.searchEmail(context); }), clearTextButton: buildIconWeb( icon: SvgPicture.asset( @@ -251,8 +249,7 @@ class ThreadView extends GetWidget with AppLoaderMixin, }, buttonActionCallback: (filterAction) { if (filterAction is QuickSearchFilter) { - controller.mailboxDashBoardController - .selectQuickSearchFilter(filterAction, fromSuggestionBox: true); + controller.searchController.selectQuickSearchFilter(quickSearchFilter: filterAction, fromSuggestionBox: true); } }, listActionPadding: const EdgeInsets.only( @@ -273,10 +270,9 @@ class ThreadView extends GetWidget with AppLoaderMixin, return InkWell( onTap: () { if (keyword.trim().isNotEmpty) { - controller.mailboxDashBoardController - .saveRecentSearch(RecentSearch.now(keyword)); + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); } - controller.mailboxDashBoardController.searchEmail(context, keyword); + controller.mailboxDashBoardController.searchEmail(context); }, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), @@ -304,21 +300,17 @@ class ThreadView extends GetWidget with AppLoaderMixin, child: loadingWidget, ), fetchRecentActionCallback: (pattern) async { - return controller.mailboxDashBoardController - .getAllRecentSearchAction(pattern); + return controller.searchController.getAllRecentSearchAction(pattern); }, itemRecentBuilder: (context, recent) { return RecentSearchItemTileWidget(recent); }, onRecentSelected: (recent) { - controller.mailboxDashBoardController - .updateTextSearch(recent.value); - controller.mailboxDashBoardController - .searchEmail(context, recent.value); + controller.searchController.updateTextSearch(recent.value); + controller.mailboxDashBoardController.searchEmail(context); }, suggestionsCallback: (pattern) async { - return controller.mailboxDashBoardController - .quickSearchEmailsAction(pattern); + return controller.searchController.quickSearchEmails(); }, itemBuilder: (context, email) { return EmailQuickSearchItemTileWidget( @@ -523,7 +515,7 @@ class ThreadView extends GetWidget with AppLoaderMixin, listPresentationEmail[index], controller.currentMailbox?.role, controller.mailboxDashBoardController.currentSelectMode.value, - controller.mailboxDashBoardController.searchState.value.searchStatus, + controller.searchController.searchState.value.searchStatus, controller.searchQuery) ..addOnPressEmailActionClick((action, email) => controller.pressEmailAction(context, action, email)) ..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context) @@ -646,6 +638,8 @@ class ThreadView extends GetWidget with AppLoaderMixin, Widget _buildQuickSearchFilterButton( BuildContext context, QuickSearchFilter filter) { return Obx(() { + final quickSearchFilterSelected = controller.searchController.checkQuickSearchFilterSelected(quickSearchFilter: filter); + return Padding( padding: const EdgeInsets.only(right: 8), child: InkWell( @@ -674,11 +668,11 @@ class ThreadView extends GetWidget with AppLoaderMixin, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - color: filter.getBackgroundColor(controller.mailboxDashBoardController.listFilterQuickSearch)), + color: filter.getBackgroundColor(quickSearchFilterSelected)), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ SvgPicture.asset( - filter.getIcon(_imagePaths, controller.mailboxDashBoardController.listFilterQuickSearch), + filter.getIcon(_imagePaths, quickSearchFilterSelected), width: 16, height: 16, fit: BoxFit.fill), @@ -687,7 +681,7 @@ class ThreadView extends GetWidget with AppLoaderMixin, filter.getTitle(context, receiveTimeType: controller.mailboxDashBoardController.emailReceiveTimeType.value), maxLines: 1, overflow: TextOverflow.ellipsis, - style: filter.getTextStyle(controller.mailboxDashBoardController.listFilterQuickSearch), + style: filter.getTextStyle(quickSearchFilterSelected), ), if (filter == QuickSearchFilter.last7Days) ... [ @@ -744,14 +738,16 @@ class ThreadView extends GetWidget with AppLoaderMixin, Widget _buildQuickSearchFilterButtonSuggestionBox( BuildContext context, QuickSearchFilter filter) { return Obx(() { + final quickSearchFilterSelected = controller.searchController.checkQuickSearchFilterSelected(quickSearchFilter: filter); + return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - color: filter.getBackgroundColor(controller.mailboxDashBoardController.listFilterQuickSearch)), + color: filter.getBackgroundColor(quickSearchFilterSelected)), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ SvgPicture.asset( - filter.getIcon(_imagePaths, controller.mailboxDashBoardController.listFilterQuickSearch), + filter.getIcon(_imagePaths, quickSearchFilterSelected), width: 16, height: 16, fit: BoxFit.fill), @@ -760,7 +756,7 @@ class ThreadView extends GetWidget with AppLoaderMixin, filter.getTitle(context, receiveTimeType: controller.mailboxDashBoardController.emailReceiveTimeType.value), maxLines: 1, overflow: TextOverflow.ellipsis, - style: filter.getTextStyle(controller.mailboxDashBoardController.listFilterQuickSearch), + style: filter.getTextStyle(quickSearchFilterSelected), ) ])); });