diff --git a/lib/features/manage_account/presentation/always_read_receipt/always_read_receipt_controller.dart b/lib/features/manage_account/presentation/always_read_receipt/always_read_receipt_controller.dart new file mode 100644 index 000000000..674acf211 --- /dev/null +++ b/lib/features/manage_account/presentation/always_read_receipt/always_read_receipt_controller.dart @@ -0,0 +1,99 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/state/get_always_read_receipt_setting_state.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/state/update_always_read_receipt_setting_state.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/usecases/get_always_read_receipt_setting_interactor.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/usecases/update_always_read_receipt_setting_interactor.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +class AlwaysReadReceiptController extends BaseController { + AlwaysReadReceiptController( + this._getAlwaysReadReceiptSettingInteractor, + this._updateAlwaysReadReceiptSettingInteractor, + ); + + final GetAlwaysReadReceiptSettingInteractor _getAlwaysReadReceiptSettingInteractor; + final UpdateAlwaysReadReceiptSettingInteractor _updateAlwaysReadReceiptSettingInteractor; + + final alwaysReadReceipt = true.obs; + bool get isLoading => viewState.value.fold( + (failure) => false, + (success) => success is GettingAlwaysReadReceiptSetting || success is UpdatingAlwaysReadReceiptSetting); + final _manageAccountDashBoardController = Get.find(); + + @override + void onInit() { + super.onInit(); + + _getCurrentAlwaysReadReceiptSetting(); + } + + @override + void handleSuccessViewState(Success success) { + super.handleSuccessViewState(success); + if (success is GetAlwaysReadReceiptSettingSuccess) { + _getAlwaysReadReceiptSettingSuccess(success); + } else if (success is UpdateAlwaysReadReceiptSettingSuccess) { + _updateAlwaysReadReceiptSettingSuccess(success); + } + } + + @override + void handleFailureViewState(Failure failure) { + super.handleFailureViewState(failure); + if (failure is GetAlwaysReadReceiptSettingFailure) { + _getAlwaysReadReceiptSettingFailure(); + } else if (failure is UpdateAlwaysReadReceiptSettingFailure) { + _updateAlwaysReadReceiptSettingFailure(); + } + } + + void _updateAlwaysReadReceiptValue(bool value) { + alwaysReadReceipt.value = value; + } + + void _updateAlwaysReadReceiptSettingFailure() { + if (currentOverlayContext != null && currentContext != null) { + appToast.showToastErrorMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).an_error_occurred); + } + } + + void _updateAlwaysReadReceiptSettingSuccess( + UpdateAlwaysReadReceiptSettingSuccess success + ) { + _updateAlwaysReadReceiptValue(success.isEnabled); + } + + void toggleAlwaysReadReceipt() { + if (isLoading) return; + final accountId = _manageAccountDashBoardController.accountId.value; + if (accountId != null) { + consumeState(_updateAlwaysReadReceiptSettingInteractor.execute( + accountId, + !alwaysReadReceipt.value)); + } + } + + void _getAlwaysReadReceiptSettingFailure() { + alwaysReadReceipt.value = true; + } + + void _getAlwaysReadReceiptSettingSuccess( + GetAlwaysReadReceiptSettingSuccess success + ) { + _updateAlwaysReadReceiptValue(success.isEnabled); + } + + void _getCurrentAlwaysReadReceiptSetting() { + final accountId = _manageAccountDashBoardController.accountId.value; + if (accountId != null) { + consumeState(_getAlwaysReadReceiptSettingInteractor.execute(accountId)); + } + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/always_read_receipt/bindings/always_read_receipt_bindings.dart b/lib/features/manage_account/presentation/always_read_receipt/bindings/always_read_receipt_bindings.dart new file mode 100644 index 000000000..c1bfad429 --- /dev/null +++ b/lib/features/manage_account/presentation/always_read_receipt/bindings/always_read_receipt_bindings.dart @@ -0,0 +1,48 @@ +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/always_read_receipt/always_read_receipt_controller.dart'; +import 'package:tmail_ui_user/features/server_settings/data/datasource/server_settings_data_source.dart'; +import 'package:tmail_ui_user/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart'; +import 'package:tmail_ui_user/features/server_settings/data/network/server_settings_api.dart'; +import 'package:tmail_ui_user/features/server_settings/data/repository/server_settings_repository_impl.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/repository/server_settings_repository.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/usecases/get_always_read_receipt_setting_interactor.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/usecases/update_always_read_receipt_setting_interactor.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; + +class AlwaysReadReceiptBindings extends BaseBindings { + @override + void bindingsController() { + Get.put(AlwaysReadReceiptController( + Get.find(), + Get.find())); + } + + @override + void bindingsDataSource() { + Get.lazyPut(() => Get.find()); + } + + @override + void bindingsDataSourceImpl() { + Get.lazyPut(() => RemoteServerSettingsDataSourceImpl( + Get.find(), + Get.find())); + } + + @override + void bindingsInteractor() { + Get.lazyPut(() => GetAlwaysReadReceiptSettingInteractor(Get.find())); + Get.lazyPut(() => UpdateAlwaysReadReceiptSettingInteractor(Get.find())); + } + + @override + void bindingsRepository() { + Get.lazyPut(() => Get.find()); + } + + @override + void bindingsRepositoryImpl() { + Get.lazyPut(() => ServerSettingsRepositoryImpl(Get.find())); + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 127b53dbd..405b08749 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -12,6 +12,7 @@ import 'package:jmap_dart_client/jmap/mail/vacation/vacation_response.dart'; import 'package:model/model.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; +import 'package:server_settings/server_settings/capability_server_settings.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; import 'package:tmail_ui_user/features/base/state/banner_state.dart'; @@ -21,6 +22,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacati import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_vacation_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vacation_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/action/dashboard_setting_action.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/always_read_receipt/bindings/always_read_receipt_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/bindings/email_rules_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forward_bindings.dart'; @@ -198,6 +200,9 @@ class ManageAccountDashBoardController extends ReloadableController { case AccountMenuItem.emailRules: EmailRulesBindings().dependencies(); break; + case AccountMenuItem.alwaysReadReceipt: + AlwaysReadReceiptBindings().dependencies(); + break; case AccountMenuItem.forward: ForwardBindings().dependencies(); break; @@ -239,6 +244,14 @@ class ManageAccountDashBoardController extends ReloadableController { } } + bool get isServerSettingsCapabilitySupported { + if (accountId.value != null && sessionCurrent != null) { + return [capabilityServerSettings].isSupported(sessionCurrent!, accountId.value!); + } else { + return false; + } + } + bool get isRuleFilterCapabilitySupported { if (accountId.value != null && sessionCurrent != null) { return [capabilityRuleFilter].isSupported(sessionCurrent!, accountId.value!); diff --git a/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart b/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart index 72333386a..0b47d8273 100644 --- a/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart @@ -38,6 +38,8 @@ class ManageAccountMenuController extends GetxController { AccountMenuItem.profiles, if (dashBoardController.isRuleFilterCapabilitySupported) AccountMenuItem.emailRules, + if (dashBoardController.isServerSettingsCapabilitySupported) + AccountMenuItem.alwaysReadReceipt, if (dashBoardController.isForwardCapabilitySupported) AccountMenuItem.forward, if (dashBoardController.isVacationCapabilitySupported)