diff --git a/lib/features/manage_account/domain/state/save_language_to_server_settings_state.dart b/lib/features/manage_account/domain/state/save_language_to_server_settings_state.dart new file mode 100644 index 000000000..5cd1930d5 --- /dev/null +++ b/lib/features/manage_account/domain/state/save_language_to_server_settings_state.dart @@ -0,0 +1,18 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:flutter/widgets.dart'; + +class SavingLanguageToServerSettings extends LoadingState {} + +class SaveLanguageToServerSettingsSuccess extends UIState { + SaveLanguageToServerSettingsSuccess(this.locale); + + final Locale locale; + + @override + List get props => [locale]; +} + +class SaveLanguageToServerSettingsFailure extends FeatureFailure { + SaveLanguageToServerSettingsFailure({super.exception}); +} \ No newline at end of file diff --git a/lib/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart b/lib/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart new file mode 100644 index 000000000..f18193371 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart @@ -0,0 +1,39 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:dartz/dartz.dart'; +import 'package:flutter/widgets.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/save_language_to_server_settings_state.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/repository/server_settings_repository.dart'; + +class SaveLanguageToServerSettingsInteractor { + const SaveLanguageToServerSettingsInteractor(this._serverSettingsRepository); + + final ServerSettingsRepository _serverSettingsRepository; + + Stream> execute( + AccountId accountId, + Locale locale, + ) async* { + try { + yield Right(SavingLanguageToServerSettings()); + final currentSettings = await _serverSettingsRepository.getServerSettings(accountId); + final newSettings = TMailServerSettings( + id: currentSettings.id, + settings: currentSettings.settings?.copyWith( + language: locale.languageCode, + ) ?? TMailServerSettingOptions(language: locale.languageCode), + ); + await _serverSettingsRepository.updateServerSettings( + accountId, + TMailServerSettings(settings: newSettings.settings), + ); + yield Right(SaveLanguageToServerSettingsSuccess(locale)); + } catch (e) { + logError('SaveLanguageToServerSettingsInteractor::execute(): $e'); + yield Left(SaveLanguageToServerSettingsFailure(exception: e)); + } + } +} \ 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 cc58a6889..4aeb8bad1 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,33 +1,47 @@ 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/preferences_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/repository/server_settings_repository.dart'; class LanguageAndRegionBindings extends BaseBindings { @override - void bindingsController() { - Get.lazyPut(() => LanguageAndRegionController(Get.find())); - } + void dependencies() { + PreferencesInteractorsBindings().dependencies(); + super.dependencies(); + } + + @override + void bindingsController() { + Get.lazyPut(() => LanguageAndRegionController( + Get.find(), + Get.find(), + )); + } + @override void bindingsDataSource() { } - + @override void bindingsDataSourceImpl() { } - + @override void bindingsInteractor() { - Get.lazyPut(() => SaveLanguageInteractor(Get.find())); + Get.lazyPut( + () => SaveLanguageToServerSettingsInteractor(Get.find()), + ); } - + @override void bindingsRepository() { } - + @override void bindingsRepositoryImpl() { } 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 0de0089de..069183396 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 @@ -4,20 +4,31 @@ import 'dart:ui'; import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; import 'package:get/get.dart'; +import 'package:server_settings/server_settings/capability_server_settings.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/save_language_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; +import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/localizations/localization_service.dart'; class LanguageAndRegionController extends BaseController { final SaveLanguageInteractor _saveLanguageInteractor; + final SaveLanguageToServerSettingsInteractor saveLanguageToServerSettingsInteractor; final listSupportedLanguages = [].obs; final languageSelected = LocalizationService.defaultLocale.obs; final isLanguageMenuOverlayOpen = RxBool(false); - LanguageAndRegionController(this._saveLanguageInteractor); + final manageAccountDashBoardController = Get.find(); + + LanguageAndRegionController( + this._saveLanguageInteractor, + this.saveLanguageToServerSettingsInteractor, + ); @override void onReady() { @@ -53,6 +64,18 @@ class LanguageAndRegionController extends BaseController { void _saveLanguage(Locale localeCurrent) { consumeState(_saveLanguageInteractor.execute(localeCurrent)); + + final session = manageAccountDashBoardController.sessionCurrent; + final accountId = manageAccountDashBoardController.accountId.value; + if (accountId == null || + session == null || + !capabilityServerSettings.isSupported(session, accountId) || + session.isLanguageReadOnly(accountId)) return; + + consumeState(saveLanguageToServerSettingsInteractor.execute( + accountId, + localeCurrent, + )); } void toggleLanguageMenuOverlay() {