diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index f1e794baa..0c3a39511 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1946,6 +1946,7 @@ class MailboxDashBoardController extends ReloadableController arguments: ManageAccountArguments( sessionCurrent, previousUri: RouteUtils.baseUri, + quota: octetsQuota.value, ), ); @@ -2020,7 +2021,8 @@ class MailboxDashBoardController extends ReloadableController arguments: ManageAccountArguments( sessionCurrent, menuSettingCurrent: AccountMenuItem.vacation, - previousUri: RouteUtils.baseUri + previousUri: RouteUtils.baseUri, + quota: octetsQuota.value, ) ); diff --git a/lib/features/manage_account/presentation/extensions/validate_storage_menu_visible_extension.dart b/lib/features/manage_account/presentation/extensions/validate_storage_menu_visible_extension.dart new file mode 100644 index 000000000..04daa6343 --- /dev/null +++ b/lib/features/manage_account/presentation/extensions/validate_storage_menu_visible_extension.dart @@ -0,0 +1,47 @@ +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/quotas/domain/exceptions/quotas_exception.dart'; +import 'package:tmail_ui_user/features/quotas/domain/extensions/list_quotas_extensions.dart'; +import 'package:tmail_ui_user/features/quotas/domain/state/get_quotas_state.dart'; +import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart'; +import 'package:tmail_ui_user/features/quotas/presentation/quotas_interactor_bindings.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +extension ValidateStorageMenuVisibleExtension + on ManageAccountDashBoardController { + void injectQuotaBindings() { + if (isStorageCapabilitySupported) { + QuotasInteractorBindings().dependencies(); + } + } + + void getQuotas(AccountId? accountId) { + if (accountId == null) { + consumeState( + Stream.value(Left(GetQuotasFailure(NotFoundAccountIdException))), + ); + return; + } + + getQuotasInteractor = getBinding(); + if (getQuotasInteractor == null || !isStorageCapabilitySupported) { + consumeState( + Stream.value(Left(GetQuotasFailure(QuotasNotSupportedException))), + ); + return; + } + + consumeState(getQuotasInteractor!.execute(accountId)); + } + + void handleGetQuotasSuccess(GetQuotasSuccess success) { + octetsQuota.value = success.quotas.octetsQuota; + } + + void handleGetQuotasFailure() { + octetsQuota.value = null; + } +} 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 52a9667d4..2b4ce2b69 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/vacation/vacation_response.dart'; +import 'package:jmap_dart_client/jmap/quotas/quota.dart'; import 'package:model/model.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:server_settings/server_settings/capability_server_settings.dart'; @@ -29,6 +30,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/b import 'package:tmail_ui_user/features/manage_account/presentation/extensions/export_trace_log_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_storage_menu_visible_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forward_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart'; @@ -41,6 +43,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/preferences/b import 'package:tmail_ui_user/features/manage_account/presentation/storage/storage_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_controller_bindings.dart'; import 'package:tmail_ui_user/features/paywall/presentation/paywall_controller.dart'; +import 'package:tmail_ui_user/features/quotas/domain/state/get_quotas_state.dart'; +import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -55,14 +59,17 @@ class ManageAccountDashBoardController extends ReloadableController GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; PaywallController? paywallController; + GetQuotasInteractor? getQuotasInteractor; final accountId = Rxn(); final accountMenuItemSelected = AccountMenuItem.profiles.obs; final settingsPageLevel = SettingsPageLevel.universal.obs; final vacationResponse = Rxn(); final dashboardSettingAction = Rxn(); + final octetsQuota = Rxn(); Uri? previousUri; + AccountMenuItem? selectedMenu; int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete; @override @@ -89,6 +96,8 @@ class ManageAccountDashBoardController extends ReloadableController _handleUpdateVacationSuccess(success); } else if (success is ExportTraceLogSuccess) { handleExportTraceLogSuccess(success); + } else if (success is GetQuotasSuccess) { + handleGetQuotasSuccess(success); } else { super.handleSuccessViewState(success); } @@ -100,6 +109,8 @@ class ManageAccountDashBoardController extends ReloadableController handleExportTraceLogFailure(failure); } else if (failure is UpdateVacationFailure) { setUpVacation(null); + } else if (failure is GetQuotasFailure) { + handleGetQuotasFailure(); } else { super.handleFailureViewState(failure); } @@ -108,7 +119,7 @@ class ManageAccountDashBoardController extends ReloadableController @override void handleReloaded(Session session) { log('ManageAccountDashBoardController::handleReloaded:'); - _setUpComponentsFromSession(session); + _setUpComponentsFromSession(session: session); _getParametersRouter(); } @@ -116,16 +127,24 @@ class ManageAccountDashBoardController extends ReloadableController final arguments = Get.arguments; if (arguments is ManageAccountArguments) { previousUri = arguments.previousUri; - _setUpComponentsFromSession(arguments.session); - if (arguments.menuSettingCurrent != null) { - selectAccountMenuItem(arguments.menuSettingCurrent!); + _setUpComponentsFromSession( + session: arguments.session, + quota: arguments.quota, + ); + selectedMenu = arguments.menuSettingCurrent; + if (selectedMenu != null && selectedMenu != AccountMenuItem.storage) { + selectAccountMenuItem(selectedMenu!); } } else if (PlatformInfo.isWeb) { + selectedMenu = null; reload(); } } - void _setUpComponentsFromSession(Session? session) { + void _setUpComponentsFromSession({ + Session? session, + Quota? quota, + }) { sessionCurrent = session; accountId.value = session?.accountId; synchronizeOwnEmailAddress(session?.getOwnEmailAddressOrEmpty() ?? ''); @@ -136,6 +155,12 @@ class ManageAccountDashBoardController extends ReloadableController ownEmailAddress: ownEmailAddress.value, ); paywallController?.loadPaywallUrl(); + + if (quota != null) { + octetsQuota.value = quota; + } else { + getQuotas(accountId.value); + } } void _getParametersRouter() { @@ -149,7 +174,10 @@ class ManageAccountDashBoardController extends ReloadableController ) { selectAccountMenuItem(AccountMenuItem.profiles); } else { - selectAccountMenuItem(navigationRouter.accountMenuItem); + selectedMenu = navigationRouter.accountMenuItem; + if (selectedMenu != null && selectedMenu != AccountMenuItem.storage) { + selectAccountMenuItem(selectedMenu!); + } } } @@ -166,6 +194,7 @@ class ManageAccountDashBoardController extends ReloadableController injectVacationBindings(session, accountId); injectForwardBindings(session, accountId); injectRuleFilterBindings(session, accountId); + injectQuotaBindings(); } @override @@ -432,6 +461,8 @@ class ManageAccountDashBoardController extends ReloadableController } paywallController?.onClose(); paywallController = null; + previousUri = null; + selectedMenu = null; super.onClose(); } } \ No newline at end of file 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 da91d31d8..692fae7cc 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 @@ -1,10 +1,8 @@ - import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -21,12 +19,23 @@ class ManageAccountMenuController extends GetxController with ContactSupportMixi AccountMenuItem.languageAndRegion, ]); + late Worker _quotaRxWorker; + void _registerObxStreamListener() { ever(dashBoardController.accountId, (accountId) { if (accountId != null) { _createListAccountMenu(); } }); + + _quotaRxWorker = ever( + dashBoardController.octetsQuota, + (octetsQuota) { + if (octetsQuota != null) { + _addStorageToMenuList(); + } + }, + ); } @override @@ -49,8 +58,6 @@ class ManageAccountMenuController extends GetxController with ContactSupportMixi AccountMenuItem.mailboxVisibility, if (dashBoardController.isLanguageSettingDisplayed) AccountMenuItem.languageAndRegion, - if (dashBoardController.isStorageCapabilitySupported) - AccountMenuItem.storage, ]; listAccountMenuItem.value = newListMenuSetting; @@ -70,4 +77,20 @@ class ManageAccountMenuController extends GetxController with ContactSupportMixi void backToMailboxDashBoard(BuildContext context) { dashBoardController.backToMailboxDashBoard(context: context); } + + void _addStorageToMenuList() { + listAccountMenuItem.add(AccountMenuItem.storage); + + if (dashBoardController.selectedMenu != null) { + dashBoardController.selectAccountMenuItem( + dashBoardController.selectedMenu!, + ); + } + } + + @override + void onClose() { + _quotaRxWorker.dispose(); + super.onClose(); + } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart index 93d2e28aa..2d71e7ac6 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart @@ -7,7 +7,6 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/extensions/validate_setting_capability_supported_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart'; @@ -171,7 +170,7 @@ class SettingsFirstLevelView extends GetWidget { ]); }), Obx(() { - if (controller.manageAccountDashboardController.isStorageCapabilitySupported) { + if (controller.manageAccountDashboardController.octetsQuota.value != null) { return Column(children: [ Divider( color: AppColor.colorDividerHorizontal, diff --git a/lib/features/manage_account/presentation/model/manage_account_arguments.dart b/lib/features/manage_account/presentation/model/manage_account_arguments.dart index dd5968ff1..f77dc9178 100644 --- a/lib/features/manage_account/presentation/model/manage_account_arguments.dart +++ b/lib/features/manage_account/presentation/model/manage_account_arguments.dart @@ -1,6 +1,6 @@ - import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/quotas/quota.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; class ManageAccountArguments with EquatableMixin { @@ -8,12 +8,14 @@ class ManageAccountArguments with EquatableMixin { final Session? session; final AccountMenuItem? menuSettingCurrent; final Uri? previousUri; + final Quota? quota; ManageAccountArguments( this.session, { this.menuSettingCurrent, this.previousUri, + this.quota, } ); @@ -22,5 +24,6 @@ class ManageAccountArguments with EquatableMixin { session, menuSettingCurrent, previousUri, + quota, ]; } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/storage/storage_bindings.dart b/lib/features/manage_account/presentation/storage/storage_bindings.dart index ca14ee73b..d980565b2 100644 --- a/lib/features/manage_account/presentation/storage/storage_bindings.dart +++ b/lib/features/manage_account/presentation/storage/storage_bindings.dart @@ -1,12 +1,9 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/storage/storage_controller.dart'; -import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart'; -import 'package:tmail_ui_user/features/quotas/presentation/quotas_interactor_bindings.dart'; class StorageBindings extends Bindings { @override void dependencies() { - QuotasInteractorBindings().dependencies(); - Get.lazyPut(() => StorageController(Get.find())); + Get.lazyPut(() => StorageController()); } } diff --git a/lib/features/manage_account/presentation/storage/storage_controller.dart b/lib/features/manage_account/presentation/storage/storage_controller.dart index 9c24a0455..722a3818b 100644 --- a/lib/features/manage_account/presentation/storage/storage_controller.dart +++ b/lib/features/manage_account/presentation/storage/storage_controller.dart @@ -1,50 +1,12 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:dartz/dartz.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; -import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:jmap_dart_client/jmap/quotas/quota.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; -import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/paywall/presentation/saas_premium_mixin.dart'; -import 'package:tmail_ui_user/features/quotas/domain/extensions/list_quotas_extensions.dart'; -import 'package:tmail_ui_user/features/quotas/domain/state/get_quotas_state.dart'; -import 'package:tmail_ui_user/features/quotas/domain/use_case/get_quotas_interactor.dart'; class StorageController extends BaseController with SaaSPremiumMixin { final dashBoardController = Get.find(); - final GetQuotasInteractor _getQuotasInteractor; - - final octetsQuota = Rxn(); - - StorageController(this._getQuotasInteractor); - - @override - void onReady() { - final accountId = dashBoardController.accountId.value; - if (accountId != null) { - _getQuotasAction(accountId); - } else { - consumeState( - Stream.value( - Left(GetQuotasFailure(NotFoundAccountIdException())), - ), - ); - } - super.onReady(); - } - - void _getQuotasAction(AccountId accountId) { - consumeState(_getQuotasInteractor.execute(accountId)); - } - - void _handleGetQuotasSuccess(GetQuotasSuccess success) { - octetsQuota.value = success.quotas.octetsQuota; - } - bool validatePremiumIsAvailable() { final accountId = dashBoardController.accountId.value; final session = dashBoardController.sessionCurrent; @@ -58,25 +20,4 @@ class StorageController extends BaseController with SaaSPremiumMixin { void onUpgradeStorage(BuildContext context) { dashBoardController.paywallController?.navigateToPaywall(context); } - - bool get isLoading => viewState.value - .fold((failure) => false, (success) => success is GetQuotasLoading); - - @override - void handleSuccessViewState(Success success) { - if (success is GetQuotasSuccess) { - _handleGetQuotasSuccess(success); - } else { - super.handleSuccessViewState(success); - } - } - - @override - void handleFailureViewState(Failure failure) { - if (failure is GetQuotasFailure) { - octetsQuota.value = null; - } else { - super.handleFailureViewState(failure); - } - } } diff --git a/lib/features/manage_account/presentation/storage/storage_view.dart b/lib/features/manage_account/presentation/storage/storage_view.dart index 25d6472d6..3f532558b 100644 --- a/lib/features/manage_account/presentation/storage/storage_view.dart +++ b/lib/features/manage_account/presentation/storage/storage_view.dart @@ -3,7 +3,6 @@ import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; -import 'package:tmail_ui_user/features/base/widget/circle_loading_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; @@ -61,23 +60,13 @@ class StorageView extends GetWidget with AppLoaderMixin { isCenter: true, textAlign: TextAlign.center, ), - Obx(() { - if (!controller.isLoading) { - return const SizedBox.shrink(); - } - return Center( - child: Padding( - padding: SettingsUtils.getSettingProgressBarPadding( - context, - controller.responsiveUtils, - ), - child: const CircleLoadingWidget(), - ), - ); - }), Expanded( child: Obx(() { - final octetsQuota = controller.octetsQuota.value; + final octetsQuota = controller + .dashBoardController + .octetsQuota + .value; + if (octetsQuota != null && octetsQuota.storageAvailable) { return SingleChildScrollView( child: Padding( diff --git a/lib/features/quotas/domain/exceptions/quotas_exception.dart b/lib/features/quotas/domain/exceptions/quotas_exception.dart index 914236be9..a6e3bda8d 100644 --- a/lib/features/quotas/domain/exceptions/quotas_exception.dart +++ b/lib/features/quotas/domain/exceptions/quotas_exception.dart @@ -1,3 +1,3 @@ -class NotFoundQuotasException implements Exception { - NotFoundQuotasException(); -} +class NotFoundQuotasException implements Exception {} + +class QuotasNotSupportedException implements Exception {}