TF-3767 Use TupleKey to save recent search for each account

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-06-11 12:13:28 +07:00
committed by Dat H. Pham
parent 42fbb01847
commit bce9620ac5
13 changed files with 262 additions and 65 deletions
@@ -8,9 +8,9 @@ import 'package:core/utils/print_utils.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/caching/clients/recent_search_cache_client.dart';
import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart';
import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart';
import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.dart';
import 'package:tmail_ui_user/features/composer/data/repository/contact_repository_impl.dart';
import 'package:tmail_ui_user/features/composer/domain/repository/contact_repository.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart';
@@ -233,7 +233,7 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.find<HtmlAnalyzer>(),
Get.find<CacheExceptionThrower>()));
Get.lazyPut(() => SearchDataSourceImpl(
Get.find<RecentSearchCacheClient>(),
Get.find<RecentSearchCacheManager>(),
Get.find<CacheExceptionThrower>()));
Get.lazyPut(() => ThreadDataSourceImpl(
Get.find<ThreadAPI>(),
@@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/session/session.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/core/user_name.dart';
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
@@ -245,13 +246,25 @@ class SearchController extends BaseController with DateRangePickerMixin {
searchInputController.text = value;
}
void saveRecentSearch(RecentSearch recentSearch) {
consumeState(_saveRecentSearchInteractor.execute(recentSearch));
void saveRecentSearch(
AccountId accountId,
UserName userName,
RecentSearch recentSearch,
) {
consumeState(_saveRecentSearchInteractor.execute(
accountId,
userName,
recentSearch,
));
}
Future<List<RecentSearch>> getAllRecentSearchAction(String pattern) async {
Future<List<RecentSearch>> getAllRecentSearchAction(
AccountId accountId,
UserName userName,
String pattern,
) async {
return await _getAllRecentSearchLatestInteractor
.execute(pattern: pattern)
.execute(accountId, userName, pattern: pattern)
.then((result) => result.fold(
(failure) => <RecentSearch>[],
(success) => success is GetAllRecentSearchLatestSuccess
@@ -119,7 +119,21 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
padding: const EdgeInsets.only(bottom: 16),
child: loadingWidget
),
fetchRecentActionCallback: _searchController.getAllRecentSearchAction,
fetchRecentActionCallback: (pattern) {
final accountId = _dashBoardController.accountId.value;
final userName = _dashBoardController.sessionCurrent?.username;
if (accountId == null || userName == null) {
logError('SearchInputFormWidget::fetchRecentActionCallback: accountId or userName is null');
return <RecentSearch>[];
} else {
return _searchController.getAllRecentSearchAction(
accountId,
userName,
pattern,
);
}
},
itemRecentBuilder: (context, recent) => RecentSearchItemTileWidget(recent),
onRecentSelected: _invokeSelectRecentItem,
suggestionsCallback: _dashBoardController.quickSearchEmails,
@@ -143,7 +157,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
_searchController.enableSearch();
if (queryString.isNotEmpty) {
_searchController.saveRecentSearch(RecentSearch.now(queryString));
_saveRecentSearch(queryString);
}
if (queryString.isNotEmpty || _searchController.listFilterOnSuggestionForm.isNotEmpty) {
@@ -157,6 +171,22 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
}
}
void _saveRecentSearch(String queryString) {
final accountId = _dashBoardController.accountId.value;
final userName = _dashBoardController.sessionCurrent?.username;
if (accountId == null || userName == null) {
logError('SearchInputFormWidget::_saveRecentSearch: accountId or userName is null');
return;
}
_searchController.saveRecentSearch(
accountId,
userName,
RecentSearch.now(queryString),
);
}
void _invokeSelectSuggestionItem(PresentationEmail presentationEmail) {
_dashBoardController.dispatchAction(
OpenEmailDetailedFromSuggestionQuickSearchAction(