From 53b9745992a128a7a9b88996452aeeb5f83c8dba Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 8 Jul 2022 14:35:18 +0700 Subject: [PATCH] TF-297 Store language selected when user changed --- .../presentation/composer_bindings.dart | 6 +++-- .../identity_creator_bindings.dart | 12 +++------ .../datasource/manage_account_datasource.dart | 4 +++ .../manage_account_datasource_impl.dart | 15 ++++++++++- .../data/local/language_cache_manager.dart | 20 ++++++++++++++ .../manage_account_repository_impl.dart | 7 +++++ .../repository/manage_account_repository.dart | 4 +++ .../domain/state/save_language_app_state.dart | 26 +++++++++++++++++++ .../save_language_app_interactor.dart | 24 +++++++++++++++++ .../language_and_region_bindings.dart | 5 +++- .../language_and_region_controller.dart | 11 ++++++++ .../manage_account_dashboard_bindings.dart | 12 +++++++++ .../identities/identities_bindings.dart | 22 +++------------- lib/main/bindings/local/local_bindings.dart | 2 ++ .../bindings/network/network_bindings.dart | 2 ++ 15 files changed, 142 insertions(+), 30 deletions(-) create mode 100644 lib/features/manage_account/data/local/language_cache_manager.dart create mode 100644 lib/features/manage_account/domain/state/save_language_app_state.dart create mode 100644 lib/features/manage_account/domain/usecases/save_language_app_interactor.dart diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index 72268af34..064d7d3b6 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; @@ -57,7 +58,6 @@ class ComposerBindings extends BaseBindings { void _bindingsUtils() { Get.lazyPut(() => const Uuid()); - Get.lazyPut(() => ManageAccountAPI(Get.find())); } @override @@ -75,7 +75,9 @@ class ComposerBindings extends BaseBindings { Get.find(), Get.find() )); - Get.lazyPut(() => ManageAccountDataSourceImpl(Get.find())); + Get.lazyPut(() => ManageAccountDataSourceImpl( + Get.find(), + Get.find())); } @override diff --git a/lib/features/identity_creator/presentation/identity_creator_bindings.dart b/lib/features/identity_creator/presentation/identity_creator_bindings.dart index faf567b8d..4a79bfd03 100644 --- a/lib/features/identity_creator/presentation/identity_creator_bindings.dart +++ b/lib/features/identity_creator/presentation/identity_creator_bindings.dart @@ -4,20 +4,14 @@ import 'package:tmail_ui_user/features/identity_creator/presentation/identity_cr import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; -import 'package:jmap_dart_client/http/http_client.dart' as jmap_http_client; class IdentityCreatorBindings extends BaseBindings { - @override - void dependencies() { - Get.lazyPut(() => ManageAccountAPI(Get.find())); - super.dependencies(); - } - @override void bindingsController() { Get.lazyPut(() => IdentityCreatorController( @@ -33,7 +27,9 @@ class IdentityCreatorBindings extends BaseBindings { @override void bindingsDataSourceImpl() { - Get.lazyPut(() => ManageAccountDataSourceImpl(Get.find())); + Get.lazyPut(() => ManageAccountDataSourceImpl( + Get.find(), + Get.find())); } @override diff --git a/lib/features/manage_account/data/datasource/manage_account_datasource.dart b/lib/features/manage_account/data/datasource/manage_account_datasource.dart index 977a20dda..d6bc6d5dc 100644 --- a/lib/features/manage_account/data/datasource/manage_account_datasource.dart +++ b/lib/features/manage_account/data/datasource/manage_account_datasource.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; @@ -13,4 +15,6 @@ abstract class ManageAccountDataSource { Future deleteIdentity(AccountId accountId, IdentityId identityId); Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); + + Future persistLanguage(Locale localeCurrent); } \ No newline at end of file diff --git a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart index 197f96c46..2a34cb414 100644 --- a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart +++ b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart @@ -1,7 +1,10 @@ +import 'dart:ui'; + import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; @@ -10,8 +13,9 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/identities_re class ManageAccountDataSourceImpl extends ManageAccountDataSource { final ManageAccountAPI manageAccountAPI; + final LanguageCacheManager _languageCacheManager; - ManageAccountDataSourceImpl(this.manageAccountAPI); + ManageAccountDataSourceImpl(this.manageAccountAPI, this._languageCacheManager); @override Future getAllIdentities(AccountId accountId, {Properties? properties}) { @@ -48,4 +52,13 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource { throw error; }); } + + @override + Future persistLanguage(Locale localeCurrent) { + return Future.sync(() async { + return await _languageCacheManager.persistLanguage(localeCurrent); + }).catchError((error) { + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/manage_account/data/local/language_cache_manager.dart b/lib/features/manage_account/data/local/language_cache_manager.dart new file mode 100644 index 000000000..e8a2b5063 --- /dev/null +++ b/lib/features/manage_account/data/local/language_cache_manager.dart @@ -0,0 +1,20 @@ + +import 'dart:ui'; + +import 'package:shared_preferences/shared_preferences.dart'; + +class LanguageCacheManager { + static const keyLanguageCode = 'LANGUAGE_CODE'; + static const keyCountryCode = 'COUNTRY_CODE'; + + final SharedPreferences _sharedPreferences; + + LanguageCacheManager(this._sharedPreferences); + + Future persistLanguage(Locale localeCurrent) async { + await Future.wait([ + _sharedPreferences.setString(keyLanguageCode, localeCurrent.languageCode), + _sharedPreferences.setString(keyCountryCode, localeCurrent.countryCode ?? '') + ]); + } +} \ No newline at end of file diff --git a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart index 4b880ec2a..764d4b4ef 100644 --- a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart +++ b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; @@ -32,4 +34,9 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository { Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) { return dataSource.editIdentity(accountId, editIdentityRequest); } + + @override + Future persistLanguage(Locale localeCurrent) { + return dataSource.persistLanguage(localeCurrent); + } } \ No newline at end of file diff --git a/lib/features/manage_account/domain/repository/manage_account_repository.dart b/lib/features/manage_account/domain/repository/manage_account_repository.dart index 0591fb0ae..e8b1b7bc5 100644 --- a/lib/features/manage_account/domain/repository/manage_account_repository.dart +++ b/lib/features/manage_account/domain/repository/manage_account_repository.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; @@ -13,4 +15,6 @@ abstract class ManageAccountRepository { Future deleteIdentity(AccountId accountId, IdentityId identityId); Future editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest); + + Future persistLanguage(Locale localeCurrent); } \ No newline at end of file diff --git a/lib/features/manage_account/domain/state/save_language_app_state.dart b/lib/features/manage_account/domain/state/save_language_app_state.dart new file mode 100644 index 000000000..a9d6a5015 --- /dev/null +++ b/lib/features/manage_account/domain/state/save_language_app_state.dart @@ -0,0 +1,26 @@ +import 'package:core/core.dart'; + +class SavingLanguageApp extends UIState { + + SavingLanguageApp(); + + @override + List get props => []; +} + +class SaveLanguageAppSuccess extends UIState { + + SaveLanguageAppSuccess(); + + @override + List get props => []; +} + +class SaveLanguageAppFailure extends FeatureFailure { + final dynamic exception; + + SaveLanguageAppFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/manage_account/domain/usecases/save_language_app_interactor.dart b/lib/features/manage_account/domain/usecases/save_language_app_interactor.dart new file mode 100644 index 000000000..917344a05 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/save_language_app_interactor.dart @@ -0,0 +1,24 @@ +import 'dart:core'; +import 'dart:ui'; + +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/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/save_language_app_state.dart'; + +class SaveLanguageAppInteractor { + final ManageAccountRepository manageAccountRepository; + + SaveLanguageAppInteractor(this.manageAccountRepository); + + Stream> execute(Locale localeCurrent) async* { + try { + yield Right(SavingLanguageApp()); + await manageAccountRepository.persistLanguage(localeCurrent); + yield Right(SaveLanguageAppSuccess()); + } catch (exception) { + yield Left(SaveLanguageAppFailure(exception)); + } + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart b/lib/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart index 1c65f1414..33fdc14d5 100644 --- a/lib/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart +++ b/lib/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart @@ -1,12 +1,14 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_app_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_controller.dart'; class LanguageAndRegionBindings extends BaseBindings { @override void bindingsController() { - Get.lazyPut(() => LanguageAndRegionController()); + Get.lazyPut(() => LanguageAndRegionController(Get.find())); } @override @@ -19,6 +21,7 @@ class LanguageAndRegionBindings extends BaseBindings { @override void bindingsInteractor() { + Get.lazyPut(() => SaveLanguageAppInteractor(Get.find())); } @override diff --git a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart index c8f43cea0..9e5a592c1 100644 --- a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart +++ b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart @@ -3,13 +3,18 @@ import 'dart:ui'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_app_interactor.dart'; import 'package:tmail_ui_user/main/localizations/localization_service.dart'; class LanguageAndRegionController extends BaseController { + final SaveLanguageAppInteractor _saveLanguageAppInteractor; + final listSupportedLanguages = [].obs; final languageSelected = LocalizationService.defaultLocale.obs; + LanguageAndRegionController(this._saveLanguageAppInteractor); + @override void onReady() { _setUpSupportedLanguages(); @@ -36,5 +41,11 @@ class LanguageAndRegionController extends BaseController { void selectLanguage(Locale? selectedLocale) { languageSelected.value = selectedLocale ?? LocalizationService.defaultLocale; LocalizationService.changeLocale(languageSelected.value.languageCode); + + _saveLanguage(languageSelected.value); + } + + void _saveLanguage(Locale localeCurrent) { + consumeState(_saveLanguageAppInteractor.execute(localeCurrent)); } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart index 78ba2ba6e..c38500ce5 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart @@ -19,6 +19,12 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_a import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; +import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; +import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; +import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; @@ -48,6 +54,7 @@ class ManageAccountDashBoardBindings extends BaseBindings { void bindingsDataSource() { Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override @@ -59,6 +66,9 @@ class ManageAccountDashBoardBindings extends BaseBindings { Get.find(), Get.find() )); + Get.lazyPut(() => ManageAccountDataSourceImpl( + Get.find(), + Get.find())); } @override @@ -85,11 +95,13 @@ class ManageAccountDashBoardBindings extends BaseBindings { void bindingsRepository() { Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); } @override void bindingsRepositoryImpl() { Get.lazyPut(() => AccountRepositoryImpl(Get.find())); Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find())); + Get.lazyPut(() => ManageAccountRepositoryImpl(Get.find())); } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/profiles/identities/identities_bindings.dart b/lib/features/manage_account/presentation/profiles/identities/identities_bindings.dart index 7afc1ff09..2f14ebc87 100644 --- a/lib/features/manage_account/presentation/profiles/identities/identities_bindings.dart +++ b/lib/features/manage_account/presentation/profiles/identities/identities_bindings.dart @@ -1,10 +1,5 @@ import 'package:get/get.dart'; -import 'package:jmap_dart_client/http/http_client.dart' as jmap_http_client; import 'package:tmail_ui_user/features/base/base_bindings.dart'; -import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; -import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; -import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; -import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart'; import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_identity_interactor.dart'; @@ -18,7 +13,6 @@ class IdentitiesBindings extends BaseBindings { @override void dependencies() { Get.lazyPut(() => const Uuid()); - Get.lazyPut(() => ManageAccountAPI(Get.find())); super.dependencies(); } @@ -34,14 +28,10 @@ class IdentitiesBindings extends BaseBindings { } @override - void bindingsDataSource() { - Get.lazyPut(() => Get.find()); - } + void bindingsDataSource() {} @override - void bindingsDataSourceImpl() { - Get.lazyPut(() => ManageAccountDataSourceImpl(Get.find())); - } + void bindingsDataSourceImpl() {} @override void bindingsInteractor() { @@ -52,12 +42,8 @@ class IdentitiesBindings extends BaseBindings { } @override - void bindingsRepository() { - Get.lazyPut(() => Get.find()); - } + void bindingsRepository() {} @override - void bindingsRepositoryImpl() { - Get.lazyPut(() => ManageAccountRepositoryImpl(Get.find())); - } + void bindingsRepositoryImpl() {} } \ No newline at end of file diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index ad58d280e..d6112bc5d 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.da import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart'; 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/manage_account/data/local/language_cache_manager.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; class LocalBindings extends Bindings { @@ -41,6 +42,7 @@ class LocalBindings extends Bindings { Get.put(AccountCacheClient()); Get.put(AccountCacheManager(Get.find())); Get.put(OidcConfigurationCacheManager(Get.find())); + Get.put(LanguageCacheManager(Get.find())); Get.put(CachingManager( Get.find(), Get.find(), diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index 5cdf8c4e9..7f46048e2 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -17,6 +17,7 @@ import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart' import 'package:tmail_ui_user/features/login/data/utils/library_platform/app_auth_plugin/app_auth_plugin.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart'; +import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:worker_manager/worker_manager.dart'; @@ -77,6 +78,7 @@ class NetworkBindings extends Bindings { Get.find(), Get.find())); Get.put(ComposerAPI(Get.find())); + Get.put(ManageAccountAPI(Get.find())); } void _bindingConnection() {