From 3b194bb24541024b9c4d27b6f58e3c22e16b94c4 Mon Sep 17 00:00:00 2001 From: ManhNT Date: Fri, 24 Jun 2022 14:13:08 +0700 Subject: [PATCH] create search controller --- .../controller/search_controller.dart | 194 ++++++++++++++++++ lib/l10n/intl_messages.arb | 74 ++++++- 2 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 lib/features/mailbox_dashboard/presentation/controller/search_controller.dart diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart new file mode 100644 index 000000000..8af66cfca --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -0,0 +1,194 @@ +import 'dart:async'; + +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_search_email_state.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_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/search_query.dart'; +import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart'; +import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; + +class SearchController extends BaseController { + final QuickSearchEmailInteractor _quickSearchEmailInteractor; + + final _mailboxDashBoardController = Get.find(); + + final searchInputController = TextEditingController(); + final searchEmailFilter = SearchEmailFilter().obs; + final searchState = SearchState.initial().obs; + final isAdvancedSearchViewOpen = false.obs; + final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs; + final mailboxFilterSelectedFormAdvancedSearch = Rxn(); + final hasAttachment = false.obs; + + get _accountId => _mailboxDashBoardController.accountId; + + get _userProfile => _mailboxDashBoardController.userProfile; + + FocusNode searchFocus = FocusNode(); + + SearchEmailFilter get searchEmailFilterValue => searchEmailFilter.value; + + SearchController( + this._quickSearchEmailInteractor, + ); + + selectOpenAdvanceSearch() { + isAdvancedSearchViewOpen.toggle(); + } + + cleanSearchFilter() { + searchEmailFilter.value = SearchEmailFilter(); + } + + void selectQuickSearchFilter({ + required QuickSearchFilter quickSearchFilter, + bool fromSuggestionBox = false, + }) { + final isSelected = checkQuickSearchFilterSelected( + quickSearchFilter, + fromSuggestionBox, + ); + + switch (quickSearchFilter) { + case QuickSearchFilter.hasAttachment: + updateFilterEmail(hasAttachment: !isSelected); + return; + case QuickSearchFilter.last7Days: + final EmailReceiveTimeType? emailReceiveTimeType = isSelected + ? EmailReceiveTimeType.allTime + : EmailReceiveTimeType.last7Days; + updateFilterEmail(emailReceiveTimeType: emailReceiveTimeType); + return; + case QuickSearchFilter.fromMe: + isSelected + ? searchEmailFilter.value.from.remove(_userProfile.email) + : searchEmailFilter.value.from.add(_userProfile.email); + updateFilterEmail(from: searchEmailFilter.value.from); + return; + } + } + + Future> quickSearchEmails() async { + return await _quickSearchEmailInteractor + .execute(_accountId, + limit: UnsignedInt(5), + sort: {}..add( + EmailComparator(EmailComparatorProperty.receivedAt) + ..setIsAscending(false)), + filter: searchEmailFilter.value.mappingToEmailFilterCondition(), + properties: ThreadConstants.propertiesQuickSearch) + .then((result) => result.fold( + (failure) => [], + (success) => success is QuickSearchEmailSuccess + ? success.emailList + : [])); + } + + void updateFilterEmail({ + Set? from, + Set? to, + SearchQuery? text, + String? subject, + Wrapped? hasKeyword, + Wrapped? notKeyword, + PresentationMailbox? mailbox, + EmailReceiveTimeType? emailReceiveTimeType, + bool? hasAttachment, + }) { + searchEmailFilter.value = searchEmailFilter.value.copyWith( + from: from, + to: to, + text: text, + subject: subject, + hasKeyword: hasKeyword, + notKeyword: notKeyword, + mailbox: mailbox, + emailReceiveTimeType: emailReceiveTimeType, + hasAttachment: hasAttachment, + ); + } + + void registerSearchFocusListener() { + searchFocus.addListener(() { + final hasFocus = searchFocus.hasFocus; + final query = searchEmailFilter.value.text?.value; + log('MailboxDashBoardController::_registerSearchFocusListener(): hasFocus: $hasFocus | query: $query'); + if (!hasFocus && (query == null || query.isEmpty)) { + updateFilterEmail(text: SearchQuery.initial()); + searchInputController.clear(); + cleanSearchFilter(); + searchFocus.unfocus(); + } + }); + } + + bool isSearchActive() => + searchState.value.searchStatus == SearchStatus.ACTIVE; + + void enableSearch() { + searchState.value = searchState.value.enableSearchState(); + } + + void disableSearch() { + searchState.value = searchState.value.disableSearchState(); + updateFilterEmail(text: SearchQuery.initial()); + searchInputController.clear(); + cleanSearchFilter(); + searchFocus.unfocus(); + } + + void clearTextSearch() { + updateFilterEmail(text: SearchQuery.initial()); + searchInputController.clear(); + searchFocus.requestFocus(); + } + + void onChangeTextSearch(String value) { + updateFilterEmail(text: SearchQuery(value)); + } + + void updateTextSearch(String value) { + searchInputController.text = value; + } + + bool checkQuickSearchFilterSelected( + QuickSearchFilter quickSearchFilter, bool fromSuggestBox) { + switch (quickSearchFilter) { + case QuickSearchFilter.hasAttachment: + return searchEmailFilter.value.hasAttachment == true; + case QuickSearchFilter.last7Days: + if (fromSuggestBox) { + return true; + } + return searchEmailFilter.value.emailReceiveTimeType == EmailReceiveTimeType.last7Days; + case QuickSearchFilter.fromMe: + return searchEmailFilter.value.from.contains(_userProfile.email) && searchEmailFilter.value.from.length == 1; + } + } + + @override + void onDone() {} + + @override + void onError(error) {} + + @override + void onClose() { + searchInputController.dispose(); + searchFocus.dispose(); + super.onClose(); + } +} diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 6cb693f96..edde0249c 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-06-22T11:25:25.867848", + "@@last_modified": "2022-06-24T14:16:53.170960", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -1423,5 +1423,77 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "form": "From", + "@form": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "to": "To", + "@to": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "subject": "Subject", + "@subject": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "hasTheWords": "Has the words", + "@hasTheWords": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "doesNotHave": "Doesn’t have", + "@doesNotHave": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "mailbox": "Mailbox", + "@mailbox": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "nameOrEmailAddress": "Name or email address", + "@nameOrEmailAddress": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "enterSearchTerm": "Enter search term", + "@enterSearchTerm": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "allMails": "All mails", + "@allMails": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "allTime": "All time", + "@allTime": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "search": "Search", + "@search": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "clearFilter": "Clear filter", + "@clearFilter": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file