diff --git a/lib/features/mailbox_dashboard/data/datasource/search_datasource.dart b/lib/features/mailbox_dashboard/data/datasource/search_datasource.dart index 572905a5c..943e1f688 100644 --- a/lib/features/mailbox_dashboard/data/datasource/search_datasource.dart +++ b/lib/features/mailbox_dashboard/data/datasource/search_datasource.dart @@ -1,6 +1,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; abstract class SearchDataSource { Future saveRecentSearch( @@ -17,4 +18,8 @@ abstract class SearchDataSource { String? pattern, } ); + + Future storeEmailSortOrder(EmailSortOrderType sortOrderType); + + Future getStoredEmailSortOrder(); } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart b/lib/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart index ea5373be4..274cf162d 100644 --- a/lib/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart +++ b/lib/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart @@ -3,15 +3,22 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_sort_order_manager.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class SearchDataSourceImpl extends SearchDataSource { final RecentSearchCacheManager _recentSearchCacheManager; + final LocalSortOrderManager _localSortOrderManager; final ExceptionThrower _exceptionThrower; - SearchDataSourceImpl(this._recentSearchCacheManager, this._exceptionThrower); + SearchDataSourceImpl( + this._recentSearchCacheManager, + this._localSortOrderManager, + this._exceptionThrower, + ); @override Future saveRecentSearch( @@ -46,4 +53,18 @@ class SearchDataSourceImpl extends SearchDataSource { ); }).catchError(_exceptionThrower.throwException); } + + @override + Future storeEmailSortOrder(EmailSortOrderType sortOrderType) { + return Future.sync(() async { + return await _localSortOrderManager.storeEmailSortOrderIfChanged(sortOrderType); + }).catchError(_exceptionThrower.throwException); + } + + @override + Future getStoredEmailSortOrder() { + return Future.sync(() { + return _localSortOrderManager.getStoredEmailSortOrder(); + }).catchError(_exceptionThrower.throwException); + } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/data/local/local_sort_order_manager.dart b/lib/features/mailbox_dashboard/data/local/local_sort_order_manager.dart new file mode 100644 index 000000000..03e9f3c0b --- /dev/null +++ b/lib/features/mailbox_dashboard/data/local/local_sort_order_manager.dart @@ -0,0 +1,47 @@ +import 'package:core/utils/app_logger.dart'; +import 'package:shared_preferences/shared_preferences.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/search_email_filter.dart'; + +class LocalSortOrderManager { + static const String _emailSortOrderKey = 'email.sort_order'; + + final SharedPreferences _sharedPreferences; + + LocalSortOrderManager(this._sharedPreferences); + + Future storeEmailSortOrder( + EmailSortOrderType emailSortOrderType, + ) async { + return await _sharedPreferences.setString( + _emailSortOrderKey, + emailSortOrderType.name, + ); + } + + bool isEmailSortOrderStored(EmailSortOrderType emailSortOrderType) { + final stored = _sharedPreferences.getString(_emailSortOrderKey); + return stored == emailSortOrderType.name; + } + + Future storeEmailSortOrderIfChanged( + EmailSortOrderType emailSortOrderType, + ) async { + if (isEmailSortOrderStored(emailSortOrderType)) { + return false; + } + return await storeEmailSortOrder(emailSortOrderType); + } + + EmailSortOrderType getStoredEmailSortOrder() { + final value = _sharedPreferences.getString(_emailSortOrderKey); + log('LocalSortOrderManager::getStoredEmailSortOrder: $value'); + if (value == null) { + return SearchEmailFilter.defaultSortOrder; + } + return EmailSortOrderType.values.firstWhere( + (e) => e.name == value, + orElse: () => SearchEmailFilter.defaultSortOrder, + ); + } +} diff --git a/lib/features/mailbox_dashboard/data/repository/search_repository_impl.dart b/lib/features/mailbox_dashboard/data/repository/search_repository_impl.dart index f07de33a9..6359fb2d2 100644 --- a/lib/features/mailbox_dashboard/data/repository/search_repository_impl.dart +++ b/lib/features/mailbox_dashboard/data/repository/search_repository_impl.dart @@ -4,6 +4,7 @@ import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; class SearchRepositoryImpl extends SearchRepository { @@ -36,4 +37,14 @@ class SearchRepositoryImpl extends SearchRepository { pattern: pattern, ); } + + @override + Future storeEmailSortOrder(EmailSortOrderType sortOrderType) { + return searchDataSource.storeEmailSortOrder(sortOrderType); + } + + @override + Future getStoredEmailSortOrder() { + return searchDataSource.getStoredEmailSortOrder(); + } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/repository/search_repository.dart b/lib/features/mailbox_dashboard/domain/repository/search_repository.dart index 6c88fb7b1..55debfb1c 100644 --- a/lib/features/mailbox_dashboard/domain/repository/search_repository.dart +++ b/lib/features/mailbox_dashboard/domain/repository/search_repository.dart @@ -2,6 +2,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; abstract class SearchRepository { Future saveRecentSearch( @@ -18,4 +19,8 @@ abstract class SearchRepository { String? pattern, } ); + + Future storeEmailSortOrder(EmailSortOrderType sortOrderType); + + Future getStoredEmailSortOrder(); } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/state/get_stored_email_sort_order_state.dart b/lib/features/mailbox_dashboard/domain/state/get_stored_email_sort_order_state.dart new file mode 100644 index 000000000..059743378 --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/state/get_stored_email_sort_order_state.dart @@ -0,0 +1,19 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; + +class GettingStoredEmailSortOrder extends LoadingState {} + +class GetStoredEmailSortOrderSuccess extends UIState { + final EmailSortOrderType emailSortOrderType; + + GetStoredEmailSortOrderSuccess(this.emailSortOrderType); + + @override + List get props => [emailSortOrderType]; +} + +class GetStoredEmailSortOrderFailure extends FeatureFailure { + + GetStoredEmailSortOrderFailure(dynamic exception) : super(exception: exception); +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/state/store_email_sort_order_state.dart b/lib/features/mailbox_dashboard/domain/state/store_email_sort_order_state.dart new file mode 100644 index 000000000..14eb0bedf --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/state/store_email_sort_order_state.dart @@ -0,0 +1,11 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; + +class StoringEmailSortOrder extends LoadingState {} + +class StoreEmailSortOrderSuccess extends UIState {} + +class StoreEmailSortOrderFailure extends FeatureFailure { + + StoreEmailSortOrderFailure(dynamic exception) : super(exception: exception); +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_interactor.dart new file mode 100644 index 000000000..7ca0d6209 --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_interactor.dart @@ -0,0 +1,21 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_stored_email_sort_order_state.dart'; + +class GetStoredEmailSortOrderInteractor { + final SearchRepository _searchRepository; + + const GetStoredEmailSortOrderInteractor(this._searchRepository); + + Stream> execute() async* { + try { + yield Right(GettingStoredEmailSortOrder()); + final emailSortOrderType = await _searchRepository.getStoredEmailSortOrder(); + yield Right(GetStoredEmailSortOrderSuccess(emailSortOrderType)); + } catch (exception) { + yield Left(GetStoredEmailSortOrderFailure(exception)); + } + } +} diff --git a/lib/features/mailbox_dashboard/domain/usecases/store_email_sort_order_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/store_email_sort_order_interactor.dart new file mode 100644 index 000000000..7ea3e28b5 --- /dev/null +++ b/lib/features/mailbox_dashboard/domain/usecases/store_email_sort_order_interactor.dart @@ -0,0 +1,24 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/store_email_sort_order_state.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; + +class StoreEmailSortOrderInteractor { + final SearchRepository _searchRepository; + + const StoreEmailSortOrderInteractor(this._searchRepository); + + Stream> execute( + EmailSortOrderType sortOrderType, + ) async* { + try { + yield Right(StoringEmailSortOrder()); + await _searchRepository.storeEmailSortOrder(sortOrderType); + yield Right(StoreEmailSortOrderSuccess()); + } catch (exception) { + yield Left(StoreEmailSortOrderFailure(exception)); + } + } +} diff --git a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart index 2ba5d48bc..614e00554 100644 --- a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart +++ b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart @@ -6,6 +6,7 @@ import 'package:model/email/presentation_email.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.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/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; @@ -147,4 +148,13 @@ class OpenAdvancedSearchViewAction extends DashBoardAction {} class ClearSearchFilterAppliedAction extends DashBoardAction {} -class ClearAdvancedSearchFilterEmailAction extends DashBoardAction {} \ No newline at end of file +class ClearAdvancedSearchFilterEmailAction extends DashBoardAction {} + +class SynchronizeEmailSortOrderAction extends DashBoardAction { + final EmailSortOrderType emailSortOrderType; + + SynchronizeEmailSortOrderAction(this.emailSortOrderType); + + @override + List get props => [emailSortOrderType]; +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index 2dd4e0437..61a980ebe 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -68,6 +68,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/lo import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/local_spam_report_datasource_impl.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/search_datasource_impl.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/session_storage_composer_datasoure_impl.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_sort_order_manager.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_spam_report_manager.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/network/linagora_ecosystem_api.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/app_grid_repository_impl.dart'; @@ -84,11 +85,13 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_mailbox_cached_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_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/remove_all_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_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/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart'; @@ -206,6 +209,8 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), + Get.find(), )); Get.put(AdvancedFilterController()); } @@ -238,6 +243,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find())); Get.lazyPut(() => SearchDataSourceImpl( Get.find(), + Get.find(), Get.find())); Get.lazyPut(() => ThreadDataSourceImpl( Get.find(), @@ -317,6 +323,8 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => DeleteEmailPermanentlyInteractor(Get.find())); Get.lazyPut(() => SaveRecentSearchInteractor(Get.find())); Get.lazyPut(() => GetAllRecentSearchLatestInteractor(Get.find())); + Get.lazyPut(() => StoreEmailSortOrderInteractor(Get.find())); + Get.lazyPut(() => GetStoredEmailSortOrderInteractor(Get.find())); Get.lazyPut(() => SearchEmailInteractor(Get.find())); Get.lazyPut(() => SearchMoreEmailInteractor(Get.find())); Get.lazyPut(() => RefreshChangesSearchEmailInteractor(Get.find())); 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 2f84ee76b..66f28a7de 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -35,7 +35,7 @@ class AdvancedFilterController extends BaseController { final hasAttachment = false.obs; final startDate = Rxn(); final endDate = Rxn(); - final sortOrderType = EmailSortOrderType.defaultSortOrder.obs; + final sortOrderType = SearchEmailFilter.defaultSortOrder.obs; final selectedFolderName = Rxn(); final GlobalKey keyFromEmailTagEditor = GlobalKey(); @@ -56,7 +56,7 @@ class AdvancedFilterController extends BaseController { final MailboxDashBoardController _mailboxDashBoardController = Get.find(); final focusManager = InputFieldFocusManager.initial(); - SearchEmailFilter _memorySearchFilter = SearchEmailFilter.initial(); + late SearchEmailFilter _memorySearchFilter; PresentationMailbox? _destinationMailboxSelected; @@ -74,11 +74,17 @@ class AdvancedFilterController extends BaseController { injectAutoCompleteBindings( _mailboxDashBoardController.sessionCurrent, _mailboxDashBoardController.accountId.value); + _setUpDefaultSortOrder(_mailboxDashBoardController.currentSortOrder); super.onReady(); } + void _setUpDefaultSortOrder(EmailSortOrderType emailSortOrderType) { + sortOrderType.value = emailSortOrderType; + _memorySearchFilter = SearchEmailFilter.withSortOrder(emailSortOrderType); + } + void clearSearchFilter() { - _memorySearchFilter = SearchEmailFilter.initial(); + _memorySearchFilter = SearchEmailFilter.withSortOrder(sortOrderType.value); _resetAllToOriginalValue(); _clearAllTextFieldInput(); _mailboxDashBoardController.handleClearAdvancedSearchFilterEmail(); @@ -460,6 +466,7 @@ class AdvancedFilterController extends BaseController { _dashboardActionWorker = ever( _mailboxDashBoardController.dashBoardAction, (action) { + log('AdvancedFilterController::_registerWorkerListener(): ${action.runtimeType}'); if (action is ClearAllFieldOfAdvancedSearchAction) { _handleClearAllFieldOfAdvancedSearch(); } else if (action is SelectDateRangeToAdvancedSearch) { @@ -478,6 +485,8 @@ class AdvancedFilterController extends BaseController { initSearchFilterField(currentContext); } else if (action is ClearSearchFilterAppliedAction) { clearSearchFilter(); + } else if (action is SynchronizeEmailSortOrderAction) { + _setUpDefaultSortOrder(action.emailSortOrderType); } } ); @@ -500,7 +509,7 @@ class AdvancedFilterController extends BaseController { void _handleClearAllFieldOfAdvancedSearch() { _resetAllToOriginalValue(); _clearAllTextFieldInput(); - _memorySearchFilter = SearchEmailFilter.initial(); + _memorySearchFilter = SearchEmailFilter.withSortOrder(sortOrderType.value); } void onSearchAction() { @@ -572,8 +581,8 @@ class AdvancedFilterController extends BaseController { } void _handleQuickSearchEmailByFromAction(EmailAddress emailAddress) { - searchController.clearSearchFilter(); - _memorySearchFilter = SearchEmailFilter.initial(); + searchController.clearSearchFilter(sortOrderType: sortOrderType.value); + _memorySearchFilter = SearchEmailFilter.withSortOrder(sortOrderType.value); _resetAllToOriginalValue(); _clearAllTextFieldInput(); searchController.searchInputController.clear(); @@ -596,7 +605,7 @@ class AdvancedFilterController extends BaseController { fromEmailAddressController.dispose(); _unregisterWorkerListener(); _resetAllToOriginalValue(); - _memorySearchFilter = SearchEmailFilter.initial(); + _memorySearchFilter = SearchEmailFilter.withSortOrder(sortOrderType.value); 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 a80450b85..0df805045 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -98,11 +98,14 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action import 'package:tmail_ui_user/features/mailbox_dashboard/domain/exceptions/spam_report_exception.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_composer_cache_state.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_stored_email_sort_order_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_composer_cache_on_web_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_all_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart'; @@ -114,6 +117,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_create_new_rule_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_preferences_setting_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_save_email_as_draft_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_store_email_sort_order_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/initialize_app_language.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/notify_thread_detail_setting_updated.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; @@ -239,6 +243,8 @@ class MailboxDashBoardController extends ReloadableController final RemoveAllComposerCacheOnWebInteractor _removeAllComposerCacheOnWebInteractor; final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; final ClearMailboxInteractor clearMailboxInteractor; + final StoreEmailSortOrderInteractor storeEmailSortOrderInteractor; + final GetStoredEmailSortOrderInteractor getStoredEmailSortOrderInteractor; GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; @@ -294,6 +300,7 @@ class MailboxDashBoardController extends ReloadableController DeepLinksManager? _deepLinksManager; StreamSubscription? _deepLinkDataStreamSubscription; int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete; + EmailSortOrderType currentSortOrder = SearchEmailFilter.defaultSortOrder; final StreamController> _progressStateController = StreamController>.broadcast(); @@ -337,6 +344,8 @@ class MailboxDashBoardController extends ReloadableController this._removeComposerCacheByIdOnWebInteractor, this._getAllIdentitiesInteractor, this.clearMailboxInteractor, + this.storeEmailSortOrderInteractor, + this.getStoredEmailSortOrderInteractor, ); @override @@ -364,6 +373,7 @@ class MailboxDashBoardController extends ReloadableController } _handleArguments(); _loadAppGrid(); + loadStoredEmailSortOrder(); super.onReady(); } @@ -485,6 +495,8 @@ class MailboxDashBoardController extends ReloadableController tokenOIDC: success.tokenOIDC, oidcConfiguration: success.configuration, ); + } else if (success is GetStoredEmailSortOrderSuccess) { + setUpDefaultEmailSortOrder(success.emailSortOrderType); } else { super.handleSuccessViewState(success); } @@ -915,6 +927,7 @@ class MailboxDashBoardController extends ReloadableController _unSelectedMailbox(); searchController.clearFilterSuggestion(); FocusManager.instance.primaryFocus?.unfocus(); + storeEmailSortOrder(searchController.searchEmailFilter.value.sortOrderType); dispatchAction(StartSearchEmailAction()); } @@ -2135,6 +2148,7 @@ class MailboxDashBoardController extends ReloadableController void selectSortOrderQuickSearchFilter(EmailSortOrderType sortOrder) { log('MailboxDashBoardController::selectSortOrderQuickSearchFilter():sortOrder: $sortOrder'); searchController.updateFilterEmail(sortOrderTypeOption: Some(sortOrder)); + storeEmailSortOrder(sortOrder); 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 3204cf829..413cf7c16 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -68,8 +68,10 @@ class SearchController extends BaseController with DateRangePickerMixin { isAdvancedSearchViewOpen.value = false; } - void clearSearchFilter() { - searchEmailFilter.value = SearchEmailFilter.initial(); + void clearSearchFilter({ + EmailSortOrderType sortOrderType = SearchEmailFilter.defaultSortOrder, + }) { + searchEmailFilter.value = SearchEmailFilter.withSortOrder(sortOrderType); } void synchronizeSearchFilter(SearchEmailFilter searchFilter) { diff --git a/lib/features/mailbox_dashboard/presentation/extensions/handle_store_email_sort_order_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/handle_store_email_sort_order_extension.dart new file mode 100644 index 000000000..510b54a83 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/extensions/handle_store_email_sort_order_extension.dart @@ -0,0 +1,22 @@ + +import 'package:core/utils/app_logger.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/model/search/email_sort_order_type.dart'; + +extension HandleStoreEmailSortOrderExtension on MailboxDashBoardController { + void storeEmailSortOrder(EmailSortOrderType emailSortOrder) { + setUpDefaultEmailSortOrder(emailSortOrder); + consumeState(storeEmailSortOrderInteractor.execute(emailSortOrder)); + } + + void loadStoredEmailSortOrder() { + consumeState(getStoredEmailSortOrderInteractor.execute()); + } + + void setUpDefaultEmailSortOrder(EmailSortOrderType storedSortOrder) { + log('$runtimeType::setUpDefaultEmailSortOrder: $storedSortOrder'); + currentSortOrder = storedSortOrder; + dispatchAction(SynchronizeEmailSortOrderAction(currentSortOrder)); + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart b/lib/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart deleted file mode 100644 index e69de29bb..000000000 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 b34d0dc31..5e50dfb5a 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 @@ -37,6 +37,9 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { factory SearchEmailFilter.initial() => SearchEmailFilter(); + factory SearchEmailFilter.withSortOrder(EmailSortOrderType sortOrder) => + SearchEmailFilter(sortOrderType: sortOrder); + SearchEmailFilter({ this.text, this.subject, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart index 83400b70f..6c3d47a44 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart @@ -169,7 +169,9 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { } if (queryString.isNotEmpty || _searchController.listFilterOnSuggestionForm.isNotEmpty) { - _searchController.clearSearchFilter(); + _searchController.clearSearchFilter( + sortOrderType: _dashBoardController.currentSortOrder, + ); _searchController.applyFilterSuggestionToSearchFilter( _dashBoardController.sessionCurrent?.getOwnEmailAddressOrEmpty(), ); @@ -207,7 +209,9 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { _searchController.searchInputController.text = recent.value; _searchController.searchFocus.unfocus(); _searchController.enableSearch(); - _searchController.clearSearchFilter(); + _searchController.clearSearchFilter( + sortOrderType: _dashBoardController.currentSortOrder, + ); _searchController.applyFilterSuggestionToSearchFilter( _dashBoardController.sessionCurrent?.getOwnEmailAddressOrEmpty(), ); diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index 6c316210d..de16c4323 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -45,6 +45,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all 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/extensions/handle_store_email_sort_order_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_emails_with_new_mailbox_id_extension.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'; @@ -162,6 +163,7 @@ class SearchEmailController extends BaseController textInputSearchFocus.requestFocus(); searchMoreState = SearchMoreState.idle; canSearchMore = true; + _setUpDefaultSortOrder(mailboxDashBoardController.currentSortOrder); super.onReady(); } @@ -205,6 +207,11 @@ class SearchEmailController extends BaseController } } + void _setUpDefaultSortOrder(EmailSortOrderType sortOrderType) { + emailSortOrderType.value = sortOrderType; + searchEmailFilter.value = SearchEmailFilter.withSortOrder(sortOrderType); + } + void _initializeDebounceTimeTextSearchChange() { _deBouncerTime = Debouncer( const Duration(milliseconds: 500), @@ -247,12 +254,16 @@ class SearchEmailController extends BaseController dashBoardActionWorker = ever( mailboxDashBoardController.dashBoardAction, (action) { + log('SearchEmailController::_initWorkerListener(): ${action.runtimeType}'); if (action is CloseSearchEmailViewAction) { closeSearchView(context: currentContext); mailboxDashBoardController.clearDashBoardAction(); } else if (action is CancelSelectionSearchEmailAction) { cancelSelectionMode(); mailboxDashBoardController.clearDashBoardAction(); + } else if (action is SynchronizeEmailSortOrderAction) { + _setUpDefaultSortOrder(action.emailSortOrderType); + mailboxDashBoardController.clearDashBoardAction(); } } ); @@ -589,8 +600,10 @@ class SearchEmailController extends BaseController listSuggestionSearch.clear(); listResultSearch.clear(); emailReceiveTimeType.value = EmailReceiveTimeType.allTime; - emailSortOrderType.value = SearchEmailFilter.defaultSortOrder; - searchEmailFilter.value = SearchEmailFilter.initial(); + emailSortOrderType.value = mailboxDashBoardController.currentSortOrder; + searchEmailFilter.value = SearchEmailFilter.withSortOrder( + emailSortOrderType.value, + ); searchIsRunning.value = false; final isMailAddress = EmailUtils.isEmailAddressValid(queryString); if (isMailAddress) { @@ -664,6 +677,7 @@ class SearchEmailController extends BaseController void selectSortOrderQuickSearchFilter(BuildContext context, EmailSortOrderType sortOrderType) { emailSortOrderType.value = sortOrderType; _updateSimpleSearchFilter(sortOrderTypeOption: Some(sortOrderType)); + mailboxDashBoardController.storeEmailSortOrder(sortOrderType); _searchEmailAction(context); } @@ -813,7 +827,9 @@ class SearchEmailController extends BaseController listSuggestionSearch.clear(); listContactSuggestionSearch.clear(); listResultSearch.clear(); - searchEmailFilter.value = SearchEmailFilter.initial(); + searchEmailFilter.value = SearchEmailFilter.withSortOrder( + mailboxDashBoardController.currentSortOrder, + ); } void closeSearchView({BuildContext? context}) { @@ -1056,8 +1072,10 @@ class SearchEmailController extends BaseController canSearchMore = true; searchMoreState = SearchMoreState.idle; emailReceiveTimeType.value = EmailReceiveTimeType.allTime; - emailSortOrderType.value = SearchEmailFilter.defaultSortOrder; - searchEmailFilter.value = SearchEmailFilter.initial(); + emailSortOrderType.value = mailboxDashBoardController.currentSortOrder; + searchEmailFilter.value = SearchEmailFilter.withSortOrder( + emailSortOrderType.value, + ); _searchEmailAction(context); } diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index e74db4ee9..96fb5decc 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -33,6 +33,7 @@ import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/state_cache_manager.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_sort_order_manager.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_spam_report_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/local_setting_cache_manager.dart'; @@ -94,6 +95,7 @@ class LocalBindings extends Bindings { Get.put(SessionHiveCacheClient()); Get.put(SessionCacheManager(Get.find())); Get.put(LocalSpamReportManager(Get.find())); + Get.put(LocalSortOrderManager(Get.find())); Get.put(CachingManager( Get.find(), Get.find(), diff --git a/test/features/mailbox_dashboard/presentation/controller/advanced_filter_controller_test.dart b/test/features/mailbox_dashboard/presentation/controller/advanced_filter_controller_test.dart index efbfb3b4e..8b687544b 100644 --- a/test/features/mailbox_dashboard/presentation/controller/advanced_filter_controller_test.dart +++ b/test/features/mailbox_dashboard/presentation/controller/advanced_filter_controller_test.dart @@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_i 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/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.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'; @@ -67,6 +68,7 @@ const fallbackGenerators = { MockSpec(), MockSpec(), MockSpec(), + MockSpec(), ]) void main() { // Declaration advanced filter controller @@ -80,6 +82,7 @@ void main() { late MockQuickSearchEmailInteractor mockQuickSearchEmailInteractor; late MockSaveRecentSearchInteractor mockSaveRecentSearchInteractor; late MockGetAllRecentSearchLatestInteractor mockGetAllRecentSearchLatestInteractor; + late MockStoreEmailSortOrderInteractor mockStoreEmailSortOrderInteractor; // Declaration base controller late MockCachingManager mockCachingManager; @@ -138,6 +141,7 @@ void main() { mockQuickSearchEmailInteractor = MockQuickSearchEmailInteractor(); mockSaveRecentSearchInteractor = MockSaveRecentSearchInteractor(); mockGetAllRecentSearchLatestInteractor = MockGetAllRecentSearchLatestInteractor(); + mockStoreEmailSortOrderInteractor = MockStoreEmailSortOrderInteractor(); searchController = SearchController( mockQuickSearchEmailInteractor, @@ -152,6 +156,7 @@ void main() { Get.put(mockMailboxDashBoardController); Get.put(mockGetAutoCompleteInteractor); + Get.put(mockStoreEmailSortOrderInteractor); advancedFilterController = AdvancedFilterController(); }); @@ -160,6 +165,7 @@ void main() { group('applyAdvancedSearchFilter::test', () { test('SHOULD make sure memory search filter and search filter should be the same after applying', () async { // Arrange + advancedFilterController.setMemorySearchFilter(SearchEmailFilter.initial()); advancedFilterController.hasKeyWordFilterInputController.text = 'Hello'; advancedFilterController.notKeyWordFilterInputController.text = 'dab'; advancedFilterController.listFromEmailAddress = [EmailAddress(null, 'user1@example.com')]; diff --git a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart index eb3d4657c..8e24ef4f2 100644 --- a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart +++ b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart @@ -60,11 +60,13 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_b import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; 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/get_composer_cache_on_web_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_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/remove_all_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_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/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart'; @@ -149,6 +151,8 @@ const fallbackGenerators = { MockSpec(), MockSpec(), MockSpec(), + MockSpec(), + MockSpec(), MockSpec(), MockSpec(), MockSpec(), @@ -241,6 +245,8 @@ void main() { final quickSearchEmailInteractor = MockQuickSearchEmailInteractor(); final saveRecentSearchInteractor = MockSaveRecentSearchInteractor(); final getAllRecentSearchLatestInteractor = MockGetAllRecentSearchLatestInteractor(); + final storeEmailSortOrderInteractor = MockStoreEmailSortOrderInteractor(); + final getStoredEmailSortOrderInteractor = MockGetStoredEmailSortOrderInteractor(); late SearchController searchController; // mock base controller Get dependencies @@ -380,6 +386,8 @@ void main() { removeComposerCacheByIdOnWebInteractor, getAllIdentitiesInteractor, clearMailboxInteractor, + storeEmailSortOrderInteractor, + getStoredEmailSortOrderInteractor, ); }); @@ -460,7 +468,7 @@ void main() { getLatestChanges: anyNamed('getLatestChanges'), propertiesCreated: anyNamed('propertiesCreated'), propertiesUpdated: anyNamed('propertiesUpdated'))); - expect(searchController.sortOrderFiltered, EmailSortOrderType.mostRecent); + expect(searchController.sortOrderFiltered, SearchEmailFilter.defaultSortOrder); expect(searchController.searchEmailFilter.value, SearchEmailFilter.initial()); verify(getEmailsInMailboxInteractor.execute( testSession, testAccountId, @@ -490,6 +498,7 @@ void main() { when(context.mounted).thenReturn(true); // expect query in advanced filter controller update as expected + advancedFilterController.setMemorySearchFilter(SearchEmailFilter.initial()); advancedFilterController.updateListEmailAddress(FilterField.from, [fromEmailAddress]); advancedFilterController.updateListEmailAddress(FilterField.to, [toEmailAddress]); advancedFilterController.subjectFilterInputController.text = emailSubject; @@ -520,7 +529,7 @@ void main() { getLatestChanges: anyNamed('getLatestChanges'), propertiesCreated: anyNamed('propertiesCreated'), propertiesUpdated: anyNamed('propertiesUpdated'))); - expect(searchController.sortOrderFiltered, EmailSortOrderType.mostRecent); + expect(searchController.sortOrderFiltered, SearchEmailFilter.defaultSortOrder); expect(searchController.searchEmailFilter.value, SearchEmailFilter.initial()); verify(getEmailsInMailboxInteractor.execute( testSession, testAccountId, @@ -565,6 +574,7 @@ void main() { text: SearchQuery(queryString), emailReceiveTimeType: EmailReceiveTimeType.last30Days, hasAttachment: true, + position: 0, ) ); }); diff --git a/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart b/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart index 3b90e04ca..d80af5984 100644 --- a/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart +++ b/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart @@ -58,11 +58,13 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart'; 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/get_composer_cache_on_web_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_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/remove_all_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_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/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; @@ -150,6 +152,8 @@ const fallbackGenerators = { MockSpec(), MockSpec(), MockSpec(), + MockSpec(), + MockSpec(), MockSpec(), MockSpec(), MockSpec(), @@ -231,6 +235,8 @@ void main() { final quickSearchEmailInteractor = MockQuickSearchEmailInteractor(); final saveRecentSearchInteractor = MockSaveRecentSearchInteractor(); final getAllRecentSearchLatestInteractor = MockGetAllRecentSearchLatestInteractor(); + final storeEmailSortOrderInteractor = MockStoreEmailSortOrderInteractor(); + final getStoredEmailSortOrderInteractor = MockGetStoredEmailSortOrderInteractor(); final cachingManager = MockCachingManager(); final languageCacheManager = MockLanguageCacheManager(); @@ -377,6 +383,8 @@ void main() { removeComposerCacheByIdOnWebInteractor, getAllIdentitiesInteractor, clearMailboxInteractor, + storeEmailSortOrderInteractor, + getStoredEmailSortOrderInteractor, ); Get.put(mailboxDashboardController); mailboxDashboardController.onReady(); diff --git a/test/features/search/verify_before_time_in_search_email_filter_test.dart b/test/features/search/verify_before_time_in_search_email_filter_test.dart index 9898b9230..04fc2524f 100644 --- a/test/features/search/verify_before_time_in_search_email_filter_test.dart +++ b/test/features/search/verify_before_time_in_search_email_filter_test.dart @@ -45,11 +45,13 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/clear_mailbox_int import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart'; 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/get_composer_cache_on_web_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_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/remove_all_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_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/domain/usecases/store_email_sort_order_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; @@ -167,6 +169,8 @@ const fallbackGenerators = { MockSpec(), MockSpec(), MockSpec(), + MockSpec(), + MockSpec(), ]) void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -186,6 +190,8 @@ void main() { late MockQuickSearchEmailInteractor mockQuickSearchEmailInteractor; late MockSaveRecentSearchInteractor mockSaveRecentSearchInteractor; late MockGetAllRecentSearchLatestInteractor mockGetAllRecentSearchLatestInteractor; + late MockStoreEmailSortOrderInteractor mockStoreEmailSortOrderInteractor; + late MockGetStoredEmailSortOrderInteractor mockGetStoredEmailSortOrderInteractor; // Declaration mailbox dashboard controller final MockGetSessionInteractor getSessionInteractor = MockGetSessionInteractor(); @@ -296,6 +302,8 @@ void main() { mockQuickSearchEmailInteractor = MockQuickSearchEmailInteractor(); mockSaveRecentSearchInteractor = MockSaveRecentSearchInteractor(); mockGetAllRecentSearchLatestInteractor = MockGetAllRecentSearchLatestInteractor(); + mockStoreEmailSortOrderInteractor = MockStoreEmailSortOrderInteractor(); + mockGetStoredEmailSortOrderInteractor = MockGetStoredEmailSortOrderInteractor(); // Mock dashboard controller moveToMailboxInteractor = MockMoveToMailboxInteractor(); @@ -377,6 +385,8 @@ void main() { removeComposerCacheByIdOnWebInteractor, getAllIdentitiesInteractor, clearMailboxInteractor, + mockStoreEmailSortOrderInteractor, + mockGetStoredEmailSortOrderInteractor, ); when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); diff --git a/test/features/thread/presentation/controller/thread_controller_test.dart b/test/features/thread/presentation/controller/thread_controller_test.dart index 417ded165..549f019f4 100644 --- a/test/features/thread/presentation/controller/thread_controller_test.dart +++ b/test/features/thread/presentation/controller/thread_controller_test.dart @@ -27,7 +27,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_i 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_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; @@ -351,7 +350,7 @@ void main() { AccountFixtures.aliceAccountId, limit: UnsignedInt(emailList.length), position: null, - sort: EmailSortOrderType.mostRecent.getSortOrder().toNullable(), + sort: SearchEmailFilter.defaultSortOrder.getSortOrder().toNullable(), filter: SearchEmailFilter.initial().mappingToEmailFilterCondition(), properties: EmailUtils.getPropertiesForEmailGetMethod( SessionFixtures.aliceSession, @@ -428,7 +427,7 @@ void main() { AccountFixtures.aliceAccountId, limit: ThreadConstants.defaultLimit, position: null, - sort: EmailSortOrderType.mostRecent.getSortOrder().toNullable(), + sort: SearchEmailFilter.defaultSortOrder.getSortOrder().toNullable(), filter: SearchEmailFilter.initial().mappingToEmailFilterCondition(), properties: EmailUtils.getPropertiesForEmailGetMethod( SessionFixtures.aliceSession,