diff --git a/integration_test/robots/mailbox_menu_robot.dart b/integration_test/robots/mailbox_menu_robot.dart index b75a35ab5..4f2e2d9da 100644 --- a/integration_test/robots/mailbox_menu_robot.dart +++ b/integration_test/robots/mailbox_menu_robot.dart @@ -114,7 +114,7 @@ class MailboxMenuRobot extends CoreRobot { int getUsedQuota() { final usedQuota = - getBinding()?.octetsQuota.value?.used?.value.toInt(); + getBinding()?.octetsQuota.value?.used?.value.toInt(); if (usedQuota == null) throw NullQuotaException(); return usedQuota; diff --git a/lib/features/base/mixin/expand_folder_trigger_scrollable_mixin.dart b/lib/features/base/mixin/expand_folder_trigger_scrollable_mixin.dart index 7d86e7aaa..71389b812 100644 --- a/lib/features/base/mixin/expand_folder_trigger_scrollable_mixin.dart +++ b/lib/features/base/mixin/expand_folder_trigger_scrollable_mixin.dart @@ -3,9 +3,8 @@ import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:model/mailbox/expand_mode.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.dart'; import 'package:tmail_ui_user/features/quotas/domain/extensions/quota_extensions.dart'; -import 'package:tmail_ui_user/features/quotas/presentation/quotas_controller.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; mixin ExpandFolderTriggerScrollableMixin { @@ -50,7 +49,7 @@ mixin ExpandFolderTriggerScrollableMixin { double _getOffsetY() { try { - final quota = getBinding()?.octetsQuota.value; + final quota = getBinding()?.octetsQuota.value; final isQuotaViewDisplayed = quota?.storageAvailable ?? false; final isPremiumAvailable = getBinding() diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index e76b60349..5d64126b1 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -100,7 +100,7 @@ import 'package:tmail_ui_user/features/email/presentation/model/composer_argumen import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart'; @@ -1051,7 +1051,7 @@ class ComposerController extends BaseController popBack(); if (needIncreaseMySpace) { - mailboxDashBoardController.navigateToPaywall(context); + mailboxDashBoardController.paywallController?.navigateToPaywall(context); } else { _autoFocusFieldWhenLauncher(); } @@ -1334,7 +1334,7 @@ class ComposerController extends BaseController popBack(); if (needIncreaseMySpace) { - mailboxDashBoardController.navigateToPaywall(context); + mailboxDashBoardController.paywallController?.navigateToPaywall(context); } else { _autoFocusFieldWhenLauncher(); } @@ -2270,7 +2270,7 @@ class ComposerController extends BaseController popBack(); if (needIncreaseMySpace) { - mailboxDashBoardController.navigateToPaywall(context); + mailboxDashBoardController.paywallController?.navigateToPaywall(context); } else { _autoFocusFieldWhenLauncher(); } diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index b60d3354b..abfafc0e5 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -8,7 +8,8 @@ import 'package:tmail_ui_user/features/base/widget/application_version_widget.da import 'package:tmail_ui_user/features/base/widget/premium/increase_space_button_widget.dart'; import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.dart'; +import 'package:tmail_ui_user/features/quotas/domain/extensions/quota_extensions.dart'; import 'package:tmail_ui_user/features/quotas/presentation/quotas_view.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -41,9 +42,15 @@ class MailboxView extends BaseMailboxView { final isPremiumAvailable = controller .mailboxDashBoardController .validatePremiumIsAvailable(); + + final octetQuota = controller + .mailboxDashBoardController + .octetsQuota + .value; + final isDesktop = controller.responsiveUtils.isDesktop(context); - if (isPremiumAvailable) { + if (isPremiumAvailable && octetQuota?.storageAvailable == true) { return IncreaseSpaceButtonWidget( imagePaths: controller.imagePaths, margin: EdgeInsetsDirectional.only( @@ -54,7 +61,8 @@ class MailboxView extends BaseMailboxView { isDesktop: isDesktop, onTapAction: () => controller .mailboxDashBoardController - .navigateToPaywall(context), + .paywallController + ?.navigateToPaywall(context), ); } else { return const SizedBox.shrink(); 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 23b0ec048..f1e794baa 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -25,9 +25,11 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.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:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:rxdart/transformers.dart'; +import 'package:server_settings/server_settings/tmail_server_settings_extension.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_manager.dart'; @@ -128,7 +130,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/select_search_filter_action_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/web_auth_redirect_processor_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart'; @@ -154,8 +155,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/account import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart'; import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; -import 'package:tmail_ui_user/features/paywall/domain/model/paywall_url_pattern.dart'; -import 'package:tmail_ui_user/features/paywall/domain/state/get_paywall_url_state.dart'; +import 'package:tmail_ui_user/features/paywall/presentation/paywall_controller.dart'; import 'package:tmail_ui_user/features/paywall/presentation/saas_premium_mixin.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/controller/web_socket_controller.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.dart'; @@ -204,7 +204,6 @@ import 'package:tmail_ui_user/main/universal_import/html_stub.dart' as html; import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; import 'package:tmail_ui_user/main/utils/ios_notification_manager.dart'; -import 'package:server_settings/server_settings/tmail_server_settings_extension.dart'; import 'package:uuid/uuid.dart'; class MailboxDashBoardController extends ReloadableController @@ -292,6 +291,7 @@ class MailboxDashBoardController extends ReloadableController final isDrawerOpened = RxBool(false); final isContextMenuOpened = RxBool(false); final isPopupMenuOpened = RxBool(false); + final octetsQuota = Rxn(); Map mapDefaultMailboxIdByRole = {}; Map mapMailboxById = {}; @@ -309,8 +309,7 @@ class MailboxDashBoardController extends ReloadableController StreamSubscription? _deepLinkDataStreamSubscription; int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete; EmailSortOrderType currentSortOrder = SearchEmailFilter.defaultSortOrder; - PaywallUrlPattern? paywallUrlPattern; - bool isRetryGetPaywallUrl = false; + PaywallController? paywallController; final StreamController> _progressStateController = StreamController>.broadcast(); @@ -377,7 +376,6 @@ class MailboxDashBoardController extends ReloadableController if (PlatformInfo.isWeb) { listSearchFilterScrollController = ScrollController(); twakeAppManager.setExecutingBeforeReconnect(false); - isRetryGetPaywallUrl = false; } if (PlatformInfo.isIOS) { _registerPendingCurrentEmailIdInNotification(); @@ -507,8 +505,6 @@ class MailboxDashBoardController extends ReloadableController ); } else if (success is GetStoredEmailSortOrderSuccess) { setUpDefaultEmailSortOrder(success.emailSortOrderType); - } else if (success is GetPaywallUrlSuccess) { - loadPaywallUrlSuccess(success.paywallUrlPattern); } else { super.handleSuccessViewState(success); } @@ -554,25 +550,11 @@ class MailboxDashBoardController extends ReloadableController tryGetAuthenticatedAccountToUseApp(); } else if (isGetTokenOIDCFailure(failure)) { backToHomeScreen(); - } else if (failure is GetPaywallUrlFailure) { - loadPaywallUrlFailure(); } else { super.handleFailureViewState(failure); } } - @override - void handleErrorViewState(Object error, StackTrace stackTrace) { - super.handleErrorViewState(error, stackTrace); - isRetryGetPaywallUrl = false; - } - - @override - void handleUrgentExceptionOnWeb({Failure? failure, Exception? exception}) { - super.handleUrgentExceptionOnWeb(failure: failure, exception: exception); - isRetryGetPaywallUrl = false; - } - @override void handleUrgentExceptionOnMobile({Failure? failure, Exception? exception}) { SmartDialog.dismiss(); @@ -857,7 +839,10 @@ class MailboxDashBoardController extends ReloadableController getAllSendingEmails(); _storeSessionAction(session); } else { - loadPaywallUrl(); + paywallController = PaywallController( + ownEmailAddress: ownEmailAddress.value, + ); + paywallController?.loadPaywallUrl(); } } @@ -3314,6 +3299,8 @@ class MailboxDashBoardController extends ReloadableController _currentEmailState = null; _isFirstSessionLoad = false; twakeAppManager.setHasComposer(false); + paywallController?.onClose(); + paywallController = null; super.onClose(); } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.dart new file mode 100644 index 000000000..1e4e228c3 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.dart @@ -0,0 +1,23 @@ +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; + +extension ValidatePremiumStorageExtension on MailboxDashBoardController { + bool validatePremiumIsAvailable() { + if (accountId.value == null || sessionCurrent == null) { + return false; + } + return isPremiumAvailable( + accountId: accountId.value, + session: sessionCurrent, + ); + } + + bool validateUserHasIsAlreadyHighestSubscription() { + if (accountId.value == null || sessionCurrent == null) { + return false; + } + return isAlreadyHighestSubscription( + accountId: accountId.value, + session: sessionCurrent, + ); + } +} 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 d5a8ff439..7cbc7f6e0 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_bindings.dart @@ -10,6 +10,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/identities/id import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_bindings.dart'; +import 'package:tmail_ui_user/features/paywall/presentation/paywall_bindings.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; class ManageAccountDashBoardBindings extends BaseBindings { @@ -41,7 +42,9 @@ class ManageAccountDashBoardBindings extends BaseBindings { } @override - void bindingsInteractor() {} + void bindingsInteractor() { + PaywallBindings().dependencies(); + } @override void bindingsRepository() { 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 10828442f..52a9667d4 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -40,6 +40,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/notification/ import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart'; 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/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'; @@ -53,6 +54,7 @@ class ManageAccountDashBoardController extends ReloadableController GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; + PaywallController? paywallController; final accountId = Rxn(); final accountMenuItemSelected = AccountMenuItem.profiles.obs; @@ -130,6 +132,10 @@ class ManageAccountDashBoardController extends ReloadableController _setUpMinInputLengthAutocomplete(); _bindingInteractorForMenuItemView(sessionCurrent, accountId.value); _getVacationResponse(); + paywallController = PaywallController( + ownEmailAddress: ownEmailAddress.value, + ); + paywallController?.loadPaywallUrl(); } void _getParametersRouter() { @@ -424,6 +430,8 @@ class ManageAccountDashBoardController extends ReloadableController if (LogTracking().isEnabled) { disposeTraceLogDependencies(); } + paywallController?.onClose(); + paywallController = null; super.onClose(); } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/storage/storage_controller.dart b/lib/features/manage_account/presentation/storage/storage_controller.dart index 8d82f6ae2..c2c5477ea 100644 --- a/lib/features/manage_account/presentation/storage/storage_controller.dart +++ b/lib/features/manage_account/presentation/storage/storage_controller.dart @@ -1,17 +1,19 @@ 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 { +class StorageController extends BaseController with SaaSPremiumMixin { final dashBoardController = Get.find(); final GetQuotasInteractor _getQuotasInteractor; @@ -23,7 +25,7 @@ class StorageController extends BaseController { @override void onReady() { final accountId = dashBoardController.accountId.value; - if(accountId != null) { + if (accountId != null) { _getQuotasAction(accountId); } else { consumeState( @@ -43,8 +45,18 @@ class StorageController extends BaseController { octetsQuota.value = success.quotas.octetsQuota; } - void onUpgradeStorage() { + bool validatePremiumIsAvailable() { + final accountId = dashBoardController.accountId.value; + final session = dashBoardController.sessionCurrent; + if (accountId == null || session == null) { + return false; + } + return isPremiumAvailable(accountId: accountId, session: session); + } + + void onUpgradeStorage(BuildContext context) { + dashBoardController.paywallController?.navigateToPaywall(context); } @override diff --git a/lib/features/manage_account/presentation/storage/storage_view.dart b/lib/features/manage_account/presentation/storage/storage_view.dart index ab1ae82d2..4afa0fe9b 100644 --- a/lib/features/manage_account/presentation/storage/storage_view.dart +++ b/lib/features/manage_account/presentation/storage/storage_view.dart @@ -1,4 +1,5 @@ import 'package:core/presentation/utils/theme_utils.dart'; +import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart'; @@ -77,11 +78,19 @@ class StorageView extends GetWidget { quota: octetsQuota, isMobile: isMobile, ), - UpgradeStorageWidget( - imagePaths: controller.imagePaths, - isMobile: isMobile, - onUpgradeStorageAction: controller.onUpgradeStorage, - ) + Obx(() { + if (controller.validatePremiumIsAvailable() && + PlatformInfo.isWeb) { + return UpgradeStorageWidget( + imagePaths: controller.imagePaths, + isMobile: isMobile, + onUpgradeStorageAction: () => + controller.onUpgradeStorage(context), + ); + } else { + return const SizedBox.shrink(); + } + }) ], ), ), diff --git a/lib/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart b/lib/features/paywall/presentation/paywall_controller.dart similarity index 67% rename from lib/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart rename to lib/features/paywall/presentation/paywall_controller.dart index d1ad9da93..3e2d87af7 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart +++ b/lib/features/paywall/presentation/paywall_controller.dart @@ -1,34 +1,24 @@ import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/paywall/domain/model/paywall_url_pattern.dart'; +import 'package:tmail_ui_user/features/paywall/domain/state/get_paywall_url_state.dart'; import 'package:tmail_ui_user/features/paywall/domain/usecases/get_paywall_url_interactor.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart'; -extension HandlePaywallExtension on MailboxDashBoardController { - bool validatePremiumIsAvailable() { - if (accountId.value == null || sessionCurrent == null) { - return false; - } - return isPremiumAvailable( - accountId: accountId.value, - session: sessionCurrent, - ); - } +class PaywallController extends BaseController { + final String ownEmailAddress; - bool validateUserHasIsAlreadyHighestSubscription() { - if (accountId.value == null || sessionCurrent == null) { - return false; - } - return isAlreadyHighestSubscription( - accountId: accountId.value, - session: sessionCurrent, - ); - } + PaywallUrlPattern? paywallUrlPattern; + bool isRetryGetPaywallUrl = false; + + PaywallController({required this.ownEmailAddress}); void loadPaywallUrl() { final getPaywallUrlInteractor = getBinding(); @@ -50,7 +40,7 @@ extension HandlePaywallExtension on MailboxDashBoardController { if (isRetryGetPaywallUrl) { isRetryGetPaywallUrl = false; final qualifiedPaywall = paywallUrlPattern!.getQualifiedUrl( - ownerEmail: ownEmailAddress.value, + ownerEmail: ownEmailAddress, domainName: RouteUtils.getRootDomain(), ); AppUtils.launchLink(qualifiedPaywall); @@ -100,7 +90,7 @@ extension HandlePaywallExtension on MailboxDashBoardController { } final qualifiedPaywall = paywallUrlPattern!.getQualifiedUrl( - ownerEmail: ownEmailAddress.value, + ownerEmail: ownEmailAddress, domainName: RouteUtils.getRootDomain(), ); @@ -111,4 +101,41 @@ extension HandlePaywallExtension on MailboxDashBoardController { isRetryGetPaywallUrl = true; loadPaywallUrl(); } + + @override + void handleSuccessViewState(Success success) { + if (success is GetPaywallUrlSuccess) { + loadPaywallUrlSuccess(success.paywallUrlPattern); + } else { + super.handleSuccessViewState(success); + } + } + + @override + void handleFailureViewState(Failure failure) { + if (failure is GetPaywallUrlFailure) { + loadPaywallUrlFailure(); + } else { + super.handleFailureViewState(failure); + } + } + + @override + void handleErrorViewState(Object error, StackTrace stackTrace) { + super.handleErrorViewState(error, stackTrace); + isRetryGetPaywallUrl = false; + } + + @override + void handleUrgentExceptionOnWeb({Failure? failure, Exception? exception}) { + super.handleUrgentExceptionOnWeb(failure: failure, exception: exception); + isRetryGetPaywallUrl = false; + } + + @override + void onClose() { + paywallUrlPattern = null; + isRetryGetPaywallUrl = false; + super.onClose(); + } } diff --git a/lib/features/quotas/domain/extensions/list_quotas_extensions.dart b/lib/features/quotas/domain/extensions/list_quotas_extensions.dart index e6de29d54..8c9397955 100644 --- a/lib/features/quotas/domain/extensions/list_quotas_extensions.dart +++ b/lib/features/quotas/domain/extensions/list_quotas_extensions.dart @@ -1,16 +1,8 @@ - -import 'package:core/utils/app_logger.dart'; +import 'package:collection/collection.dart'; import 'package:jmap_dart_client/jmap/quotas/data_types.dart'; import 'package:jmap_dart_client/jmap/quotas/quota.dart'; extension ListQuotasExtensions on List { - - Quota? get octetsQuota { - try { - return firstWhere((quota) => quota.resourceType == ResourceType.octets); - } catch(e) { - logError('ListQuotasExtensions::octetsQuota: Not found octets quota'); - return null; - } - } + Quota? get octetsQuota => + firstWhereOrNull((quota) => quota.resourceType == ResourceType.octets); } \ No newline at end of file diff --git a/lib/features/quotas/domain/extensions/quota_extensions.dart b/lib/features/quotas/domain/extensions/quota_extensions.dart index 3cf04437a..68ca065a4 100644 --- a/lib/features/quotas/domain/extensions/quota_extensions.dart +++ b/lib/features/quotas/domain/extensions/quota_extensions.dart @@ -51,7 +51,7 @@ extension QuotasExtensions on Quota { bool get isStorageUsageIndicatorAppear { if (storageAvailable) { - return used!.value <= presentationHardLimit!.value * 0.8; + return used!.value > presentationHardLimit!.value * 0.8; } else { return false; } diff --git a/lib/features/quotas/presentation/quotas_controller.dart b/lib/features/quotas/presentation/quotas_controller.dart index 2b7b09358..1fe661144 100644 --- a/lib/features/quotas/presentation/quotas_controller.dart +++ b/lib/features/quotas/presentation/quotas_controller.dart @@ -1,13 +1,15 @@ 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/material.dart'; import 'package:get/get.dart'; 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/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/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/validate_premium_storage_extension.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'; @@ -19,7 +21,6 @@ class QuotasController extends BaseController { final GetQuotasInteractor _getQuotasInteractor; - final octetsQuota = Rxn(); final isBannerEnabled = RxBool(false); late Worker accountIdListener; @@ -31,26 +32,39 @@ class QuotasController extends BaseController { } void _handleGetQuotasSuccess(GetQuotasSuccess success) { - octetsQuota.value = success.quotas.octetsQuota; + log('$runtimeType::_handleGetQuotasSuccess: Quotas is ${success.quotas}'); + mailboxDashBoardController.octetsQuota.value = success.quotas.octetsQuota; isBannerEnabled.value = true; } void _initWorker() { - accountIdListener = ever(mailboxDashBoardController.accountId, (accountId) { - final session = mailboxDashBoardController.sessionCurrent; - if (accountId is AccountId && - session != null && - CapabilityIdentifier.jmapQuota.isSupported(session, accountId) - ) { - _getQuotasAction(accountId); - } - }); + accountIdListener = ever( + mailboxDashBoardController.accountId, + (_) => reloadQuota(), + ); + } + + bool get isStorageCapabilitySupported { + final accountId = mailboxDashBoardController.accountId.value; + final session = mailboxDashBoardController.sessionCurrent; + + if (accountId != null && session != null) { + return CapabilityIdentifier.jmapQuota.isSupported(session, accountId); + } else { + return false; + } } void reloadQuota() { - if (mailboxDashBoardController.accountId.value == null) return; - - _getQuotasAction(mailboxDashBoardController.accountId.value!); + if (isStorageCapabilitySupported) { + _getQuotasAction(mailboxDashBoardController.accountId.value!); + } else { + consumeState( + Stream.value( + Left(GetQuotasFailure(NotFoundAccountIdException())), + ), + ); + } } @override @@ -77,6 +91,8 @@ class QuotasController extends BaseController { @override void handleFailureViewState(Failure failure) { if (failure is GetQuotasFailure) { + logError('$runtimeType::handleFailureViewState'); + mailboxDashBoardController.octetsQuota.value = null; isBannerEnabled.value = true; } else { super.handleFailureViewState(failure); @@ -89,7 +105,7 @@ class QuotasController extends BaseController { } void handleManageMyStorage(BuildContext context) { - mailboxDashBoardController.navigateToPaywall(context); + mailboxDashBoardController.paywallController?.navigateToPaywall(context); } void closeBanner() { diff --git a/lib/features/quotas/presentation/quotas_view.dart b/lib/features/quotas/presentation/quotas_view.dart index 152932c23..aa240f46f 100644 --- a/lib/features/quotas/presentation/quotas_view.dart +++ b/lib/features/quotas/presentation/quotas_view.dart @@ -17,7 +17,7 @@ class QuotasView extends GetWidget { @override Widget build(BuildContext context) { return Obx(() { - final octetQuota = controller.octetsQuota.value; + final octetQuota = controller.mailboxDashBoardController.octetsQuota.value; bool isDesktop = controller.responsiveUtils.isDesktop(context); if (octetQuota != null && octetQuota.isStorageUsageIndicatorAppear) { diff --git a/lib/features/quotas/presentation/widget/quotas_banner_widget.dart b/lib/features/quotas/presentation/widget/quotas_banner_widget.dart index bf9ef196a..cfc06ab36 100644 --- a/lib/features/quotas/presentation/widget/quotas_banner_widget.dart +++ b/lib/features/quotas/presentation/widget/quotas_banner_widget.dart @@ -18,7 +18,10 @@ class QuotasBannerWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Obx(() { - final octetQuota = _quotasController.octetsQuota.value; + final octetQuota = _quotasController + .mailboxDashBoardController + .octetsQuota + .value; if (octetQuota != null && octetQuota.allowedDisplayToQuotaBanner &&