TF-4045 Only show upgrade storage when premium is available and quota is available

This commit is contained in:
dab246
2025-10-01 17:55:22 +07:00
committed by Dat H. Pham
parent 2cc727c209
commit dcb19992c6
16 changed files with 184 additions and 97 deletions
@@ -114,7 +114,7 @@ class MailboxMenuRobot extends CoreRobot {
int getUsedQuota() {
final usedQuota =
getBinding<QuotasController>()?.octetsQuota.value?.used?.value.toInt();
getBinding<MailboxDashBoardController>()?.octetsQuota.value?.used?.value.toInt();
if (usedQuota == null) throw NullQuotaException();
return usedQuota;
@@ -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<QuotasController>()?.octetsQuota.value;
final quota = getBinding<MailboxDashBoardController>()?.octetsQuota.value;
final isQuotaViewDisplayed = quota?.storageAvailable ?? false;
final isPremiumAvailable = getBinding<MailboxDashBoardController>()
@@ -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();
}
@@ -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();
@@ -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<Quota>();
Map<Role, MailboxId> mapDefaultMailboxIdByRole = {};
Map<MailboxId, PresentationMailbox> mapMailboxById = {};
@@ -309,8 +309,7 @@ class MailboxDashBoardController extends ReloadableController
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;
int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete;
EmailSortOrderType currentSortOrder = SearchEmailFilter.defaultSortOrder;
PaywallUrlPattern? paywallUrlPattern;
bool isRetryGetPaywallUrl = false;
PaywallController? paywallController;
final StreamController<Either<Failure, Success>> _progressStateController =
StreamController<Either<Failure, Success>>.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();
}
}
@@ -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,
);
}
}
@@ -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() {
@@ -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<AccountId>();
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();
}
}
@@ -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<ManageAccountDashBoardController>();
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
@@ -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<StorageController> {
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();
}
})
],
),
),
@@ -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<GetPaywallUrlInteractor>();
@@ -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();
}
}
@@ -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> {
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);
}
@@ -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;
}
@@ -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<Quota>();
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() {
@@ -17,7 +17,7 @@ class QuotasView extends GetWidget<QuotasController> {
@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) {
@@ -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 &&