TF-3834 Implement remember user sort order after search

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-07-29 16:06:59 +07:00
committed by Dat H. Pham
parent ec4b618a32
commit 1293c1a997
25 changed files with 312 additions and 23 deletions
@@ -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<void> saveRecentSearch(
@@ -17,4 +18,8 @@ abstract class SearchDataSource {
String? pattern,
}
);
Future<void> storeEmailSortOrder(EmailSortOrderType sortOrderType);
Future<EmailSortOrderType> getStoredEmailSortOrder();
}
@@ -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<void> saveRecentSearch(
@@ -46,4 +53,18 @@ class SearchDataSourceImpl extends SearchDataSource {
);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<void> storeEmailSortOrder(EmailSortOrderType sortOrderType) {
return Future.sync(() async {
return await _localSortOrderManager.storeEmailSortOrderIfChanged(sortOrderType);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<EmailSortOrderType> getStoredEmailSortOrder() {
return Future.sync(() {
return _localSortOrderManager.getStoredEmailSortOrder();
}).catchError(_exceptionThrower.throwException);
}
}
@@ -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<bool> 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<bool> 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,
);
}
}
@@ -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<void> storeEmailSortOrder(EmailSortOrderType sortOrderType) {
return searchDataSource.storeEmailSortOrder(sortOrderType);
}
@override
Future<EmailSortOrderType> getStoredEmailSortOrder() {
return searchDataSource.getStoredEmailSortOrder();
}
}