TF-524 Store recent search in hive database.

This commit is contained in:
dab246
2022-05-23 19:25:38 +07:00
committed by Dat H. Pham
parent 3513c363ff
commit 51cc3bd979
12 changed files with 147 additions and 3 deletions
+6 -1
View File
@@ -2,6 +2,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:tmail_ui_user/features/caching/email_cache_client.dart'; import 'package:tmail_ui_user/features/caching/email_cache_client.dart';
import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart'; import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart';
import 'package:tmail_ui_user/features/caching/recent_search_cache_client.dart';
import 'package:tmail_ui_user/features/caching/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/state_cache_client.dart';
class CachingManager { class CachingManager {
@@ -9,11 +10,13 @@ class CachingManager {
final MailboxCacheClient _mailboxCacheClient; final MailboxCacheClient _mailboxCacheClient;
final StateCacheClient _stateCacheClient; final StateCacheClient _stateCacheClient;
final EmailCacheClient _emailCacheClient; final EmailCacheClient _emailCacheClient;
final RecentSearchCacheClient _recentSearchCacheClient;
CachingManager( CachingManager(
this._mailboxCacheClient, this._mailboxCacheClient,
this._stateCacheClient, this._stateCacheClient,
this._emailCacheClient this._emailCacheClient,
this._recentSearchCacheClient,
); );
Future<void> clearAll() async { Future<void> clearAll() async {
@@ -22,12 +25,14 @@ class CachingManager {
_stateCacheClient.clearAllData(), _stateCacheClient.clearAllData(),
_mailboxCacheClient.clearAllData(), _mailboxCacheClient.clearAllData(),
_emailCacheClient.clearAllData(), _emailCacheClient.clearAllData(),
_recentSearchCacheClient.clearAllData(),
]); ]);
} else { } else {
await Future.wait([ await Future.wait([
_stateCacheClient.deleteBox(), _stateCacheClient.deleteBox(),
_mailboxCacheClient.deleteBox(), _mailboxCacheClient.deleteBox(),
_emailCacheClient.deleteBox(), _emailCacheClient.deleteBox(),
_recentSearchCacheClient.deleteBox(),
]); ]);
} }
} }
@@ -0,0 +1,5 @@
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
abstract class SearchDataSource {
Future<void> saveRecentSearch(RecentSearch recentSearch);
}
@@ -0,0 +1,29 @@
import 'package:tmail_ui_user/features/caching/recent_search_cache_client.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/recent_search_cache.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
class SearchDataSourceImpl extends SearchDataSource {
final RecentSearchCacheClient _recentSearchCacheClient;
SearchDataSourceImpl(this._recentSearchCacheClient);
@override
Future<void> saveRecentSearch(RecentSearch recentSearch) {
return Future.sync(() async {
if (await _recentSearchCacheClient.isExistItem(recentSearch.value)) {
await _recentSearchCacheClient.updateItem(
recentSearch.value,
recentSearch.toRecentSearchCache());
} else {
await _recentSearchCacheClient.insertItem(
recentSearch.value,
recentSearch.toRecentSearchCache());
}
}).catchError((error) {
throw error;
});
}
}
@@ -2,6 +2,7 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
part 'recent_search_cache.g.dart'; part 'recent_search_cache.g.dart';
@@ -18,4 +19,10 @@ class RecentSearchCache extends HiveObject with EquatableMixin {
@override @override
List<Object?> get props => [value, creationTime]; List<Object?> get props => [value, creationTime];
}
extension RecentSearchExtension on RecentSearch {
RecentSearchCache toRecentSearchCache() {
return RecentSearchCache(value, creationDate);
}
} }
@@ -0,0 +1,16 @@
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';
class SearchRepositoryImpl extends SearchRepository {
final SearchDataSource searchDataSource;
SearchRepositoryImpl(this.searchDataSource);
@override
Future<void> saveRecentSearch(RecentSearch recentSearch) {
return searchDataSource.saveRecentSearch(recentSearch);
}
}
@@ -0,0 +1,6 @@
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
abstract class SearchRepository {
Future<void> saveRecentSearch(RecentSearch recentSearch);
}
@@ -0,0 +1,18 @@
import 'package:core/core.dart';
class SaveRecentSearchSuccess extends UIState {
SaveRecentSearchSuccess();
@override
List<Object> get props => [];
}
class SaveRecentSearchFailure extends FeatureFailure {
final dynamic exception;
SaveRecentSearchFailure(this.exception);
@override
List<Object> get props => [exception];
}
@@ -0,0 +1,22 @@
import 'dart:core';
import 'package:core/core.dart';
import 'package:dartz/dartz.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/domain/state/save_recent_search_state.dart';
class SaveRecentSearchInteractor {
final SearchRepository searchRepository;
SaveRecentSearchInteractor(this.searchRepository);
Stream<Either<Failure, Success>> execute(RecentSearch recentSearch) async* {
try {
await searchRepository.saveRecentSearch(recentSearch);
yield Right(SaveRecentSearchSuccess());
} catch (exception) {
yield Left(SaveRecentSearchFailure(exception));
}
}
}
@@ -1,6 +1,7 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/caching/recent_search_cache_client.dart';
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart';
@@ -14,8 +15,13 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int
import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart'; import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/search_datasource.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/repository/search_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_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/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/presentation/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_bindings.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_bindings.dart';
@@ -34,6 +40,7 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.put(MailboxDashBoardController( Get.put(MailboxDashBoardController(
Get.find<MoveToMailboxInteractor>(), Get.find<MoveToMailboxInteractor>(),
Get.find<DeleteEmailPermanentlyInteractor>(), Get.find<DeleteEmailPermanentlyInteractor>(),
Get.find<SaveRecentSearchInteractor>(),
)); ));
} }
@@ -41,6 +48,7 @@ class MailboxDashBoardBindings extends BaseBindings {
void bindingsDataSource() { void bindingsDataSource() {
Get.lazyPut<EmailDataSource>(() => Get.find<EmailDataSourceImpl>()); Get.lazyPut<EmailDataSource>(() => Get.find<EmailDataSourceImpl>());
Get.lazyPut<HtmlDataSource>(() => Get.find<HtmlDataSourceImpl>()); Get.lazyPut<HtmlDataSource>(() => Get.find<HtmlDataSourceImpl>());
Get.lazyPut<SearchDataSource>(() => Get.find<SearchDataSourceImpl>());
} }
@override @override
@@ -50,6 +58,7 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.find<HtmlAnalyzer>(), Get.find<HtmlAnalyzer>(),
Get.find<DioClient>() Get.find<DioClient>()
)); ));
Get.lazyPut(() => SearchDataSourceImpl(Get.find<RecentSearchCacheClient>()));
} }
@override @override
@@ -58,11 +67,13 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => DeleteEmailPermanentlyInteractor(Get.find<EmailRepository>())); Get.lazyPut(() => DeleteEmailPermanentlyInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => SaveRecentSearchInteractor(Get.find<SearchRepository>()));
} }
@override @override
void bindingsRepository() { void bindingsRepository() {
Get.lazyPut<EmailRepository>(() => Get.find<EmailRepositoryImpl>()); Get.lazyPut<EmailRepository>(() => Get.find<EmailRepositoryImpl>());
Get.lazyPut<SearchRepository>(() => Get.find<SearchRepositoryImpl>());
} }
@override @override
@@ -71,5 +82,6 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.find<EmailDataSource>(), Get.find<EmailDataSource>(),
Get.find<HtmlDataSource>() Get.find<HtmlDataSource>()
)); ));
Get.lazyPut(() => SearchRepositoryImpl(Get.find<SearchDataSource>()));
} }
} }
@@ -30,10 +30,12 @@ import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_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/state/remove_email_drafts_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_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/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/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
@@ -58,6 +60,7 @@ class MailboxDashBoardController extends ReloadableController {
final MoveToMailboxInteractor _moveToMailboxInteractor; final MoveToMailboxInteractor _moveToMailboxInteractor;
final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor; final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor;
final SaveRecentSearchInteractor _saveRecentSearchInteractor;
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
final selectedMailbox = Rxn<PresentationMailbox>(); final selectedMailbox = Rxn<PresentationMailbox>();
@@ -86,6 +89,7 @@ class MailboxDashBoardController extends ReloadableController {
MailboxDashBoardController( MailboxDashBoardController(
this._moveToMailboxInteractor, this._moveToMailboxInteractor,
this._deleteEmailPermanentlyInteractor, this._deleteEmailPermanentlyInteractor,
this._saveRecentSearchInteractor,
); );
@override @override
@@ -394,6 +398,10 @@ class MailboxDashBoardController extends ReloadableController {
return null; return null;
} }
void saveRecentSearch(RecentSearch recentSearch) {
consumeState(_saveRecentSearchInteractor.execute(recentSearch));
}
void composeEmailAction() { void composeEmailAction() {
if (kIsWeb) { if (kIsWeb) {
if (dashBoardAction.value is! ComposeEmailAction) { if (dashBoardAction.value is! ComposeEmailAction) {
@@ -420,6 +420,12 @@ class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> with Ne
autofocus: true, autofocus: true,
focusNode: controller.searchFocus, focusNode: controller.searchFocus,
textInputAction: TextInputAction.done, textInputAction: TextInputAction.done,
onSubmitted: (keyword) {
log('MailboxDashBoardView::_buildSearchForm(): onSubmitted: $keyword');
if (keyword.trim().isNotEmpty) {
controller.saveRecentSearch(RecentSearch(keyword, DateTime.now()));
}
},
decoration: InputDecoration( decoration: InputDecoration(
border: InputBorder.none, border: InputBorder.none,
focusedBorder: InputBorder.none, focusedBorder: InputBorder.none,
@@ -431,7 +437,13 @@ class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> with Ne
), ),
leftButton: buildIconWeb( leftButton: buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icSearchBar, width: 16, height: 16, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icSearchBar, width: 16, height: 16, fit: BoxFit.fill),
onTap: () => {}), onTap: () {
final keyword = controller.searchInputController.text;
log('MailboxDashBoardView::_buildSearchForm(): buttonClick: $keyword');
if (keyword.trim().isNotEmpty) {
controller.saveRecentSearch(RecentSearch(keyword, DateTime.now()));
}
}),
rightButton: buildIconWeb( rightButton: buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icComposerClose, width: 18, height: 18, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icComposerClose, width: 18, height: 18, fit: BoxFit.fill),
onTap: () { onTap: () {
+5 -1
View File
@@ -4,6 +4,7 @@ import 'package:get/get.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/caching/email_cache_client.dart'; import 'package:tmail_ui_user/features/caching/email_cache_client.dart';
import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart'; import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart';
import 'package:tmail_ui_user/features/caching/recent_search_cache_client.dart';
import 'package:tmail_ui_user/features/caching/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/state_cache_client.dart';
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart';
@@ -26,9 +27,12 @@ class LocalBindings extends Bindings {
Get.put(MailboxCacheManager(Get.find<MailboxCacheClient>())); Get.put(MailboxCacheManager(Get.find<MailboxCacheClient>()));
Get.put(EmailCacheClient()); Get.put(EmailCacheClient());
Get.put(EmailCacheManager(Get.find<EmailCacheClient>())); Get.put(EmailCacheManager(Get.find<EmailCacheClient>()));
Get.put(RecentSearchCacheClient());
Get.put(CachingManager( Get.put(CachingManager(
Get.find<MailboxCacheClient>(), Get.find<MailboxCacheClient>(),
Get.find<StateCacheClient>(), Get.find<StateCacheClient>(),
Get.find<EmailCacheClient>())); Get.find<EmailCacheClient>(),
Get.find<RecentSearchCacheClient>(),
));
} }
} }