@greatapps/common 1.1.789 → 1.1.791
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/account/AccountHubLinkHandler.mjs +36 -0
- package/dist/components/account/AccountHubLinkHandler.mjs.map +1 -0
- package/dist/components/account/AccountModalLayout.mjs +137 -0
- package/dist/components/account/AccountModalLayout.mjs.map +1 -0
- package/dist/components/account/AccountModals.mjs +10 -3
- package/dist/components/account/AccountModals.mjs.map +1 -1
- package/dist/components/account/DeleteAccountModal.mjs +1 -1
- package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +8 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/MyAccountModal.mjs +167 -0
- package/dist/components/account/MyAccountModal.mjs.map +1 -0
- package/dist/components/account/TwoFactorAuthModal.mjs +1 -1
- package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/hooks/useAccountHubActions.mjs +85 -0
- package/dist/components/account/hooks/useAccountHubActions.mjs.map +1 -0
- package/dist/components/account/hooks/useAddCardWithPaymentSwitch.mjs +44 -0
- package/dist/components/account/hooks/useAddCardWithPaymentSwitch.mjs.map +1 -0
- package/dist/components/account/hooks/useAffiliatesActions.mjs +69 -0
- package/dist/components/account/hooks/useAffiliatesActions.mjs.map +1 -0
- package/dist/components/account/hooks/useMyAccountModal.mjs +27 -0
- package/dist/components/account/hooks/useMyAccountModal.mjs.map +1 -0
- package/dist/components/account/hooks/useProjectsActions.mjs +40 -0
- package/dist/components/account/hooks/useProjectsActions.mjs.map +1 -0
- package/dist/components/account/hooks/useSubscriptionActions.mjs +87 -0
- package/dist/components/account/hooks/useSubscriptionActions.mjs.map +1 -0
- package/dist/components/account/hooks/useTeamActions.mjs +31 -0
- package/dist/components/account/hooks/useTeamActions.mjs.map +1 -0
- package/dist/components/account/sections/AffiliatesSection.mjs +313 -0
- package/dist/components/account/sections/AffiliatesSection.mjs.map +1 -0
- package/dist/components/account/sections/ChangePasswordSection.mjs +5 -5
- package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
- package/dist/components/account/sections/MyProfileSection.mjs +194 -144
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/account/sections/PreferencesSection.mjs +60 -49
- package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
- package/dist/components/account/sections/ProjectsSection.mjs +77 -0
- package/dist/components/account/sections/ProjectsSection.mjs.map +1 -0
- package/dist/components/account/sections/SecuritySection.mjs +55 -36
- package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
- package/dist/components/account/sections/SubscriptionSection.mjs +29 -0
- package/dist/components/account/sections/SubscriptionSection.mjs.map +1 -0
- package/dist/components/account/sections/TeamSection.mjs +119 -0
- package/dist/components/account/sections/TeamSection.mjs.map +1 -0
- package/dist/components/account/sections/TokenSection.mjs +41 -43
- package/dist/components/account/sections/TokenSection.mjs.map +1 -1
- package/dist/components/account/sections/affiliates/AffiliateCommissionCard.mjs +73 -0
- package/dist/components/account/sections/affiliates/AffiliateCommissionCard.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/AffiliateFlows.mjs +20 -0
- package/dist/components/account/sections/affiliates/AffiliateFlows.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/AffiliateLeadsSheet.mjs +99 -0
- package/dist/components/account/sections/affiliates/AffiliateLeadsSheet.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/AffiliateStatsCard.mjs +31 -0
- package/dist/components/account/sections/affiliates/AffiliateStatsCard.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/AffiliateStepCard.mjs +15 -0
- package/dist/components/account/sections/affiliates/AffiliateStepCard.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/AffiliateTransactionsList.mjs +108 -0
- package/dist/components/account/sections/affiliates/AffiliateTransactionsList.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/NoReceivingAccountModal.mjs +49 -0
- package/dist/components/account/sections/affiliates/NoReceivingAccountModal.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs +182 -0
- package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs +476 -0
- package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/ViewAttachmentModal.mjs +34 -0
- package/dist/components/account/sections/affiliates/ViewAttachmentModal.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/reports/AffiliatesIndicatorsChart.mjs +27 -0
- package/dist/components/account/sections/affiliates/reports/AffiliatesIndicatorsChart.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/reports/AffiliatesReportsTab.mjs +30 -0
- package/dist/components/account/sections/affiliates/reports/AffiliatesReportsTab.mjs.map +1 -0
- package/dist/components/account/sections/affiliates/reports/useAffiliatesIndicatorsChart.mjs +120 -0
- package/dist/components/account/sections/affiliates/reports/useAffiliatesIndicatorsChart.mjs.map +1 -0
- package/dist/components/account/sections/projects/DeleteProjectModal.mjs +205 -0
- package/dist/components/account/sections/projects/DeleteProjectModal.mjs.map +1 -0
- package/dist/components/account/sections/projects/ProjectFlows.mjs +16 -0
- package/dist/components/account/sections/projects/ProjectFlows.mjs.map +1 -0
- package/dist/components/account/sections/projects/ProjectMembersStack.mjs +53 -0
- package/dist/components/account/sections/projects/ProjectMembersStack.mjs.map +1 -0
- package/dist/components/account/sections/projects/ProjectRow.mjs +85 -0
- package/dist/components/account/sections/projects/ProjectRow.mjs.map +1 -0
- package/dist/components/account/sections/projects/ProjectSheet.mjs +499 -0
- package/dist/components/account/sections/projects/ProjectSheet.mjs.map +1 -0
- package/dist/components/account/sections/projects/ProjectsDisabledModal.mjs +55 -0
- package/dist/components/account/sections/projects/ProjectsDisabledModal.mjs.map +1 -0
- package/dist/components/account/sections/projects/project-form.schema.mjs +28 -0
- package/dist/components/account/sections/projects/project-form.schema.mjs.map +1 -0
- package/dist/components/account/sections/shared/ConnectListRow.mjs +45 -0
- package/dist/components/account/sections/shared/ConnectListRow.mjs.map +1 -0
- package/dist/components/account/sections/shared/DateFilterPopover.mjs +51 -0
- package/dist/components/account/sections/shared/DateFilterPopover.mjs.map +1 -0
- package/dist/components/account/sections/shared/EntityAvatar.mjs +41 -0
- package/dist/components/account/sections/shared/EntityAvatar.mjs.map +1 -0
- package/dist/components/account/sections/shared/FilterPopover.mjs +62 -0
- package/dist/components/account/sections/shared/FilterPopover.mjs.map +1 -0
- package/dist/components/account/sections/shared/FormSection.mjs +14 -0
- package/dist/components/account/sections/shared/FormSection.mjs.map +1 -0
- package/dist/components/account/sections/shared/IconBox.mjs +18 -0
- package/dist/components/account/sections/shared/IconBox.mjs.map +1 -0
- package/dist/components/account/sections/shared/InfiniteScrollList.mjs +36 -0
- package/dist/components/account/sections/shared/InfiniteScrollList.mjs.map +1 -0
- package/dist/components/account/sections/shared/ListPagination.mjs +69 -0
- package/dist/components/account/sections/shared/ListPagination.mjs.map +1 -0
- package/dist/components/account/sections/shared/RowActionsMenu.mjs +52 -0
- package/dist/components/account/sections/shared/RowActionsMenu.mjs.map +1 -0
- package/dist/components/account/sections/shared/SectionLoadError.mjs +20 -0
- package/dist/components/account/sections/shared/SectionLoadError.mjs.map +1 -0
- package/dist/components/account/sections/shared/StatusBadge.mjs +26 -0
- package/dist/components/account/sections/shared/StatusBadge.mjs.map +1 -0
- package/dist/components/account/sections/shared/WorkspaceSection.mjs +10 -0
- package/dist/components/account/sections/shared/WorkspaceSection.mjs.map +1 -0
- package/dist/components/account/sections/subscription/AiCreditsUsage.mjs +106 -0
- package/dist/components/account/sections/subscription/AiCreditsUsage.mjs.map +1 -0
- package/dist/components/account/sections/subscription/BillingAddressSheet.mjs +407 -0
- package/dist/components/account/sections/subscription/BillingAddressSheet.mjs.map +1 -0
- package/dist/components/account/sections/subscription/BoletoDetailsDialog.mjs +73 -0
- package/dist/components/account/sections/subscription/BoletoDetailsDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/BoletoGeneratedDialog.mjs +22 -0
- package/dist/components/account/sections/subscription/BoletoGeneratedDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/CancelPlanDialog.mjs +161 -0
- package/dist/components/account/sections/subscription/CancelPlanDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/ChargeRow.mjs +127 -0
- package/dist/components/account/sections/subscription/ChargeRow.mjs.map +1 -0
- package/dist/components/account/sections/subscription/ChargeStatusBadge.mjs +27 -0
- package/dist/components/account/sections/subscription/ChargeStatusBadge.mjs.map +1 -0
- package/dist/components/account/sections/subscription/ChargesList.mjs +88 -0
- package/dist/components/account/sections/subscription/ChargesList.mjs.map +1 -0
- package/dist/components/account/sections/subscription/ManageCardsSheet.mjs +49 -0
- package/dist/components/account/sections/subscription/ManageCardsSheet.mjs.map +1 -0
- package/dist/components/account/sections/subscription/OverdueReceiptOpener.mjs +26 -0
- package/dist/components/account/sections/subscription/OverdueReceiptOpener.mjs.map +1 -0
- package/dist/components/account/sections/subscription/PayChargeDialog.mjs +222 -0
- package/dist/components/account/sections/subscription/PayChargeDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/PaymentConfirmationDialog.mjs +61 -0
- package/dist/components/account/sections/subscription/PaymentConfirmationDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/PaymentMethodsCard.mjs +72 -0
- package/dist/components/account/sections/subscription/PaymentMethodsCard.mjs.map +1 -0
- package/dist/components/account/sections/subscription/PendingChangeDialog.mjs +117 -0
- package/dist/components/account/sections/subscription/PendingChangeDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/PixDetailsDialog.mjs +165 -0
- package/dist/components/account/sections/subscription/PixDetailsDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/PixPaymentDialog.mjs +155 -0
- package/dist/components/account/sections/subscription/PixPaymentDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/PlanDetailsSheet.mjs +253 -0
- package/dist/components/account/sections/subscription/PlanDetailsSheet.mjs.map +1 -0
- package/dist/components/account/sections/subscription/ReceiptDetailsSheet.mjs +237 -0
- package/dist/components/account/sections/subscription/ReceiptDetailsSheet.mjs.map +1 -0
- package/dist/components/account/sections/subscription/SubscriptionFlows.mjs +40 -0
- package/dist/components/account/sections/subscription/SubscriptionFlows.mjs.map +1 -0
- package/dist/components/account/sections/subscription/SubscriptionPlanCard.mjs +303 -0
- package/dist/components/account/sections/subscription/SubscriptionPlanCard.mjs.map +1 -0
- package/dist/components/account/sections/subscription/UsageReportSheet.mjs +163 -0
- package/dist/components/account/sections/subscription/UsageReportSheet.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/ChangePlanSheet.mjs +75 -0
- package/dist/components/account/sections/subscription/change-plan/ChangePlanSheet.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/components/AbTestDetailsDialog.mjs +55 -0
- package/dist/components/account/sections/subscription/change-plan/components/AbTestDetailsDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/components/AddonsBlock.mjs +188 -0
- package/dist/components/account/sections/subscription/change-plan/components/AddonsBlock.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/components/AlternativeBucketsSection.mjs +66 -0
- package/dist/components/account/sections/subscription/change-plan/components/AlternativeBucketsSection.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/components/CouponBlock.mjs +42 -0
- package/dist/components/account/sections/subscription/change-plan/components/CouponBlock.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/components/CouponDialog.mjs +119 -0
- package/dist/components/account/sections/subscription/change-plan/components/CouponDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/components/PricePreview.mjs +17 -0
- package/dist/components/account/sections/subscription/change-plan/components/PricePreview.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/components/SummaryBlock.mjs +130 -0
- package/dist/components/account/sections/subscription/change-plan/components/SummaryBlock.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/plan-comparison.mjs +38 -0
- package/dist/components/account/sections/subscription/change-plan/plan-comparison.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/steps/PaymentSummaryStep.mjs +127 -0
- package/dist/components/account/sections/subscription/change-plan/steps/PaymentSummaryStep.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/steps/PlanComparisonStep.mjs +111 -0
- package/dist/components/account/sections/subscription/change-plan/steps/PlanComparisonStep.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/steps/PlanViewStep.mjs +69 -0
- package/dist/components/account/sections/subscription/change-plan/steps/PlanViewStep.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/steps/ReactivationConfigStep.mjs +88 -0
- package/dist/components/account/sections/subscription/change-plan/steps/ReactivationConfigStep.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/steps/ReactivationPaymentStep.mjs +115 -0
- package/dist/components/account/sections/subscription/change-plan/steps/ReactivationPaymentStep.mjs.map +1 -0
- package/dist/components/account/sections/subscription/change-plan/useChangePlanState.mjs +918 -0
- package/dist/components/account/sections/subscription/change-plan/useChangePlanState.mjs.map +1 -0
- package/dist/components/account/sections/subscription/downgrade/CannotDowngradeDialog.mjs +216 -0
- package/dist/components/account/sections/subscription/downgrade/CannotDowngradeDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/downgrade/DowngradeReasonDialog.mjs +128 -0
- package/dist/components/account/sections/subscription/downgrade/DowngradeReasonDialog.mjs.map +1 -0
- package/dist/components/account/sections/subscription/plans/PlanCard.mjs +281 -0
- package/dist/components/account/sections/subscription/plans/PlanCard.mjs.map +1 -0
- package/dist/components/account/sections/subscription/plans/PlanCardSkeleton.mjs +53 -0
- package/dist/components/account/sections/subscription/plans/PlanCardSkeleton.mjs.map +1 -0
- package/dist/components/account/sections/subscription/plans/PlansCatalogDialog.mjs +119 -0
- package/dist/components/account/sections/subscription/plans/PlansCatalogDialog.mjs.map +1 -0
- package/dist/components/account/sections/team/DeleteUserModal.mjs +116 -0
- package/dist/components/account/sections/team/DeleteUserModal.mjs.map +1 -0
- package/dist/components/account/sections/team/TeamFlows.mjs +14 -0
- package/dist/components/account/sections/team/TeamFlows.mjs.map +1 -0
- package/dist/components/account/sections/team/TeamMemberRow.mjs +99 -0
- package/dist/components/account/sections/team/TeamMemberRow.mjs.map +1 -0
- package/dist/components/account/sections/team/UserSheet.mjs +570 -0
- package/dist/components/account/sections/team/UserSheet.mjs.map +1 -0
- package/dist/components/account/sections/team/steps/NotificationsStep.mjs +80 -0
- package/dist/components/account/sections/team/steps/NotificationsStep.mjs.map +1 -0
- package/dist/components/account/sections/team/steps/ProjectSelectionStep.mjs +180 -0
- package/dist/components/account/sections/team/steps/ProjectSelectionStep.mjs.map +1 -0
- package/dist/components/account/sections/team/steps/UserInformationStep.mjs +371 -0
- package/dist/components/account/sections/team/steps/UserInformationStep.mjs.map +1 -0
- package/dist/components/account/sections/team/user-form.schema.mjs +37 -0
- package/dist/components/account/sections/team/user-form.schema.mjs.map +1 -0
- package/dist/components/account/types/workspace-actions.type.mjs +1 -0
- package/dist/components/account/types/workspace-actions.type.mjs.map +1 -0
- package/dist/components/layouts/ProfilePopover.mjs +10 -12
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs +7 -4
- package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
- package/dist/components/modals/AccountDeletionWarningModal.mjs +4 -5
- package/dist/components/modals/AccountDeletionWarningModal.mjs.map +1 -1
- package/dist/components/modals/AccountFrozenModal.mjs +6 -3
- package/dist/components/modals/AccountFrozenModal.mjs.map +1 -1
- package/dist/components/modals/Modals.mjs +3 -3
- package/dist/components/modals/Modals.mjs.map +1 -1
- package/dist/components/modals/PaidPlanRequiredModal.mjs +4 -5
- package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
- package/dist/components/modals/cards/AddFirstCardWarningModal.mjs +63 -0
- package/dist/components/modals/cards/AddFirstCardWarningModal.mjs.map +1 -0
- package/dist/components/modals/cards/SwitchPaymentToCardModal.mjs +187 -0
- package/dist/components/modals/cards/SwitchPaymentToCardModal.mjs.map +1 -0
- package/dist/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.mjs +5 -4
- package/dist/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.mjs.map +1 -1
- package/dist/components/ui/data-display/CardItem.mjs +9 -1
- package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
- package/dist/components/ui/data-display/PaymentMethodIcons.mjs +50 -0
- package/dist/components/ui/data-display/PaymentMethodIcons.mjs.map +1 -0
- package/dist/components/ui/form/BillingPeriodSelector.mjs +108 -0
- package/dist/components/ui/form/BillingPeriodSelector.mjs.map +1 -0
- package/dist/components/ui/form/PaymentMethodToggle.mjs +82 -0
- package/dist/components/ui/form/PaymentMethodToggle.mjs.map +1 -0
- package/dist/components/ui/form/RadioOptionFieldIcon.mjs +57 -0
- package/dist/components/ui/form/RadioOptionFieldIcon.mjs.map +1 -0
- package/dist/components/ui/form/SegmentedControl.mjs +56 -0
- package/dist/components/ui/form/SegmentedControl.mjs.map +1 -0
- package/dist/components/ui/overlay/Dialog.mjs +41 -6
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
- package/dist/components/ui/overlay/Sheet.mjs +43 -13
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
- package/dist/components/ui/overlay/layers.mjs +72 -26
- package/dist/components/ui/overlay/layers.mjs.map +1 -1
- package/dist/enums/AccountHubFlow.mjs +13 -0
- package/dist/enums/AccountHubFlow.mjs.map +1 -0
- package/dist/enums/DateFilterPeriod.mjs +22 -0
- package/dist/enums/DateFilterPeriod.mjs.map +1 -0
- package/dist/enums/WorkspaceSectionType.mjs +11 -0
- package/dist/enums/WorkspaceSectionType.mjs.map +1 -0
- package/dist/handlers.mjs +24 -0
- package/dist/handlers.mjs.map +1 -1
- package/dist/hooks/useDebounce.mjs +5 -3
- package/dist/hooks/useDebounce.mjs.map +1 -1
- package/dist/hooks/useUploadProgress.mjs +33 -0
- package/dist/hooks/useUploadProgress.mjs.map +1 -0
- package/dist/i18n/messages/en-us.mjs +863 -3
- package/dist/i18n/messages/en-us.mjs.map +1 -1
- package/dist/i18n/messages/es-es.mjs +863 -3
- package/dist/i18n/messages/es-es.mjs.map +1 -1
- package/dist/i18n/messages/pt-br.mjs +863 -3
- package/dist/i18n/messages/pt-br.mjs.map +1 -1
- package/dist/index.mjs +87 -7
- package/dist/index.mjs.map +1 -1
- package/dist/infra/http/paged.mjs +20 -0
- package/dist/infra/http/paged.mjs.map +1 -0
- package/dist/middleware.mjs +2 -0
- package/dist/middleware.mjs.map +1 -1
- package/dist/middlewares/create-auth-middleware.mjs +1 -3
- package/dist/middlewares/create-auth-middleware.mjs.map +1 -1
- package/dist/middlewares/create-legacy-account-routes-middleware.mjs +44 -0
- package/dist/middlewares/create-legacy-account-routes-middleware.mjs.map +1 -0
- package/dist/middlewares/is-route-equals.mjs +7 -0
- package/dist/middlewares/is-route-equals.mjs.map +1 -0
- package/dist/modules/accounts/actions/account-management.action.mjs +20 -1
- package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
- package/dist/modules/accounts/constants/account-hub-link.constants.mjs +9 -0
- package/dist/modules/accounts/constants/account-hub-link.constants.mjs.map +1 -0
- package/dist/modules/accounts/constants/legacy-account-routes.constants.mjs +5 -0
- package/dist/modules/accounts/constants/legacy-account-routes.constants.mjs.map +1 -0
- package/dist/modules/accounts/handlers/list-account-members.handler.mjs +22 -0
- package/dist/modules/accounts/handlers/list-account-members.handler.mjs.map +1 -0
- package/dist/modules/accounts/hooks/add-user-projects.hook.mjs +51 -0
- package/dist/modules/accounts/hooks/add-user-projects.hook.mjs.map +1 -0
- package/dist/modules/accounts/hooks/create-account-user.hook.mjs +20 -0
- package/dist/modules/accounts/hooks/create-account-user.hook.mjs.map +1 -0
- package/dist/modules/accounts/hooks/remove-user-projects.hook.mjs +47 -0
- package/dist/modules/accounts/hooks/remove-user-projects.hook.mjs.map +1 -0
- package/dist/modules/accounts/hooks/use-account-members.hook.mjs +20 -0
- package/dist/modules/accounts/hooks/use-account-members.hook.mjs.map +1 -0
- package/dist/modules/accounts/services/account.service.mjs +59 -0
- package/dist/modules/accounts/services/account.service.mjs.map +1 -1
- package/dist/modules/accounts/types/account-hub-link.type.mjs +1 -0
- package/dist/modules/accounts/types/account-hub-link.type.mjs.map +1 -0
- package/dist/modules/accounts/utils/build-account-hub-url.mjs +16 -0
- package/dist/modules/accounts/utils/build-account-hub-url.mjs.map +1 -0
- package/dist/modules/accounts/utils/is-account-hub-flow.mjs +9 -0
- package/dist/modules/accounts/utils/is-account-hub-flow.mjs.map +1 -0
- package/dist/modules/accounts/utils/is-account-section.mjs +9 -0
- package/dist/modules/accounts/utils/is-account-section.mjs.map +1 -0
- package/dist/modules/accounts/utils/is-my-account-section.mjs +13 -0
- package/dist/modules/accounts/utils/is-my-account-section.mjs.map +1 -0
- package/dist/modules/accounts/utils/map-legacy-account-route.mjs +93 -0
- package/dist/modules/accounts/utils/map-legacy-account-route.mjs.map +1 -0
- package/dist/modules/accounts/utils/parse-account-hub-link.mjs +20 -0
- package/dist/modules/accounts/utils/parse-account-hub-link.mjs.map +1 -0
- package/dist/modules/affiliates/actions/ensure-affiliate.action.mjs +10 -0
- package/dist/modules/affiliates/actions/ensure-affiliate.action.mjs.map +1 -0
- package/dist/modules/affiliates/actions/request-deposit.action.mjs +10 -0
- package/dist/modules/affiliates/actions/request-deposit.action.mjs.map +1 -0
- package/dist/modules/affiliates/actions/update-affiliate.action.mjs +10 -0
- package/dist/modules/affiliates/actions/update-affiliate.action.mjs.map +1 -0
- package/dist/modules/affiliates/constants/affiliate.constants.mjs +11 -0
- package/dist/modules/affiliates/constants/affiliate.constants.mjs.map +1 -0
- package/dist/modules/affiliates/constants/query-keys.constants.mjs +15 -0
- package/dist/modules/affiliates/constants/query-keys.constants.mjs.map +1 -0
- package/dist/modules/affiliates/handlers/affiliate-report-analytics.handler.mjs +16 -0
- package/dist/modules/affiliates/handlers/affiliate-report-analytics.handler.mjs.map +1 -0
- package/dist/modules/affiliates/handlers/affiliate-withdrawal-limits.handler.mjs +12 -0
- package/dist/modules/affiliates/handlers/affiliate-withdrawal-limits.handler.mjs.map +1 -0
- package/dist/modules/affiliates/handlers/current-affiliate.handler.mjs +12 -0
- package/dist/modules/affiliates/handlers/current-affiliate.handler.mjs.map +1 -0
- package/dist/modules/affiliates/handlers/list-affiliate-coupons.handler.mjs +12 -0
- package/dist/modules/affiliates/handlers/list-affiliate-coupons.handler.mjs.map +1 -0
- package/dist/modules/affiliates/handlers/list-affiliate-leads.handler.mjs +22 -0
- package/dist/modules/affiliates/handlers/list-affiliate-leads.handler.mjs.map +1 -0
- package/dist/modules/affiliates/handlers/list-affiliate-transactions.handler.mjs +22 -0
- package/dist/modules/affiliates/handlers/list-affiliate-transactions.handler.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-affiliate-coupons.hook.mjs +17 -0
- package/dist/modules/affiliates/hooks/use-affiliate-coupons.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-affiliate-leads.hook.mjs +22 -0
- package/dist/modules/affiliates/hooks/use-affiliate-leads.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-affiliate-report-analytics.hook.mjs +17 -0
- package/dist/modules/affiliates/hooks/use-affiliate-report-analytics.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-affiliate-transactions.hook.mjs +20 -0
- package/dist/modules/affiliates/hooks/use-affiliate-transactions.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-current-affiliate.hook.mjs +17 -0
- package/dist/modules/affiliates/hooks/use-current-affiliate.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-ensure-affiliate.hook.mjs +23 -0
- package/dist/modules/affiliates/hooks/use-ensure-affiliate.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-request-deposit.hook.mjs +28 -0
- package/dist/modules/affiliates/hooks/use-request-deposit.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-update-affiliate.hook.mjs +22 -0
- package/dist/modules/affiliates/hooks/use-update-affiliate.hook.mjs.map +1 -0
- package/dist/modules/affiliates/hooks/use-withdrawal-limits.hook.mjs +17 -0
- package/dist/modules/affiliates/hooks/use-withdrawal-limits.hook.mjs.map +1 -0
- package/dist/modules/affiliates/services/affiliates.service.mjs +183 -0
- package/dist/modules/affiliates/services/affiliates.service.mjs.map +1 -0
- package/dist/modules/affiliates/types/affiliate.type.mjs +100 -0
- package/dist/modules/affiliates/types/affiliate.type.mjs.map +1 -0
- package/dist/modules/affiliates/utils/get-affiliate-share-link.mjs +9 -0
- package/dist/modules/affiliates/utils/get-affiliate-share-link.mjs.map +1 -0
- package/dist/modules/charges/actions/get-nota-fiscal.action.mjs +10 -0
- package/dist/modules/charges/actions/get-nota-fiscal.action.mjs.map +1 -0
- package/dist/modules/charges/actions/refresh-pix.action.mjs +10 -0
- package/dist/modules/charges/actions/refresh-pix.action.mjs.map +1 -0
- package/dist/modules/charges/hooks/nota-fiscal.hook.mjs +13 -0
- package/dist/modules/charges/hooks/nota-fiscal.hook.mjs.map +1 -0
- package/dist/modules/charges/hooks/refresh-pix.hook.mjs +13 -0
- package/dist/modules/charges/hooks/refresh-pix.hook.mjs.map +1 -0
- package/dist/modules/charges/services/charges.service.mjs +67 -0
- package/dist/modules/charges/services/charges.service.mjs.map +1 -1
- package/dist/modules/charges/types/nota-fiscal.type.mjs +1 -0
- package/dist/modules/charges/types/nota-fiscal.type.mjs.map +1 -0
- package/dist/modules/charges/types/refresh-pix.type.mjs +1 -0
- package/dist/modules/charges/types/refresh-pix.type.mjs.map +1 -0
- package/dist/modules/charges/utils/get-charge-download-url.mjs +8 -0
- package/dist/modules/charges/utils/get-charge-download-url.mjs.map +1 -0
- package/dist/modules/coupons/constants/query-keys.constants.mjs +5 -0
- package/dist/modules/coupons/constants/query-keys.constants.mjs.map +1 -0
- package/dist/modules/coupons/handlers/find-coupon-by-code.handler.mjs +17 -0
- package/dist/modules/coupons/handlers/find-coupon-by-code.handler.mjs.map +1 -0
- package/dist/modules/coupons/handlers/find-coupon-by-id.handler.mjs +16 -0
- package/dist/modules/coupons/handlers/find-coupon-by-id.handler.mjs.map +1 -0
- package/dist/modules/coupons/hooks/use-coupon-by-code.hook.mjs +15 -0
- package/dist/modules/coupons/hooks/use-coupon-by-code.hook.mjs.map +1 -0
- package/dist/modules/coupons/hooks/use-coupon-by-id.hook.mjs +18 -0
- package/dist/modules/coupons/hooks/use-coupon-by-id.hook.mjs.map +1 -0
- package/dist/modules/coupons/services/coupons.service.mjs +44 -0
- package/dist/modules/coupons/services/coupons.service.mjs.map +1 -0
- package/dist/modules/coupons/types/coupon.type.mjs +61 -0
- package/dist/modules/coupons/types/coupon.type.mjs.map +1 -0
- package/dist/modules/coupons/utils/coupon-restrictions.mjs +60 -0
- package/dist/modules/coupons/utils/coupon-restrictions.mjs.map +1 -0
- package/dist/modules/domains/handlers/count-domains.handler.mjs +12 -0
- package/dist/modules/domains/handlers/count-domains.handler.mjs.map +1 -0
- package/dist/modules/domains/hooks/count-domains.hook.mjs +17 -0
- package/dist/modules/domains/hooks/count-domains.hook.mjs.map +1 -0
- package/dist/modules/domains/services/domains.service.mjs +18 -0
- package/dist/modules/domains/services/domains.service.mjs.map +1 -0
- package/dist/modules/ia-credits/handlers/list-ia-credit-operations.handler.mjs +15 -0
- package/dist/modules/ia-credits/handlers/list-ia-credit-operations.handler.mjs.map +1 -0
- package/dist/modules/ia-credits/hooks/ia-credit-operations.hook.mjs +28 -0
- package/dist/modules/ia-credits/hooks/ia-credit-operations.hook.mjs.map +1 -0
- package/dist/modules/ia-credits/services/ia-credits.service.mjs +23 -2
- package/dist/modules/ia-credits/services/ia-credits.service.mjs.map +1 -1
- package/dist/modules/pages/handlers/count-pages.handler.mjs +4 -2
- package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -1
- package/dist/modules/pages/hooks/count-published-pages.hook.mjs +26 -0
- package/dist/modules/pages/hooks/count-published-pages.hook.mjs.map +1 -0
- package/dist/modules/pages/services/pages.service.mjs +3 -2
- package/dist/modules/pages/services/pages.service.mjs.map +1 -1
- package/dist/modules/plans/constants/plan-tooltips.constants.mjs +14 -0
- package/dist/modules/plans/constants/plan-tooltips.constants.mjs.map +1 -0
- package/dist/modules/plans/hooks/use-enriched-plans.hook.mjs +28 -0
- package/dist/modules/plans/hooks/use-enriched-plans.hook.mjs.map +1 -0
- package/dist/modules/plans/hooks/use-ui-plans.hook.mjs +20 -0
- package/dist/modules/plans/hooks/use-ui-plans.hook.mjs.map +1 -0
- package/dist/modules/projects/hooks/add-project-users.hook.mjs +25 -0
- package/dist/modules/projects/hooks/add-project-users.hook.mjs.map +1 -0
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs +3 -6
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-available-users.hook.mjs +3 -6
- package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs +3 -6
- package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-project-users.hook.mjs +3 -6
- package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/remove-project-users.hook.mjs +25 -0
- package/dist/modules/projects/hooks/remove-project-users.hook.mjs.map +1 -0
- package/dist/modules/projects/services/project-users.service.mjs +5 -0
- package/dist/modules/projects/services/project-users.service.mjs.map +1 -1
- package/dist/modules/projects/types.mjs +3 -2
- package/dist/modules/projects/types.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/cancel-subscription.action.mjs +10 -0
- package/dist/modules/subscriptions/actions/cancel-subscription.action.mjs.map +1 -0
- package/dist/modules/subscriptions/actions/create-subscription.action.mjs +10 -0
- package/dist/modules/subscriptions/actions/create-subscription.action.mjs.map +1 -0
- package/dist/modules/subscriptions/actions/find-pending-pix-status.action.mjs +10 -0
- package/dist/modules/subscriptions/actions/find-pending-pix-status.action.mjs.map +1 -0
- package/dist/modules/subscriptions/actions/find-subscription-by-id.action.mjs +10 -0
- package/dist/modules/subscriptions/actions/find-subscription-by-id.action.mjs.map +1 -0
- package/dist/modules/subscriptions/constants/addons.constants.mjs +35 -0
- package/dist/modules/subscriptions/constants/addons.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/constants/downgrade.constants.mjs +25 -0
- package/dist/modules/subscriptions/constants/downgrade.constants.mjs.map +1 -0
- package/dist/modules/subscriptions/constants/subscription.constants.mjs +2 -0
- package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/handlers/pending-pix-status.handler.mjs +15 -0
- package/dist/modules/subscriptions/handlers/pending-pix-status.handler.mjs.map +1 -0
- package/dist/modules/subscriptions/hooks/cancel-subscription.hook.mjs +25 -0
- package/dist/modules/subscriptions/hooks/cancel-subscription.hook.mjs.map +1 -0
- package/dist/modules/subscriptions/hooks/create-subscription.hook.mjs +33 -0
- package/dist/modules/subscriptions/hooks/create-subscription.hook.mjs.map +1 -0
- package/dist/modules/subscriptions/hooks/find-subscription-by-id.hook.mjs +18 -0
- package/dist/modules/subscriptions/hooks/find-subscription-by-id.hook.mjs.map +1 -0
- package/dist/modules/subscriptions/hooks/pending-pix-status.hook.mjs +25 -0
- package/dist/modules/subscriptions/hooks/pending-pix-status.hook.mjs.map +1 -0
- package/dist/modules/subscriptions/services/subscriptions.service.mjs +71 -0
- package/dist/modules/subscriptions/services/subscriptions.service.mjs.map +1 -1
- package/dist/modules/subscriptions/types/cancel-subscription.type.mjs +9 -0
- package/dist/modules/subscriptions/types/cancel-subscription.type.mjs.map +1 -0
- package/dist/modules/subscriptions/types/create-subscription.type.mjs +62 -0
- package/dist/modules/subscriptions/types/create-subscription.type.mjs.map +1 -0
- package/dist/modules/subscriptions/types/pending-pix-status.type.mjs +28 -0
- package/dist/modules/subscriptions/types/pending-pix-status.type.mjs.map +1 -0
- package/dist/modules/subscriptions/types/subscription.type.mjs +9 -1
- package/dist/modules/subscriptions/types/subscription.type.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/addon-buckets.mjs +69 -0
- package/dist/modules/subscriptions/utils/addon-buckets.mjs.map +1 -0
- package/dist/modules/subscriptions/utils/confirm-payment-if-required.mjs +8 -2
- package/dist/modules/subscriptions/utils/confirm-payment-if-required.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/first-period-pricing.mjs +25 -0
- package/dist/modules/subscriptions/utils/first-period-pricing.mjs.map +1 -0
- package/dist/modules/subscriptions/utils/is-api-subscription.mjs +8 -0
- package/dist/modules/subscriptions/utils/is-api-subscription.mjs.map +1 -0
- package/dist/modules/subscriptions/utils/is-boleto-payer.mjs +17 -0
- package/dist/modules/subscriptions/utils/is-boleto-payer.mjs.map +1 -0
- package/dist/modules/subscriptions/utils/is-free-subscription.mjs +8 -0
- package/dist/modules/subscriptions/utils/is-free-subscription.mjs.map +1 -0
- package/dist/modules/subscriptions/utils/periodicity.mjs +55 -1
- package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/resolve-subscription-plan-name.mjs +27 -0
- package/dist/modules/subscriptions/utils/resolve-subscription-plan-name.mjs.map +1 -0
- package/dist/modules/users/hooks/messages.hook.mjs +3 -5
- package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
- package/dist/server.mjs +6 -0
- package/dist/server.mjs.map +1 -1
- package/dist/store/useAccountModals.mjs +9 -2
- package/dist/store/useAccountModals.mjs.map +1 -1
- package/dist/store/useAffiliateFlows.mjs +23 -0
- package/dist/store/useAffiliateFlows.mjs.map +1 -0
- package/dist/store/useProjectFlows.mjs +18 -0
- package/dist/store/useProjectFlows.mjs.map +1 -0
- package/dist/store/useSubscriptionFlows.mjs +58 -0
- package/dist/store/useSubscriptionFlows.mjs.map +1 -0
- package/dist/store/useTeamFlows.mjs +15 -0
- package/dist/store/useTeamFlows.mjs.map +1 -0
- package/dist/testing/factories/coupon.factory.mjs +19 -0
- package/dist/testing/factories/coupon.factory.mjs.map +1 -0
- package/dist/testing/factories/index.mjs +6 -0
- package/dist/testing/factories/index.mjs.map +1 -1
- package/dist/testing/factories/project-user.factory.mjs +17 -0
- package/dist/testing/factories/project-user.factory.mjs.map +1 -0
- package/dist/testing/factories/project.factory.mjs +21 -0
- package/dist/testing/factories/project.factory.mjs.map +1 -0
- package/dist/testing/react/providers.mjs +1 -1
- package/dist/testing/react/providers.mjs.map +1 -1
- package/dist/utils/browser/chart-custom-tooltip.mjs +69 -0
- package/dist/utils/browser/chart-custom-tooltip.mjs.map +1 -0
- package/dist/utils/browser/get-css-variable.mjs +9 -0
- package/dist/utils/browser/get-css-variable.mjs.map +1 -0
- package/dist/utils/constants/scrollbar.mjs +5 -0
- package/dist/utils/constants/scrollbar.mjs.map +1 -0
- package/dist/utils/date-filter-period.mjs +34 -0
- package/dist/utils/date-filter-period.mjs.map +1 -0
- package/dist/utils/file/index.mjs +11 -1
- package/dist/utils/file/index.mjs.map +1 -1
- package/dist/utils/format/initials.mjs +8 -0
- package/dist/utils/format/initials.mjs.map +1 -0
- package/dist/utils/format/masks.mjs +32 -1
- package/dist/utils/format/masks.mjs.map +1 -1
- package/dist/utils/qrcode/to-data-url.mjs +12 -0
- package/dist/utils/qrcode/to-data-url.mjs.map +1 -0
- package/dist/utils/validators/account.mjs +1 -7
- package/dist/utils/validators/account.mjs.map +1 -1
- package/package.json +20 -8
- package/src/components/account/AccountHubLinkHandler.tsx +39 -0
- package/src/components/account/AccountModalLayout.tsx +190 -0
- package/src/components/account/AccountModals.tsx +12 -2
- package/src/components/account/DeleteAccountModal.tsx +1 -1
- package/src/components/account/IsntPossibleDeleteAccountModal.tsx +9 -1
- package/src/components/account/MyAccountModal.tsx +215 -0
- package/src/components/account/TwoFactorAuthModal.tsx +1 -1
- package/src/components/account/hooks/useAccountHubActions.ts +95 -0
- package/src/components/account/hooks/useAddCardWithPaymentSwitch.ts +70 -0
- package/src/components/account/hooks/useAffiliatesActions.tsx +78 -0
- package/src/components/account/hooks/useMyAccountModal.ts +40 -0
- package/src/components/account/hooks/useProjectsActions.ts +44 -0
- package/src/components/account/hooks/useSubscriptionActions.ts +99 -0
- package/src/components/account/hooks/useTeamActions.ts +35 -0
- package/src/components/account/sections/AffiliatesSection.tsx +342 -0
- package/src/components/account/sections/ChangePasswordSection.tsx +6 -10
- package/src/components/account/sections/MyProfileSection.tsx +207 -143
- package/src/components/account/sections/PreferencesSection.tsx +55 -51
- package/src/components/account/sections/ProjectsSection.tsx +110 -0
- package/src/components/account/sections/SecuritySection.tsx +72 -62
- package/src/components/account/sections/SubscriptionSection.tsx +36 -0
- package/src/components/account/sections/TeamSection.tsx +161 -0
- package/src/components/account/sections/TokenSection.tsx +4 -8
- package/src/components/account/sections/affiliates/AffiliateCommissionCard.tsx +83 -0
- package/src/components/account/sections/affiliates/AffiliateFlows.tsx +20 -0
- package/src/components/account/sections/affiliates/AffiliateLeadsSheet.tsx +143 -0
- package/src/components/account/sections/affiliates/AffiliateStatsCard.tsx +56 -0
- package/src/components/account/sections/affiliates/AffiliateStepCard.tsx +20 -0
- package/src/components/account/sections/affiliates/AffiliateTransactionsList.tsx +194 -0
- package/src/components/account/sections/affiliates/NoReceivingAccountModal.tsx +63 -0
- package/src/components/account/sections/affiliates/ReceivingAccountModal.tsx +213 -0
- package/src/components/account/sections/affiliates/RequestWithdrawalSheet.tsx +586 -0
- package/src/components/account/sections/affiliates/ViewAttachmentModal.tsx +47 -0
- package/src/components/account/sections/affiliates/reports/AffiliatesIndicatorsChart.tsx +45 -0
- package/src/components/account/sections/affiliates/reports/AffiliatesReportsTab.tsx +44 -0
- package/src/components/account/sections/affiliates/reports/useAffiliatesIndicatorsChart.ts +148 -0
- package/src/components/account/sections/projects/DeleteProjectModal.tsx +246 -0
- package/src/components/account/sections/projects/ProjectFlows.tsx +16 -0
- package/src/components/account/sections/projects/ProjectMembersStack.tsx +75 -0
- package/src/components/account/sections/projects/ProjectRow.tsx +96 -0
- package/src/components/account/sections/projects/ProjectSheet.tsx +603 -0
- package/src/components/account/sections/projects/ProjectsDisabledModal.tsx +69 -0
- package/src/components/account/sections/projects/project-form.schema.ts +30 -0
- package/src/components/account/sections/shared/ConnectListRow.tsx +68 -0
- package/src/components/account/sections/shared/DateFilterPopover.tsx +58 -0
- package/src/components/account/sections/shared/EntityAvatar.tsx +54 -0
- package/src/components/account/sections/shared/FilterPopover.tsx +79 -0
- package/src/components/account/sections/shared/FormSection.tsx +23 -0
- package/src/components/account/sections/shared/IconBox.tsx +21 -0
- package/src/components/account/sections/shared/InfiniteScrollList.tsx +57 -0
- package/src/components/account/sections/shared/ListPagination.tsx +84 -0
- package/src/components/account/sections/shared/RowActionsMenu.tsx +66 -0
- package/src/components/account/sections/shared/SectionLoadError.tsx +27 -0
- package/src/components/account/sections/shared/StatusBadge.tsx +33 -0
- package/src/components/account/sections/shared/WorkspaceSection.tsx +22 -0
- package/src/components/account/sections/subscription/AiCreditsUsage.tsx +152 -0
- package/src/components/account/sections/subscription/BillingAddressSheet.tsx +460 -0
- package/src/components/account/sections/subscription/BoletoDetailsDialog.tsx +104 -0
- package/src/components/account/sections/subscription/BoletoGeneratedDialog.tsx +24 -0
- package/src/components/account/sections/subscription/CancelPlanDialog.tsx +221 -0
- package/src/components/account/sections/subscription/ChargeRow.tsx +161 -0
- package/src/components/account/sections/subscription/ChargeStatusBadge.tsx +29 -0
- package/src/components/account/sections/subscription/ChargesList.tsx +125 -0
- package/src/components/account/sections/subscription/ManageCardsSheet.tsx +93 -0
- package/src/components/account/sections/subscription/OverdueReceiptOpener.tsx +29 -0
- package/src/components/account/sections/subscription/PayChargeDialog.tsx +306 -0
- package/src/components/account/sections/subscription/PaymentConfirmationDialog.tsx +70 -0
- package/src/components/account/sections/subscription/PaymentMethodsCard.tsx +117 -0
- package/src/components/account/sections/subscription/PendingChangeDialog.tsx +168 -0
- package/src/components/account/sections/subscription/PixDetailsDialog.tsx +246 -0
- package/src/components/account/sections/subscription/PixPaymentDialog.tsx +242 -0
- package/src/components/account/sections/subscription/PlanDetailsSheet.tsx +380 -0
- package/src/components/account/sections/subscription/ReceiptDetailsSheet.tsx +318 -0
- package/src/components/account/sections/subscription/SubscriptionFlows.tsx +40 -0
- package/src/components/account/sections/subscription/SubscriptionPlanCard.tsx +433 -0
- package/src/components/account/sections/subscription/UsageReportSheet.tsx +244 -0
- package/src/components/account/sections/subscription/change-plan/ChangePlanSheet.tsx +95 -0
- package/src/components/account/sections/subscription/change-plan/components/AbTestDetailsDialog.tsx +57 -0
- package/src/components/account/sections/subscription/change-plan/components/AddonsBlock.tsx +214 -0
- package/src/components/account/sections/subscription/change-plan/components/AlternativeBucketsSection.tsx +92 -0
- package/src/components/account/sections/subscription/change-plan/components/CouponBlock.tsx +42 -0
- package/src/components/account/sections/subscription/change-plan/components/CouponDialog.tsx +134 -0
- package/src/components/account/sections/subscription/change-plan/components/PricePreview.tsx +28 -0
- package/src/components/account/sections/subscription/change-plan/components/SummaryBlock.tsx +194 -0
- package/src/components/account/sections/subscription/change-plan/plan-comparison.ts +52 -0
- package/src/components/account/sections/subscription/change-plan/steps/PaymentSummaryStep.tsx +161 -0
- package/src/components/account/sections/subscription/change-plan/steps/PlanComparisonStep.tsx +165 -0
- package/src/components/account/sections/subscription/change-plan/steps/PlanViewStep.tsx +89 -0
- package/src/components/account/sections/subscription/change-plan/steps/ReactivationConfigStep.tsx +117 -0
- package/src/components/account/sections/subscription/change-plan/steps/ReactivationPaymentStep.tsx +139 -0
- package/src/components/account/sections/subscription/change-plan/useChangePlanState.tsx +1158 -0
- package/src/components/account/sections/subscription/downgrade/CannotDowngradeDialog.tsx +297 -0
- package/src/components/account/sections/subscription/downgrade/DowngradeReasonDialog.tsx +154 -0
- package/src/components/account/sections/subscription/plans/PlanCard.tsx +417 -0
- package/src/components/account/sections/subscription/plans/PlanCardSkeleton.tsx +70 -0
- package/src/components/account/sections/subscription/plans/PlansCatalogDialog.tsx +156 -0
- package/src/components/account/sections/team/DeleteUserModal.tsx +134 -0
- package/src/components/account/sections/team/TeamFlows.tsx +14 -0
- package/src/components/account/sections/team/TeamMemberRow.tsx +151 -0
- package/src/components/account/sections/team/UserSheet.tsx +688 -0
- package/src/components/account/sections/team/steps/NotificationsStep.tsx +109 -0
- package/src/components/account/sections/team/steps/ProjectSelectionStep.tsx +219 -0
- package/src/components/account/sections/team/steps/UserInformationStep.tsx +423 -0
- package/src/components/account/sections/team/user-form.schema.ts +43 -0
- package/src/components/account/types/workspace-actions.type.ts +56 -0
- package/src/components/layouts/ProfilePopover.tsx +11 -12
- package/src/components/layouts/UsersSelectorPopover.tsx +7 -4
- package/src/components/modals/AccountDeletionWarningModal.tsx +4 -5
- package/src/components/modals/AccountFrozenModal.tsx +6 -3
- package/src/components/modals/Modals.tsx +6 -3
- package/src/components/modals/PaidPlanRequiredModal.tsx +4 -5
- package/src/components/modals/cards/AddFirstCardWarningModal.tsx +72 -0
- package/src/components/modals/cards/SwitchPaymentToCardModal.tsx +232 -0
- package/src/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.tsx +5 -4
- package/src/components/ui/data-display/CardItem.tsx +9 -5
- package/src/components/ui/data-display/PaymentMethodIcons.tsx +43 -0
- package/src/components/ui/form/BillingPeriodSelector.tsx +173 -0
- package/src/components/ui/form/PaymentMethodToggle.tsx +119 -0
- package/src/components/ui/form/RadioOptionFieldIcon.tsx +64 -0
- package/src/components/ui/form/SegmentedControl.tsx +77 -0
- package/src/components/ui/overlay/Dialog.tsx +70 -33
- package/src/components/ui/overlay/Sheet.tsx +89 -56
- package/src/components/ui/overlay/layers.tsx +114 -27
- package/src/enums/AccountHubFlow.ts +8 -0
- package/src/enums/DateFilterPeriod.ts +17 -0
- package/src/enums/WorkspaceSectionType.ts +6 -0
- package/src/handlers.ts +14 -0
- package/src/hooks/useDebounce.ts +5 -3
- package/src/hooks/useUploadProgress.ts +42 -0
- package/src/i18n/messages/en-us.ts +904 -2
- package/src/i18n/messages/es-es.ts +908 -2
- package/src/i18n/messages/pt-br.ts +908 -2
- package/src/index.ts +56 -1
- package/src/infra/http/paged.ts +24 -0
- package/src/middleware.ts +1 -0
- package/src/middlewares/create-auth-middleware.ts +1 -4
- package/src/middlewares/create-legacy-account-routes-middleware.ts +54 -0
- package/src/middlewares/is-route-equals.ts +3 -0
- package/src/modules/accounts/actions/account-management.action.ts +22 -1
- package/src/modules/accounts/constants/account-hub-link.constants.ts +3 -0
- package/src/modules/accounts/constants/legacy-account-routes.constants.ts +1 -0
- package/src/modules/accounts/handlers/list-account-members.handler.ts +23 -0
- package/src/modules/accounts/hooks/add-user-projects.hook.ts +72 -0
- package/src/modules/accounts/hooks/create-account-user.hook.ts +21 -0
- package/src/modules/accounts/hooks/remove-user-projects.hook.ts +68 -0
- package/src/modules/accounts/hooks/use-account-members.hook.ts +31 -0
- package/src/modules/accounts/services/account.service.ts +71 -0
- package/src/modules/accounts/types/account-hub-link.type.ts +13 -0
- package/src/modules/accounts/types.ts +9 -0
- package/src/modules/accounts/utils/build-account-hub-url.ts +14 -0
- package/src/modules/accounts/utils/is-account-hub-flow.ts +7 -0
- package/src/modules/accounts/utils/is-account-section.ts +7 -0
- package/src/modules/accounts/utils/is-my-account-section.ts +12 -0
- package/src/modules/accounts/utils/map-legacy-account-route.ts +108 -0
- package/src/modules/accounts/utils/parse-account-hub-link.ts +21 -0
- package/src/modules/affiliates/actions/ensure-affiliate.action.ts +9 -0
- package/src/modules/affiliates/actions/request-deposit.action.ts +9 -0
- package/src/modules/affiliates/actions/update-affiliate.action.ts +9 -0
- package/src/modules/affiliates/constants/affiliate.constants.ts +11 -0
- package/src/modules/affiliates/constants/query-keys.constants.ts +7 -0
- package/src/modules/affiliates/handlers/affiliate-report-analytics.handler.ts +16 -0
- package/src/modules/affiliates/handlers/affiliate-withdrawal-limits.handler.ts +10 -0
- package/src/modules/affiliates/handlers/current-affiliate.handler.ts +10 -0
- package/src/modules/affiliates/handlers/list-affiliate-coupons.handler.ts +10 -0
- package/src/modules/affiliates/handlers/list-affiliate-leads.handler.ts +23 -0
- package/src/modules/affiliates/handlers/list-affiliate-transactions.handler.ts +23 -0
- package/src/modules/affiliates/hooks/use-affiliate-coupons.hook.ts +19 -0
- package/src/modules/affiliates/hooks/use-affiliate-leads.hook.ts +27 -0
- package/src/modules/affiliates/hooks/use-affiliate-report-analytics.hook.ts +19 -0
- package/src/modules/affiliates/hooks/use-affiliate-transactions.hook.ts +25 -0
- package/src/modules/affiliates/hooks/use-current-affiliate.hook.ts +19 -0
- package/src/modules/affiliates/hooks/use-ensure-affiliate.hook.ts +24 -0
- package/src/modules/affiliates/hooks/use-request-deposit.hook.ts +29 -0
- package/src/modules/affiliates/hooks/use-update-affiliate.hook.ts +24 -0
- package/src/modules/affiliates/hooks/use-withdrawal-limits.hook.ts +20 -0
- package/src/modules/affiliates/services/affiliates.service.ts +240 -0
- package/src/modules/affiliates/types/affiliate.type.ts +180 -0
- package/src/modules/affiliates/utils/get-affiliate-share-link.ts +8 -0
- package/src/modules/charges/actions/get-nota-fiscal.action.ts +8 -0
- package/src/modules/charges/actions/refresh-pix.action.ts +8 -0
- package/src/modules/charges/hooks/nota-fiscal.hook.ts +13 -0
- package/src/modules/charges/hooks/refresh-pix.hook.ts +13 -0
- package/src/modules/charges/services/charges.service.ts +121 -0
- package/src/modules/charges/types/nota-fiscal.type.ts +20 -0
- package/src/modules/charges/types/refresh-pix.type.ts +14 -0
- package/src/modules/charges/utils/get-charge-download-url.ts +10 -0
- package/src/modules/coupons/constants/query-keys.constants.ts +1 -0
- package/src/modules/coupons/handlers/find-coupon-by-code.handler.ts +16 -0
- package/src/modules/coupons/handlers/find-coupon-by-id.handler.ts +15 -0
- package/src/modules/coupons/hooks/use-coupon-by-code.hook.ts +16 -0
- package/src/modules/coupons/hooks/use-coupon-by-id.hook.ts +20 -0
- package/src/modules/coupons/services/coupons.service.ts +54 -0
- package/src/modules/coupons/types/coupon.type.ts +70 -0
- package/src/modules/coupons/utils/coupon-restrictions.ts +112 -0
- package/src/modules/domains/handlers/count-domains.handler.ts +10 -0
- package/src/modules/domains/hooks/count-domains.hook.ts +17 -0
- package/src/modules/domains/services/domains.service.ts +18 -0
- package/src/modules/ia-credits/handlers/list-ia-credit-operations.handler.ts +14 -0
- package/src/modules/ia-credits/hooks/ia-credit-operations.hook.ts +33 -0
- package/src/modules/ia-credits/services/ia-credits.service.ts +32 -1
- package/src/modules/pages/handlers/count-pages.handler.ts +5 -2
- package/src/modules/pages/hooks/count-published-pages.hook.ts +26 -0
- package/src/modules/pages/services/pages.service.ts +3 -2
- package/src/modules/plans/constants/plan-tooltips.constants.ts +16 -0
- package/src/modules/plans/hooks/use-enriched-plans.hook.ts +31 -0
- package/src/modules/plans/hooks/use-ui-plans.hook.ts +22 -0
- package/src/modules/projects/hooks/add-project-users.hook.ts +29 -0
- package/src/modules/projects/hooks/list-all-account-users.hook.ts +3 -6
- package/src/modules/projects/hooks/list-available-users.hook.ts +3 -6
- package/src/modules/projects/hooks/list-infinite-projects.hook.ts +3 -6
- package/src/modules/projects/hooks/list-project-users.hook.ts +3 -6
- package/src/modules/projects/hooks/remove-project-users.hook.ts +29 -0
- package/src/modules/projects/services/project-users.service.ts +135 -130
- package/src/modules/projects/types.ts +89 -88
- package/src/modules/subscriptions/actions/cancel-subscription.action.ts +12 -0
- package/src/modules/subscriptions/actions/create-subscription.action.ts +9 -0
- package/src/modules/subscriptions/actions/find-pending-pix-status.action.ts +8 -0
- package/src/modules/subscriptions/actions/find-subscription-by-id.action.ts +8 -0
- package/src/modules/subscriptions/constants/addons.constants.ts +50 -0
- package/src/modules/subscriptions/constants/downgrade.constants.ts +30 -0
- package/src/modules/subscriptions/constants/subscription.constants.ts +3 -0
- package/src/modules/subscriptions/handlers/pending-pix-status.handler.ts +17 -0
- package/src/modules/subscriptions/hooks/cancel-subscription.hook.ts +28 -0
- package/src/modules/subscriptions/hooks/create-subscription.hook.ts +34 -0
- package/src/modules/subscriptions/hooks/find-subscription-by-id.hook.ts +17 -0
- package/src/modules/subscriptions/hooks/pending-pix-status.hook.ts +30 -0
- package/src/modules/subscriptions/services/subscriptions.service.ts +401 -301
- package/src/modules/subscriptions/types/cancel-subscription.type.ts +8 -0
- package/src/modules/subscriptions/types/create-subscription.type.ts +79 -0
- package/src/modules/subscriptions/types/pending-pix-status.type.ts +33 -0
- package/src/modules/subscriptions/types/subscription.type.ts +157 -147
- package/src/modules/subscriptions/utils/addon-buckets.ts +129 -0
- package/src/modules/subscriptions/utils/confirm-payment-if-required.ts +9 -2
- package/src/modules/subscriptions/utils/first-period-pricing.ts +63 -0
- package/src/modules/subscriptions/utils/is-api-subscription.ts +6 -0
- package/src/modules/subscriptions/utils/is-boleto-payer.ts +21 -0
- package/src/modules/subscriptions/utils/is-free-subscription.ts +6 -0
- package/src/modules/subscriptions/utils/periodicity.ts +101 -0
- package/src/modules/subscriptions/utils/resolve-subscription-plan-name.ts +44 -0
- package/src/modules/users/hooks/messages.hook.ts +3 -5
- package/src/server.ts +102 -99
- package/src/store/useAccountModals.ts +22 -5
- package/src/store/useAffiliateFlows.ts +46 -0
- package/src/store/useProjectFlows.ts +42 -0
- package/src/store/useSubscriptionFlows.ts +176 -0
- package/src/store/useTeamFlows.ts +34 -0
- package/src/testing/factories/coupon.factory.ts +17 -0
- package/src/testing/factories/index.ts +3 -0
- package/src/testing/factories/project-user.factory.ts +15 -0
- package/src/testing/factories/project.factory.ts +19 -0
- package/src/testing/react/providers.tsx +2 -1
- package/src/utils/browser/chart-custom-tooltip.ts +85 -0
- package/src/utils/browser/get-css-variable.ts +6 -0
- package/src/utils/constants/scrollbar.ts +10 -0
- package/src/utils/date-filter-period.ts +34 -0
- package/src/utils/file/index.ts +13 -0
- package/src/utils/format/initials.ts +10 -0
- package/src/utils/format/masks.ts +41 -0
- package/src/utils/qrcode/to-data-url.ts +23 -0
- package/src/utils/validators/account.ts +0 -8
- package/dist/components/account/ConfigurationsMyAccountModal.mjs +0 -143
- package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +0 -1
- package/dist/components/account/hooks/useConfigurationsModal.mjs +0 -34
- package/dist/components/account/hooks/useConfigurationsModal.mjs.map +0 -1
- package/src/components/account/ConfigurationsMyAccountModal.tsx +0 -179
- package/src/components/account/hooks/useConfigurationsModal.ts +0 -45
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/account/sections/subscription/change-plan/useChangePlanState.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n} from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useStripe } from '@stripe/react-stripe-js';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useTranslations } from 'next-intl';\nimport { toast } from 'sonner';\nimport z from 'zod';\nimport { Toast } from '../../../../ui/feedback/Toast';\nimport { useCurrentAccount } from '../../../../../modules/accounts/hooks/current-account.hook';\nimport { useCurrencyFormatter } from '../../../../../modules/accounts/hooks/use-currency-formatter.hook';\nimport {\n hasCompleteBillingData,\n isBrazilianBillingAccount,\n} from '../../../../../modules/accounts/utils/billing-data';\nimport { useCards } from '../../../../../modules/cards/hooks/cards.hook';\nimport { useCouponById } from '../../../../../modules/coupons/hooks/use-coupon-by-id.hook';\nimport {\n getCouponRestrictions,\n isCouponApplicableToPlan,\n} from '../../../../../modules/coupons/utils/coupon-restrictions';\nimport type { CouponStripeData } from '../../../../../modules/coupons/types/coupon.type';\nimport { useCountDomains } from '../../../../../modules/domains/hooks/count-domains.hook';\nimport { usePlanById } from '../../../../../modules/plans/hooks/use-plan-by-id.hook';\nimport {\n ADDON_IDS,\n buildAiCreditOptions,\n canBuyExtraDomains,\n getDomainExtraPrice,\n} from '../../../../../modules/subscriptions/constants/addons.constants';\nimport { useCalculateSubscription } from '../../../../../modules/subscriptions/hooks/calculate-subscription.hook';\nimport { useCreateSubscription } from '../../../../../modules/subscriptions/hooks/create-subscription.hook';\nimport { useCurrentSubscription } from '../../../../../modules/subscriptions/hooks/use-current-subscription.hook';\nimport { useUpdateSubscriptionPlan } from '../../../../../modules/subscriptions/hooks/update-subscription-plan.hook';\nimport { isPendingPixCreateSubscriptionResponse } from '../../../../../modules/subscriptions/types/create-subscription.type';\nimport { confirmPaymentIfRequired, PaymentAuthenticationError } from '../../../../../modules/subscriptions/utils/confirm-payment-if-required';\nimport type { BillingPeriod } from '../../../../../modules/subscriptions/types/billing-period.type';\nimport type { UpdateSubscriptionPlanRequest } from '../../../../../modules/subscriptions/types/calculate-subscription.type';\nimport {\n getAddonBuckets,\n buildDomainPlanExtras,\n buildZeroedOldBuckets,\n type AddonBucket,\n} from '../../../../../modules/subscriptions/utils/addon-buckets';\nimport {\n getFirstPeriodPricing,\n type FirstPeriodPricing,\n} from '../../../../../modules/subscriptions/utils/first-period-pricing';\nimport { isBoletoAvailable, isBoletoPayer } from '../../../../../modules/subscriptions/utils/is-boleto-payer';\nimport {\n billingPeriodToNumeric,\n getBillingPeriodLabel,\n getBillingPeriodMonths,\n getBillingPeriodSuffix,\n getCouponDiscount,\n getDiscount,\n getEffectiveDiscountPercent,\n getPeriodPricingKey,\n getPeriodicityLabel,\n getPriceFromCalculatedData,\n periodicityToBillingPeriod,\n} from '../../../../../modules/subscriptions/utils/periodicity';\nimport { resolveSubscriptionPlanName } from '../../../../../modules/subscriptions/utils/resolve-subscription-plan-name';\nimport { useWhitelabel } from '../../../../../providers/whitelabel.provider';\nimport { useDebouncedEffect } from '../../../../../hooks/useDebouncedEffect';\nimport { useSubscriptionFlows } from '../../../../../store/useSubscriptionFlows';\n\n/** Mínimo de domínios que qualquer plano inclui. */\nconst MIN_DOMAINS = 1;\n\nexport const changePlanSchema = z.object({\n paymentMethod: z.enum(['card', 'boleto', 'pix']),\n selectedCardId: z.string(),\n selectedReason: z.string(),\n reasonText: z.string(),\n});\n\nexport type ChangePlanFormData = z.infer<typeof changePlanSchema>;\n\ntype ChangePlanState = ReturnType<typeof useChangePlanLogic>;\n\nconst ChangePlanContext = createContext<ChangePlanState | null>(null);\n\nexport const ChangePlanProvider = ChangePlanContext.Provider;\n\nexport function useChangePlan() {\n const context = useContext(ChangePlanContext);\n if (!context) throw new Error('useChangePlan precisa estar dentro de ChangePlanProvider');\n return context;\n}\n\n/** Delta de pró-rata (centavos) do pix recorrente — resposta passthrough, leitura defensiva. */\nfunction readProrataValueCents(response: unknown): number | null {\n const value = (response as { prorata_value_cents?: unknown }).prorata_value_cents;\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nconst paymentMethodToNumeric = (method: 'card' | 'boleto' | 'pix') =>\n method === 'card' ? 1 : method === 'boleto' ? 2 : 3;\n\nexport function useChangePlanLogic() {\n const translate = useTranslations();\n const { whitelabel } = useWhitelabel();\n const stripe = useStripe();\n const { data: account } = useCurrentAccount();\n const { currency, formatCurrencyNumber } = useCurrencyFormatter();\n const isUsdAccount = currency === 'usd';\n\n const changePlan = useSubscriptionFlows((state) => state.changePlan);\n const closeChangePlan = useSubscriptionFlows((state) => state.closeChangePlan);\n const openPlansCatalog = useSubscriptionFlows((state) => state.openPlansCatalog);\n const openPixPayment = useSubscriptionFlows((state) => state.openPixPayment);\n const openBoletoGenerated = useSubscriptionFlows((state) => state.openBoletoGenerated);\n const openBillingAddress = useSubscriptionFlows((state) => state.openBillingAddress);\n const openPaymentConfirmation = useSubscriptionFlows((state) => state.openPaymentConfirmation);\n\n const open = !!changePlan;\n const data = changePlan ?? undefined;\n const isReactivation = data?.isReactivation ?? false;\n\n const { mutateAsync: updatePlanAsync } = useUpdateSubscriptionPlan();\n const { mutateAsync: createSubscriptionAsync } = useCreateSubscription();\n const { data: cardsData } = useCards();\n\n const { data: subscriptionData, isFetched: activeSubscriptionFetched } = useCurrentSubscription();\n const activeSubscription = subscriptionData?.data?.[0];\n const subscriptionCouponId =\n activeSubscription?.id_coupon != null ? Number(activeSubscription.id_coupon) : null;\n const { data: subscriptionCouponData } = useCouponById(\n open && subscriptionCouponId != null ? subscriptionCouponId : null\n );\n const { mutate: calculate, isPending: isCalculatePending, data: calculateData } =\n useCalculateSubscription();\n\n const [currentStep, setCurrentStep] = useState(1);\n const [selectedCreditIndex, setSelectedCreditIndex] = useState(0);\n const [bucketEdits, setBucketEdits] = useState<Record<string, number>>({});\n const [abTestEnabled, setAbTestEnabled] = useState(false);\n const [appliedCouponId, setAppliedCouponId] = useState<number | null>(null);\n const [appliedCouponCode, setAppliedCouponCode] = useState<string | null>(null);\n const [appliedCouponStripeData, setAppliedCouponStripeData] = useState<CouponStripeData | null>(null);\n const [activeCardIdAddon, setActiveCardIdAddon] = useState('');\n const [abTestDetailsOpen, setAbTestDetailsOpen] = useState(false);\n const [isCouponDialogOpen, setIsCouponDialogOpen] = useState(false);\n const [isReactivating, setIsReactivating] = useState(false);\n /**\n * Assinatura criada que ficou esperando o 3DS. Enquanto existir, o submit re-autentica ESTA\n * cobrança em vez de criar outra — sem isso, quem erra a autenticação e tenta de novo termina\n * com duas assinaturas.\n */\n const [pendingAuthSecret, setPendingAuthSecret] = useState<string | null>(null);\n const pendingUpdatePayloadRef = useRef<UpdateSubscriptionPlanRequest | null>(null);\n const hasInitialized = useRef(false);\n\n const targetPlan = data?.targetPlan;\n const isDowngrade = data?.isDowngrade ?? false;\n\n const { data: currentPlanData } = usePlanById(activeSubscription?.id_plan);\n const currentPlan = currentPlanData?.data;\n const effectivePlan = targetPlan ?? currentPlan;\n const effectivePlanId = targetPlan ? targetPlan.planId : currentPlan?.id;\n\n const wlName = whitelabel?.name || '';\n\n const subscriptionBillingPeriod =\n periodicityToBillingPeriod(activeSubscription?.periodicity) ?? 'monthly';\n // Reativar pelo card não escolhe período (herda o da assinatura); vindo da vitrine, o período\n // escolhido lá manda — inclusive na contratação, que reusa este mesmo fluxo.\n const requestedBillingPeriod: BillingPeriod = data?.billingPeriod ?? subscriptionBillingPeriod;\n // Só a contratação troca de período aqui dentro: na troca de plano o período já veio decidido\n // pela vitrine, e na gestão de adicionais ele é o da assinatura corrente.\n const [contractingBillingPeriod, setContractingBillingPeriod] = useState<BillingPeriod | null>(null);\n const billingPeriod: BillingPeriod =\n isReactivation && contractingBillingPeriod ? contractingBillingPeriod : requestedBillingPeriod;\n const modalBillingPeriod: BillingPeriod = data?.billingPeriod ?? 'monthly';\n\n const subscriptionItems = activeSubscription?.items ?? [];\n const domainItems = subscriptionItems.filter((item) => item.id_addon === ADDON_IDS.DOMAINS);\n const abTestItem = subscriptionItems.find((item) => item.id_addon === ADDON_IDS.AB_TEST);\n const aiItems = subscriptionItems.filter(\n (item) => item.id_addon === ADDON_IDS.AI && (item.value ?? 0) > 0\n );\n const aiItem =\n aiItems.length > 0\n ? aiItems.reduce((best, item) => (item.quantity > best.quantity ? item : best))\n : undefined;\n\n const planDomainItem = effectivePlan?.items.find(\n (item) => item.id_addon === ADDON_IDS.DOMAINS && item.value == 0\n );\n const planAbTestItem = effectivePlan?.items.find((item) => item.id_addon === ADDON_IDS.AB_TEST);\n const aiCreditOptions = buildAiCreditOptions(effectivePlan?.items ?? []);\n const selectedCredit = aiCreditOptions[selectedCreditIndex] ?? aiCreditOptions[0];\n\n const hasDomainsAddon =\n !!effectivePlan?.items.find((item) => item.id_addon === ADDON_IDS.DOMAINS && item.value > 0) &&\n canBuyExtraDomains(effectivePlanId);\n\n // A/B incluso no plano (item com value 0) trava o toggle; só o A/B avulso pago é gerenciável.\n const planAbTestIncludedItem = effectivePlan?.items.find(\n (item) => item.id_addon === ADDON_IDS.AB_TEST && (item.value ?? 0) === 0 && (item.quantity ?? 0) > 0\n );\n const abTestIncludedInPlan = !!planAbTestIncludedItem;\n const hasAbTestAddon =\n !abTestIncludedInPlan &&\n !!effectivePlan?.items.find((item) => item.id_addon === ADDON_IDS.AB_TEST && (item.value ?? 0) > 0);\n\n const { data: registeredDomains = 0, isSuccess: registeredDomainsLoaded } = useCountDomains({\n enabled: open,\n });\n\n // Backend normalizado: `value` de plano e de assinatura é sempre mensal por unidade.\n const planDomainItems = effectivePlan?.items.filter(\n (item) => item.id_addon === ADDON_IDS.DOMAINS && (item.value ?? 0) > 0\n );\n const planDomainPrice =\n planDomainItems?.find((item) => item.base)?.value ??\n planDomainItems?.[0]?.value ??\n getDomainExtraPrice(effectivePlanId);\n const domainPriceMonthly = planDomainPrice;\n\n const subscriptionAbTestPrice =\n subscriptionItems.find((item) => item.id_addon === ADDON_IDS.AB_TEST && (item.value ?? 0) > 0)\n ?.value ?? 0;\n const abTestPriceMonthly = subscriptionAbTestPrice || (planAbTestItem?.value ?? 0);\n\n // A/B incluso nunca é zerado no payload; fora disso segue o toggle.\n const abTestPayloadQuantity = abTestIncludedInPlan\n ? (planAbTestIncludedItem?.quantity ?? 1)\n : abTestEnabled\n ? 1\n : 0;\n\n const subscriptionIncludedDomainsItem = domainItems.find((item) => (item.value ?? 0) === 0);\n const planIncludedDomains = targetPlan\n ? (planDomainItem?.quantity ?? MIN_DOMAINS)\n : (subscriptionIncludedDomainsItem?.quantity ?? planDomainItem?.quantity ?? MIN_DOMAINS);\n const currentPlanIncludedDomains =\n effectivePlan?.items?.find((item) => item.id_addon === ADDON_IDS.DOMAINS)?.quantity ?? 0;\n const subscriptionDomainSum = domainItems.reduce((sum, item) => sum + (item.quantity ?? 0), 0);\n const subscriptionExtraDomains = domainItems\n .filter((item) => (item.value ?? 0) > 0)\n .reduce((sum, item) => sum + (item.quantity ?? 0), 0);\n const currentSubscriptionDomains = Math.max(\n subscriptionDomainSum,\n currentPlanIncludedDomains + subscriptionExtraDomains\n );\n\n // Reativação e troca de plano colapsam tudo no preço do plano novo.\n const collapseToSingleBucket = isReactivation || !!targetPlan;\n const primaryBucketPrice = planDomainPrice;\n const domainBuckets = getAddonBuckets(\n ADDON_IDS.DOMAINS,\n collapseToSingleBucket ? [] : subscriptionItems,\n primaryBucketPrice,\n bucketEdits\n );\n // Troca de plano precisa zerar explicitamente os itens antigos em outros preços.\n const zeroedOldDomainBuckets = targetPlan\n ? buildZeroedOldBuckets(ADDON_IDS.DOMAINS, subscriptionItems, planDomainPrice)\n : [];\n const primaryBucket = domainBuckets.find((bucket) => bucket.isPrimary)!;\n const alternativeBuckets = domainBuckets.filter((bucket) => !bucket.isPrimary && bucket.quantity > 0);\n const hasAlternativeBuckets = domainBuckets.some(\n (bucket) => !bucket.isPrimary && bucket.originalQuantity > 0\n );\n\n const totalExtras = domainBuckets.reduce((sum, bucket) => sum + bucket.quantity, 0);\n const totalDomains = planIncludedDomains + totalExtras;\n const domains = planIncludedDomains + primaryBucket.quantity;\n\n // Piso: nunca abaixo do incluso no plano nem dos domínios já registrados.\n const minDomains = registeredDomainsLoaded\n ? Math.max(planIncludedDomains, registeredDomains)\n : planIncludedDomains;\n const domainsCountLoading = hasDomainsAddon && !registeredDomainsLoaded;\n const isAtMin = totalDomains <= minDomains || primaryBucket.quantity <= 0;\n const extraDomains = totalExtras;\n\n const paymentMethodFromSubscription: 'card' | 'boleto' | 'pix' =\n activeSubscription?.payment_method === 2\n ? 'boleto'\n : activeSubscription?.payment_method === 3\n ? 'pix'\n : 'card';\n\n const form = useForm<ChangePlanFormData>({\n resolver: zodResolver(changePlanSchema),\n defaultValues: { paymentMethod: 'card', selectedCardId: '', selectedReason: '', reasonText: '' },\n });\n\n const { isSubmitting } = form.formState;\n const paymentMethod = form.watch('paymentMethod');\n const selectedCardId = form.watch('selectedCardId');\n\n const paymentDefaultAppliedRef = useRef(false);\n useEffect(() => {\n if (!open) {\n paymentDefaultAppliedRef.current = false;\n return;\n }\n if (paymentDefaultAppliedRef.current || !activeSubscription) return;\n form.setValue('paymentMethod', paymentMethodFromSubscription);\n paymentDefaultAppliedRef.current = true;\n }, [open, activeSubscription, paymentMethodFromSubscription, form]);\n\n const couponRestrictions = getCouponRestrictions(appliedCouponStripeData);\n const { allowedPaymentMethod, disabledPaymentMethods } = couponRestrictions;\n const { disabledBillingPeriods, allowedBillingPeriod } = couponRestrictions;\n const { unlocksAllPaymentMethods: couponUnlocksAllMethods } = couponRestrictions;\n\n // Assinatura que já é boleto/pix mantém o método enquanto só gerencia adicionais.\n const isCurrentSubscriptionBoleto = isBoletoPayer(activeSubscription?.payment_method);\n const allowBoletoFromCurrentSubscription =\n isCurrentSubscriptionBoleto && !targetPlan && !isReactivation;\n const isCurrentSubscriptionPix = activeSubscription?.payment_method === 3;\n const allowPixFromCurrentSubscription = isCurrentSubscriptionPix && !targetPlan && !isReactivation;\n\n const boletoAvailable =\n !isUsdAccount &&\n isBoletoAvailable({\n isBoletoPayer: isCurrentSubscriptionBoleto,\n allowedPaymentMethod,\n unlocksAllPaymentMethods: couponUnlocksAllMethods,\n });\n const pixAvailable = !isUsdAccount;\n\n useEffect(() => {\n if (!open) return;\n if (isUsdAccount) {\n if (paymentMethod !== 'card') form.setValue('paymentMethod', 'card');\n return;\n }\n if (!allowedPaymentMethod) return;\n if (paymentMethod !== allowedPaymentMethod) form.setValue('paymentMethod', allowedPaymentMethod);\n }, [open, isUsdAccount, allowedPaymentMethod, paymentMethod, form]);\n\n // Volta para cartão quando o método escolhido deixa de ser permitido no contexto atual.\n useEffect(() => {\n if (!open) return;\n if (billingPeriod === 'annual') return;\n if (paymentMethod !== 'boleto' && paymentMethod !== 'pix') return;\n if (couponUnlocksAllMethods) return;\n if (\n paymentMethod === 'boleto' &&\n (allowedPaymentMethod === 'boleto' || allowBoletoFromCurrentSubscription)\n ) {\n return;\n }\n if (paymentMethod === 'pix' && (allowedPaymentMethod === 'pix' || allowPixFromCurrentSubscription)) {\n return;\n }\n form.setValue('paymentMethod', 'card');\n }, [\n open,\n billingPeriod,\n paymentMethod,\n couponUnlocksAllMethods,\n allowedPaymentMethod,\n allowBoletoFromCurrentSubscription,\n allowPixFromCurrentSubscription,\n form,\n ]);\n\n useEffect(() => {\n if (!open || boletoAvailable || paymentMethod !== 'boleto') return;\n form.setValue('paymentMethod', 'card');\n }, [open, boletoAvailable, paymentMethod, form]);\n\n const cards = cardsData?.data ?? [];\n const defaultCardId = (cards.find((card) => card.is_default) ?? cards[0])?.id?.toString() ?? '';\n const resolvedAddonCardId = activeCardIdAddon || defaultCardId;\n\n useEffect(() => {\n if (!open || !activeSubscription || !effectivePlan || !registeredDomainsLoaded) return;\n if (hasInitialized.current) return;\n\n hasInitialized.current = true;\n\n if (hasDomainsAddon) {\n if (collapseToSingleBucket) {\n // Começa com o mínimo de extras que cobre os domínios em uso no plano novo.\n const primaryKey = `${ADDON_IDS.DOMAINS}_${planDomainPrice}`;\n const initialQty = Math.max(0, registeredDomains - planIncludedDomains);\n if (initialQty > 0) setBucketEdits((previous) => ({ ...previous, [primaryKey]: initialQty }));\n } else {\n const initBuckets = getAddonBuckets(ADDON_IDS.DOMAINS, subscriptionItems, domainPriceMonthly, {});\n const initExtras = initBuckets.reduce((sum, bucket) => sum + bucket.quantity, 0);\n const deficit = Math.max(0, minDomains - (planIncludedDomains + initExtras));\n if (deficit > 0) {\n const primary = initBuckets.find((bucket) => bucket.isPrimary)!;\n setBucketEdits((previous) => ({ ...previous, [primary.key]: primary.quantity + deficit }));\n }\n }\n }\n\n // Só liga o A/B se o plano efetivo suporta — item remanescente de downgrade não conta.\n setAbTestEnabled(hasAbTestAddon && !!abTestItem);\n\n if (aiItem) {\n const aiIndex = aiCreditOptions.findIndex((option) => option.credits === aiItem.quantity);\n if (aiIndex >= 0) setSelectedCreditIndex(aiIndex);\n } else if (data?.selectedCreditIndex != null) {\n setSelectedCreditIndex(data.selectedCreditIndex);\n }\n\n if (subscriptionCouponId != null) setAppliedCouponId(subscriptionCouponId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n open,\n activeSubscription,\n effectivePlan,\n registeredDomainsLoaded,\n hasDomainsAddon,\n minDomains,\n currentSubscriptionDomains,\n data,\n subscriptionCouponId,\n ]);\n\n // O cupom da assinatura pode chegar depois da inicialização.\n useEffect(() => {\n if (!open) return;\n const coupon = subscriptionCouponData?.data;\n if (!coupon || appliedCouponId !== subscriptionCouponId) return;\n if (coupon.code && !appliedCouponCode) setAppliedCouponCode(coupon.code);\n if (coupon.stripe_data && !appliedCouponStripeData) setAppliedCouponStripeData(coupon.stripe_data);\n }, [\n open,\n subscriptionCouponData,\n subscriptionCouponId,\n appliedCouponId,\n appliedCouponCode,\n appliedCouponStripeData,\n ]);\n\n // Cartão default: espera a assinatura resolver para sincronizar com o cartão dela.\n const cardDefaultAppliedRef = useRef(false);\n useEffect(() => {\n if (!open) {\n cardDefaultAppliedRef.current = false;\n return;\n }\n if (cards.length === 0) return;\n\n const currentId = form.getValues('selectedCardId');\n const isValid = currentId !== '' && cards.some((card) => card.id.toString() === currentId);\n\n if (cardDefaultAppliedRef.current) {\n if (!isValid) {\n const fallbackCard = cards.find((card) => card.is_default) ?? cards[0];\n form.setValue('selectedCardId', fallbackCard.id.toString());\n }\n return;\n }\n\n if (!activeSubscriptionFetched) return;\n\n const subscriptionCardId =\n activeSubscription?.id_card != null ? String(activeSubscription.id_card) : null;\n const subscriptionCard = subscriptionCardId\n ? cards.find((card) => card.id.toString() === subscriptionCardId)\n : undefined;\n const nextCard = subscriptionCard ?? cards.find((card) => card.is_default) ?? cards[0];\n form.setValue('selectedCardId', nextCard.id.toString());\n cardDefaultAppliedRef.current = true;\n }, [cardsData, open, form, cards, activeSubscription, activeSubscriptionFetched]);\n\n useEffect(() => {\n if (open) return;\n form.reset();\n setCurrentStep(1);\n setAppliedCouponId(null);\n setAppliedCouponCode(null);\n setAppliedCouponStripeData(null);\n setActiveCardIdAddon('');\n setSelectedCreditIndex(0);\n setBucketEdits({});\n setContractingBillingPeriod(null);\n setPendingAuthSecret(null);\n pendingUpdatePayloadRef.current = null;\n hasInitialized.current = false;\n }, [open, form]);\n\n const { isDebouncing } = useDebouncedEffect({\n effect: () => {\n if (!effectivePlan) return;\n\n const credit = aiCreditOptions[selectedCreditIndex] ?? aiCreditOptions[0];\n\n calculate({\n id_product: 1,\n id_plan: effectivePlanId!,\n periodicity: billingPeriodToNumeric(billingPeriod),\n ...(activeSubscription?.id != null && { id_subscription: activeSubscription.id }),\n ...(appliedCouponId != null && { id_coupon: appliedCouponId }),\n plan_extras: [\n { id_addon: ADDON_IDS.AI, quantity: credit.credits },\n // Só os buckets do plano-alvo: o backend não sabe precificar um domínio num preço\n // que não é do plano calculado (ex.: extra legado de R$ 9,90 indo para um plano de\n // R$ 14,90) e recusa a prévia inteira. Zerar os legados é papel do update.\n ...buildDomainPlanExtras(domainBuckets),\n { id_addon: ADDON_IDS.AB_TEST, quantity: abTestPayloadQuantity },\n ],\n });\n },\n debouncedDeps: [selectedCreditIndex, bucketEdits, abTestPayloadQuantity],\n immediateDeps: [open, effectivePlan, appliedCouponId, activeSubscription?.items],\n delay: 500,\n });\n\n const hasChangedPaymentMethod =\n !!activeSubscription && paymentMethod !== paymentMethodFromSubscription;\n const hasChangedCoupon = appliedCouponId !== subscriptionCouponId;\n const subscriptionCardId =\n activeSubscription?.id_card != null ? String(activeSubscription.id_card) : null;\n const hasChangedCard =\n !!activeSubscription &&\n paymentMethod === 'card' &&\n paymentMethodFromSubscription === 'card' &&\n selectedCardId !== '' &&\n subscriptionCardId !== selectedCardId;\n const hasChanges =\n !!targetPlan ||\n billingPeriod !== subscriptionBillingPeriod ||\n selectedCredit.credits !== (aiItem?.quantity ?? 0) ||\n abTestEnabled !== (hasAbTestAddon && !!abTestItem) ||\n domainBuckets.some((bucket) => bucket.quantity !== bucket.originalQuantity) ||\n hasChangedPaymentMethod ||\n hasChangedCoupon ||\n hasChangedCard;\n\n // Boleto e pix emitem nota: sem cadastro fiscal completo o backend recusa a cobrança, então\n // o passo de pagamento manda completar antes de deixar contratar. Só vale com a conta já\n // carregada (senão travaria durante o loading) e brasileira — o formulário pede CPF/CNPJ e\n // CEP, que um cliente de fora não tem como fornecer.\n const requiresBillingData =\n (paymentMethod === 'boleto' || paymentMethod === 'pix') &&\n !!account &&\n isBrazilianBillingAccount(account) &&\n !hasCompleteBillingData(account);\n\n const isCalculating = isDebouncing || isCalculatePending;\n const calculatedData = calculateData?.data ?? null;\n\n const totalPrice = calculatedData\n ? getPriceFromCalculatedData(calculatedData, billingPeriodToNumeric(billingPeriod))\n : null;\n const discountAmount = getDiscount(calculatedData, billingPeriod);\n const couponDiscountAmount = getCouponDiscount(calculatedData, billingPeriod);\n const immediateCharge = calculatedData?.target?.immediate_charge ?? null;\n\n // Totais por período para o seletor da contratação: o mesmo calculate já devolve os dois.\n const calculatedPricing = calculatedData\n ? { monthly: calculatedData.month, annual: calculatedData.year }\n : null;\n // Percentual EFETIVO por período (periodicidade + cupom, compostos pelo backend).\n const billingDiscounts = {\n monthly: getEffectiveDiscountPercent(calculatedData, 'monthly'),\n annual: getEffectiveDiscountPercent(calculatedData, 'annual'),\n };\n // Split \"1º período × depois\" por período — null onde o cupom não desconta.\n const firstPeriodPricingByPeriod: {\n monthly: FirstPeriodPricing | null;\n annual: FirstPeriodPricing | null;\n } | null = calculatedData\n ? {\n monthly: getFirstPeriodPricing({\n stripeData: appliedCouponStripeData,\n total: calculatedData.month,\n couponDiscount: calculatedData.month_discount_coupom ?? 0,\n }),\n annual: getFirstPeriodPricing({\n stripeData: appliedCouponStripeData,\n total: calculatedData.year,\n couponDiscount: calculatedData.year_discount_coupom ?? 0,\n }),\n }\n : null;\n\n const billingLabel = getBillingPeriodLabel(billingPeriod, translate);\n const periodMonths = getBillingPeriodMonths(billingPeriod);\n const periodPricingKey = getPeriodPricingKey(billingPeriod);\n\n const currentBillingPeriod = periodicityToBillingPeriod(activeSubscription?.periodicity) ?? 'monthly';\n const currentPeriodLabel = getBillingPeriodSuffix(currentBillingPeriod, translate);\n const periodLabel = getBillingPeriodSuffix(billingPeriod, translate);\n const billingLabelFull = getBillingPeriodLabel(billingPeriod, translate);\n\n const handleDecreaseDomains = useCallback(() => {\n if (primaryBucket.quantity <= 0) return;\n if (totalDomains <= minDomains) return;\n setBucketEdits((previous) => ({ ...previous, [primaryBucket.key]: primaryBucket.quantity - 1 }));\n }, [primaryBucket, totalDomains, minDomains]);\n\n const handleIncreaseDomains = useCallback(() => {\n setBucketEdits((previous) => ({ ...previous, [primaryBucket.key]: primaryBucket.quantity + 1 }));\n }, [primaryBucket]);\n\n const handleDomainsChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const requested = Number.parseInt(event.target.value, 10);\n if (Number.isNaN(requested)) return;\n\n // O input mostra o TOTAL (incluso + primary); converte para a quantidade do primary.\n const requestedPrimary = requested - planIncludedDomains;\n const altTotal = domainBuckets\n .filter((bucket) => !bucket.isPrimary)\n .reduce((sum, bucket) => sum + bucket.quantity, 0);\n const minPrimary = Math.max(0, minDomains - planIncludedDomains - altTotal);\n\n setBucketEdits((previous) => ({\n ...previous,\n [primaryBucket.key]: Math.max(minPrimary, requestedPrimary),\n }));\n },\n [minDomains, planIncludedDomains, primaryBucket, domainBuckets]\n );\n\n const handleAlternativeDecrease = useCallback(\n (bucket: AddonBucket) => {\n if (bucket.quantity <= 0) return;\n if (totalDomains - 1 < minDomains) return;\n setBucketEdits((previous) => ({ ...previous, [bucket.key]: bucket.quantity - 1 }));\n },\n [totalDomains, minDomains]\n );\n\n const handleAlternativeIncrease = useCallback((bucket: AddonBucket) => {\n if (bucket.quantity >= bucket.originalQuantity) return;\n setBucketEdits((previous) => ({ ...previous, [bucket.key]: bucket.quantity + 1 }));\n }, []);\n\n const handleApplyCoupon = useCallback(\n (coupon: { id: number; code: string; stripeData?: CouponStripeData | null }) => {\n const stripeData = coupon.stripeData ?? null;\n\n if (!isCouponApplicableToPlan(stripeData, effectivePlanId)) {\n toast.custom((toastId) => (\n <Toast\n variant=\"error\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.couponNotValidForPlan', {\n code: coupon.code,\n })}\n toastId={toastId}\n />\n ));\n return;\n }\n\n const { disabledBillingPeriods: blockedPeriods } = getCouponRestrictions(stripeData);\n if (blockedPeriods.includes(billingPeriod)) {\n toast.custom((toastId) => (\n <Toast\n variant=\"error\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.couponNotValidForPeriod', {\n code: coupon.code,\n })}\n toastId={toastId}\n />\n ));\n return;\n }\n\n setAppliedCouponId(coupon.id);\n setAppliedCouponCode(coupon.code);\n setAppliedCouponStripeData(stripeData);\n },\n [effectivePlanId, billingPeriod, translate]\n );\n\n const handleRemoveCoupon = useCallback(() => {\n setAppliedCouponId(null);\n setAppliedCouponCode(null);\n setAppliedCouponStripeData(null);\n }, []);\n\n useEffect(() => {\n if (!appliedCouponStripeData || effectivePlanId == null) return;\n if (isCouponApplicableToPlan(appliedCouponStripeData, effectivePlanId)) return;\n\n const code = appliedCouponCode;\n handleRemoveCoupon();\n toast.custom((toastId) => (\n <Toast\n variant=\"warning\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.couponRemovedInvalidPlan', {\n code: code ?? '',\n })}\n toastId={toastId}\n />\n ));\n }, [effectivePlanId, appliedCouponStripeData, appliedCouponCode, handleRemoveCoupon, translate]);\n\n useEffect(() => {\n if (!appliedCouponStripeData) return;\n if (!disabledBillingPeriods.includes(billingPeriod)) return;\n\n const code = appliedCouponCode;\n handleRemoveCoupon();\n toast.custom((toastId) => (\n <Toast\n variant=\"warning\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.couponRemovedInvalidPeriod', {\n code: code ?? '',\n })}\n toastId={toastId}\n />\n ));\n }, [\n billingPeriod,\n disabledBillingPeriods,\n appliedCouponStripeData,\n appliedCouponCode,\n handleRemoveCoupon,\n translate,\n ]);\n\n const handleClose = useCallback(() => {\n setCurrentStep(1);\n closeChangePlan();\n }, [closeChangePlan]);\n\n const handleBack = useCallback(() => setCurrentStep((previous) => Math.max(1, previous - 1)), []);\n const handleContinue = useCallback(() => setCurrentStep((previous) => previous + 1), []);\n\n const handleOpenCouponDialog = useCallback(() => setIsCouponDialogOpen(true), []);\n const handleOpenPlansCatalog = useCallback(() => {\n closeChangePlan();\n openPlansCatalog({ appliedCouponStripeData });\n }, [closeChangePlan, openPlansCatalog, appliedCouponStripeData]);\n\n const handleReactivate = useCallback(async () => {\n // Sem plano-alvo é a reativação do mesmo plano; com plano-alvo (veio da vitrine) contrata o\n // escolhido — nos dois casos a assinatura é criada do zero.\n const reactivationPlanId = effectivePlanId ?? activeSubscription?.id_plan;\n if (!reactivationPlanId) return;\n\n // Assinatura já criada esperando o 3DS: reautentica ELA em vez de contratar de novo.\n if (pendingAuthSecret) {\n setIsReactivating(true);\n try {\n await confirmPaymentIfRequired(\n stripe,\n { client_secret: pendingAuthSecret },\n translate('common.payment.authFailed')\n );\n setPendingAuthSecret(null);\n handleClose();\n openPaymentConfirmation({\n planName: targetPlan?.name ?? resolveSubscriptionPlanName(activeSubscription, translate),\n total: totalPrice ?? 0,\n periodLabel: getBillingPeriodSuffix(billingPeriod, translate),\n immediateChargeTotal: null,\n });\n } catch (error) {\n toast.custom((toastId) => (\n <Toast\n variant=\"error\"\n message={\n error instanceof Error ? error.message : translate('common.payment.authFailed')\n }\n toastId={toastId}\n />\n ));\n } finally {\n setIsReactivating(false);\n }\n return;\n }\n\n setIsReactivating(true);\n try {\n const result = await createSubscriptionAsync({\n id_product: activeSubscription?.id_product ?? 1,\n id_plan: reactivationPlanId,\n type: 'client',\n payment_method: paymentMethodToNumeric(paymentMethod),\n periodicity: billingPeriodToNumeric(billingPeriod),\n ...(appliedCouponId != null && { id_coupon: appliedCouponId }),\n ...(paymentMethod === 'card' && selectedCardId ? { id_card: selectedCardId } : {}),\n plan_items: [\n { id_addon: ADDON_IDS.AI, quantity: selectedCredit.credits },\n ...buildDomainPlanExtras(domainBuckets),\n { id_addon: ADDON_IDS.AB_TEST, quantity: abTestPayloadQuantity },\n ],\n });\n\n const created = Array.isArray(result?.data) ? result.data[0] : result?.data;\n handleClose();\n\n if (paymentMethod === 'pix') {\n if (created && isPendingPixCreateSubscriptionResponse(created)) {\n openPixPayment({\n qrCode: created.pix.qr_code ?? null,\n expiresAt: created.pix.expires_at ?? null,\n correlationId: created.pix.correlation_id,\n payNowCents: readProrataValueCents(created),\n });\n } else {\n toast.custom((toastId) => (\n <Toast\n variant=\"error\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.pixNotGenerated')}\n toastId={toastId}\n />\n ));\n }\n return;\n }\n\n // Boleto recém-gerado: abre a linha digitável na hora, sem mandar o cliente procurar na\n // lista de cobranças.\n if (paymentMethod === 'boleto') {\n const createdId = (created as { id?: string | number } | undefined)?.id;\n if (createdId != null) {\n openBoletoGenerated({ subscriptionId: createdId });\n return;\n }\n }\n\n toast.custom((toastId) => (\n <Toast\n variant=\"success\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.planReactivated', {\n planName: targetPlan?.name ?? resolveSubscriptionPlanName(activeSubscription, translate),\n })}\n toastId={toastId}\n />\n ));\n } catch (error) {\n // 3DS recusado com a assinatura já criada: guarda o segredo para a próxima tentativa\n // autenticar a mesma cobrança.\n if (error instanceof PaymentAuthenticationError && error.clientSecret) {\n setPendingAuthSecret(error.clientSecret);\n }\n toast.custom((toastId) => (\n <Toast\n variant=\"error\"\n message={\n error instanceof PaymentAuthenticationError\n ? error.message\n : translate('common.account.workspace.subscription.changePlan.toasts.reactivateError')\n }\n toastId={toastId}\n />\n ));\n } finally {\n setIsReactivating(false);\n }\n }, [\n activeSubscription,\n effectivePlanId,\n targetPlan,\n billingPeriod,\n appliedCouponId,\n selectedCredit,\n domainBuckets,\n abTestPayloadQuantity,\n paymentMethod,\n selectedCardId,\n handleClose,\n createSubscriptionAsync,\n openPixPayment,\n openBoletoGenerated,\n openPaymentConfirmation,\n pendingAuthSecret,\n stripe,\n totalPrice,\n translate,\n ]);\n\n const handleSubmit = useCallback(\n async (formData: ChangePlanFormData) => {\n if (pendingAuthSecret && activeSubscription?.date_cancellation) return handleReactivate();\n\n const periodicity = billingPeriodToNumeric(billingPeriod ?? 'monthly');\n const periodLbl = getBillingPeriodSuffix(billingPeriod ?? 'monthly', translate);\n\n try {\n let createdItem: unknown;\n\n if (activeSubscription?.date_cancellation) {\n const result = await createSubscriptionAsync({\n id_product: activeSubscription.id_product,\n id_plan: effectivePlanId!,\n type: 'client',\n payment_method: paymentMethodToNumeric(formData.paymentMethod),\n periodicity,\n ...(appliedCouponId != null && { id_coupon: appliedCouponId }),\n ...(formData.paymentMethod === 'card' && formData.selectedCardId\n ? { id_card: formData.selectedCardId }\n : {}),\n plan_items: [\n { id_addon: ADDON_IDS.AI, quantity: selectedCredit.credits },\n ...buildDomainPlanExtras([...domainBuckets, ...zeroedOldDomainBuckets]),\n { id_addon: ADDON_IDS.AB_TEST, quantity: abTestPayloadQuantity },\n ],\n });\n createdItem = Array.isArray(result?.data) ? result.data[0] : result?.data;\n } else {\n const updateData: UpdateSubscriptionPlanRequest =\n pendingAuthSecret && pendingUpdatePayloadRef.current\n ? pendingUpdatePayloadRef.current\n : {\n id_plan: effectivePlanId,\n periodicity,\n enable_charge: true,\n payment_method: paymentMethodToNumeric(formData.paymentMethod),\n ...(appliedCouponId != null && { id_coupon: appliedCouponId }),\n ...(formData.paymentMethod === 'card' && formData.selectedCardId\n ? { id_card: formData.selectedCardId }\n : {}),\n plan_extras: [\n { id_addon: ADDON_IDS.AI, quantity: selectedCredit.credits },\n ...buildDomainPlanExtras([...domainBuckets, ...zeroedOldDomainBuckets]),\n { id_addon: ADDON_IDS.AB_TEST, quantity: abTestPayloadQuantity },\n ],\n };\n pendingUpdatePayloadRef.current = updateData;\n\n const result = await updatePlanAsync({\n subscriptionId: activeSubscription!.id,\n data: updateData,\n });\n createdItem = Array.isArray(result?.data) ? result.data[0] : result?.data;\n pendingUpdatePayloadRef.current = null;\n }\n\n handleClose();\n\n // Pix pendente tem precedência: o backend devolve a estrutura quando precisa gerar o QR.\n if (createdItem && isPendingPixCreateSubscriptionResponse(createdItem)) {\n if (formData.paymentMethod !== 'pix') {\n // Pix pendente com cartão/boleto significa que o plano não foi aplicado.\n toast.custom((toastId) => (\n <Toast\n variant=\"error\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.updateError')}\n toastId={toastId}\n />\n ));\n return;\n }\n\n openPixPayment({\n qrCode: createdItem.pix.qr_code ?? null,\n expiresAt: createdItem.pix.expires_at ?? null,\n correlationId: createdItem.pix.correlation_id,\n payNowCents: readProrataValueCents(createdItem),\n });\n return;\n }\n\n // Sem cobrança imediata (downgrade/alteração agendada): só confirma a atualização.\n if ((immediateCharge?.total ?? 0) <= 0) {\n toast.custom((toastId) => (\n <Toast\n variant=\"success\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.planUpdated')}\n toastId={toastId}\n />\n ));\n return;\n }\n\n if (formData.paymentMethod === 'pix') {\n toast.custom((toastId) => (\n <Toast\n variant=\"error\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.pixNotGenerated')}\n toastId={toastId}\n />\n ));\n return;\n }\n\n if (formData.paymentMethod === 'boleto') {\n // O boleto sai na fatura gerada — o cliente abre os dados pela lista de cobranças.\n toast.custom((toastId) => (\n <Toast\n variant=\"success\"\n message={translate('common.account.workspace.subscription.changePlan.toasts.boletoGenerated')}\n toastId={toastId}\n />\n ));\n return;\n }\n\n openPaymentConfirmation({\n planName: effectivePlan?.name,\n total: totalPrice ?? 0,\n periodLabel: periodLbl,\n immediateChargeTotal: immediateCharge?.total ?? null,\n });\n } catch (error) {\n if (error instanceof PaymentAuthenticationError && error.clientSecret) {\n setPendingAuthSecret(error.clientSecret);\n }\n const message =\n error instanceof Error\n ? error.message\n : translate('common.account.workspace.subscription.changePlan.toasts.updateError');\n toast.custom((toastId) => <Toast variant=\"error\" message={message} toastId={toastId} />);\n }\n },\n [\n pendingAuthSecret,\n handleReactivate,\n activeSubscription,\n billingPeriod,\n createSubscriptionAsync,\n effectivePlanId,\n effectivePlan,\n totalPrice,\n handleClose,\n updatePlanAsync,\n appliedCouponId,\n selectedCredit,\n domainBuckets,\n zeroedOldDomainBuckets,\n abTestPayloadQuantity,\n immediateCharge,\n openPixPayment,\n openPaymentConfirmation,\n translate,\n ]\n );\n\n return {\n open,\n isReactivation,\n isDowngrade,\n currentStep,\n handleBack,\n handleContinue,\n handleClose,\n form,\n paymentMethod,\n selectedCardId,\n isSubmitting,\n // Base do extrato do resumo: PRÉ-desconto de periodicidade — o extrato desconta periodicidade\n // e cupom em linhas próprias, então usar o total líquido aqui subtrairia duas vezes.\n newPlanPrice: targetPlan?.pricingByPeriod\n ? targetPlan.pricingByPeriod.monthly * periodMonths\n : !isReactivation && currentPlan?.value != null\n ? currentPlan.value * periodMonths\n : null,\n // Total líquido do plano-alvo no período, para o card de comparação.\n newPlanChargedPrice: targetPlan?.pricing\n ? targetPlan.pricing[periodPricingKey].charged\n : !isReactivation && currentPlan?.pricing\n ? currentPlan.pricing[periodPricingKey].charged\n : !isReactivation && currentPlan?.value != null\n ? currentPlan.value * periodMonths\n : null,\n // Riscado do preview: `list` do MESMO período do charged, nunca a âncora mensal x meses.\n newPlanListPrice: targetPlan?.pricing\n ? targetPlan.pricing[periodPricingKey].list\n : !isReactivation && currentPlan?.pricing\n ? currentPlan.pricing[periodPricingKey].list\n : null,\n planName: isReactivation ? (targetPlan?.name ?? null) : (effectivePlan?.name ?? null),\n wlName,\n cards,\n resolvedAddonCardId,\n activeCardIdAddon,\n setActiveCardIdAddon,\n selectedCreditIndex,\n setSelectedCreditIndex,\n selectedCredit,\n aiCreditOptions,\n domains,\n minDomains,\n domainsCountLoading,\n planIncludedDomains,\n extraDomains,\n isAtMin,\n hasDomainsAddon,\n domainBuckets,\n primaryBucket,\n alternativeBuckets,\n hasAlternativeBuckets,\n canDecreaseTotal: totalDomains > minDomains,\n handleAlternativeDecrease,\n handleAlternativeIncrease,\n domainPriceMonthly,\n handleDecreaseDomains,\n handleIncreaseDomains,\n handleDomainsChange,\n abTestEnabled,\n setAbTestEnabled,\n hasAbTestAddon,\n abTestIncludedInPlan,\n abTestPriceMonthly,\n handleApplyCoupon,\n handleRemoveCoupon,\n handleOpenCouponDialog,\n isCouponDialogOpen,\n setIsCouponDialogOpen,\n handleOpenPlansCatalog,\n appliedCouponStripeData,\n disabledBillingPeriods,\n disabledPaymentMethods,\n allowedBillingPeriod,\n allowedPaymentMethod,\n couponUnlocksAllMethods,\n allowBoletoFromCurrentSubscription,\n allowPixFromCurrentSubscription,\n boletoAvailable,\n pixAvailable,\n paymentMethodFromSubscription,\n hasChangedPaymentMethod,\n appliedCouponCode,\n isCalculating,\n totalPrice,\n discountAmount,\n couponDiscountAmount,\n billingPeriod,\n modalBillingPeriod,\n billingLabel,\n billingLabelFull,\n periodMonths,\n periodLabel,\n currentBillingPeriod,\n currentPeriodLabel,\n handleSubmit,\n handleReactivate,\n isReactivating,\n hasPendingAuth: pendingAuthSecret !== null,\n canReactivate: effectivePlanId != null,\n requiresBillingData,\n openBillingAddress,\n contractingBillingPeriod: billingPeriod,\n setContractingBillingPeriod,\n calculatedPricing,\n billingDiscounts,\n firstPeriodPricingByPeriod,\n planPricing: targetPlan?.pricing ?? null,\n abTestDetailsOpen,\n setAbTestDetailsOpen,\n getPeriodicityLabel,\n targetPlan,\n immediateCharge,\n calculatedPlanExtras: calculatedData?.plan_extras ?? [],\n hasChanges,\n formatCurrencyNumber,\n };\n}\n"],"mappings":"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","names":["subscriptionCardId"]}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Fragment, useEffect } from "react";
|
|
4
|
+
import { IconCheck, IconLoader, IconX } from "@tabler/icons-react";
|
|
5
|
+
import { useTranslations } from "next-intl";
|
|
6
|
+
import { Button } from "../../../../ui/buttons/Button";
|
|
7
|
+
import {
|
|
8
|
+
Dialog,
|
|
9
|
+
DialogContent,
|
|
10
|
+
DialogDescription,
|
|
11
|
+
DialogTitle
|
|
12
|
+
} from "../../../../ui/overlay/Dialog";
|
|
13
|
+
import { useCountDomains } from "../../../../../modules/domains/hooks/count-domains.hook";
|
|
14
|
+
import { useCountPublishedPages } from "../../../../../modules/pages/hooks/count-published-pages.hook";
|
|
15
|
+
import { useWhitelabelUrls } from "../../../../../providers/whitelabel.provider";
|
|
16
|
+
import { cn } from "../../../../../infra/utils/clsx";
|
|
17
|
+
import { useSubscriptionFlows } from "../../../../../store/useSubscriptionFlows";
|
|
18
|
+
function CannotDowngradeDialog() {
|
|
19
|
+
const translate = useTranslations();
|
|
20
|
+
const translateDialog = useTranslations(
|
|
21
|
+
"common.account.workspace.subscription.cannotDowngrade"
|
|
22
|
+
);
|
|
23
|
+
const { pagesUrl } = useWhitelabelUrls();
|
|
24
|
+
const data = useSubscriptionFlows((state) => state.cannotDowngrade);
|
|
25
|
+
const close = useSubscriptionFlows((state) => state.closeCannotDowngrade);
|
|
26
|
+
const updateCannotDowngrade = useSubscriptionFlows((state) => state.updateCannotDowngrade);
|
|
27
|
+
const openChangePlan = useSubscriptionFlows((state) => state.openChangePlan);
|
|
28
|
+
const open = !!data;
|
|
29
|
+
const planName = data?.planName ?? "";
|
|
30
|
+
const planIncludedDomains = data?.planIncludedDomains ?? 0;
|
|
31
|
+
const planIncludedPages = data?.planIncludedPages ?? null;
|
|
32
|
+
const tracksDomains = data?.domainsExceeded ?? false;
|
|
33
|
+
const tracksPages = data?.pagesExceeded ?? false;
|
|
34
|
+
const { data: registeredDomains, refetch: refetchDomains } = useCountDomains({ enabled: open });
|
|
35
|
+
const { data: publishedPagesCount, refetch: refetchPages } = useCountPublishedPages({
|
|
36
|
+
enabled: open
|
|
37
|
+
});
|
|
38
|
+
const currentDomains = registeredDomains ?? data?.registeredDomains ?? 0;
|
|
39
|
+
const publishedPages = publishedPagesCount ?? 0;
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (!open) return;
|
|
42
|
+
const recount = () => {
|
|
43
|
+
if (document.visibilityState !== "visible") return;
|
|
44
|
+
refetchDomains();
|
|
45
|
+
refetchPages();
|
|
46
|
+
};
|
|
47
|
+
window.addEventListener("focus", recount);
|
|
48
|
+
document.addEventListener("visibilitychange", recount);
|
|
49
|
+
return () => {
|
|
50
|
+
window.removeEventListener("focus", recount);
|
|
51
|
+
document.removeEventListener("visibilitychange", recount);
|
|
52
|
+
};
|
|
53
|
+
}, [open, refetchDomains, refetchPages]);
|
|
54
|
+
const domainsOverLimit = currentDomains > planIncludedDomains;
|
|
55
|
+
const rawPagesOverLimit = planIncludedPages != null && publishedPages > planIncludedPages;
|
|
56
|
+
const pagesOverLimit = !domainsOverLimit && rawPagesOverLimit;
|
|
57
|
+
const excessDomains = Math.max(0, currentDomains - planIncludedDomains);
|
|
58
|
+
const excessPages = planIncludedPages != null ? Math.max(0, publishedPages - planIncludedPages) : 0;
|
|
59
|
+
const readyToFinish = !domainsOverLimit && !pagesOverLimit;
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!open) return;
|
|
62
|
+
const promote = {
|
|
63
|
+
...domainsOverLimit && !tracksDomains ? { domainsExceeded: true } : {},
|
|
64
|
+
...pagesOverLimit && !tracksPages ? { pagesExceeded: true } : {}
|
|
65
|
+
};
|
|
66
|
+
if (Object.keys(promote).length > 0) updateCannotDowngrade(promote);
|
|
67
|
+
}, [open, domainsOverLimit, pagesOverLimit, tracksDomains, tracksPages, updateCannotDowngrade]);
|
|
68
|
+
const openInPagesApp = (path) => {
|
|
69
|
+
const base = pagesUrl.replace(/\/$/, "");
|
|
70
|
+
if (!base) return;
|
|
71
|
+
window.open(`${base}${path}`, "_blank", "noopener,noreferrer");
|
|
72
|
+
};
|
|
73
|
+
const handleFinish = () => {
|
|
74
|
+
if (!data) return;
|
|
75
|
+
openChangePlan({
|
|
76
|
+
targetPlan: data.targetPlan,
|
|
77
|
+
billingPeriod: data.billingPeriod,
|
|
78
|
+
isDowngrade: true,
|
|
79
|
+
selectedCreditIndex: 0
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
const alert = readyToFinish ? translateDialog("alertReady", { planName }) : [
|
|
83
|
+
...domainsOverLimit ? [
|
|
84
|
+
planIncludedDomains > 0 ? translateDialog("alertDomains", {
|
|
85
|
+
planName,
|
|
86
|
+
registeredDomains: currentDomains,
|
|
87
|
+
planIncludedDomains
|
|
88
|
+
}) : translateDialog("alertDomainsNone", {
|
|
89
|
+
planName,
|
|
90
|
+
registeredDomains: currentDomains
|
|
91
|
+
})
|
|
92
|
+
] : [],
|
|
93
|
+
...pagesOverLimit ? [
|
|
94
|
+
translateDialog("alertPages", {
|
|
95
|
+
planName,
|
|
96
|
+
publishedPages,
|
|
97
|
+
planIncludedPages: planIncludedPages ?? 0
|
|
98
|
+
})
|
|
99
|
+
] : [],
|
|
100
|
+
translateDialog("alertReviewSteps")
|
|
101
|
+
].join(" ");
|
|
102
|
+
const bothTracked = tracksDomains && tracksPages;
|
|
103
|
+
const stepOrder = [
|
|
104
|
+
...tracksDomains ? [{ key: "domains", resolved: !domainsOverLimit }] : [],
|
|
105
|
+
...tracksPages ? [{ key: "pages", resolved: !rawPagesOverLimit }] : [],
|
|
106
|
+
{ key: "confirm", resolved: false }
|
|
107
|
+
];
|
|
108
|
+
const activeIndex = stepOrder.findIndex((step) => !step.resolved);
|
|
109
|
+
const steps = stepOrder.map((step, index) => {
|
|
110
|
+
const status = index === activeIndex ? "active" : index < activeIndex ? "done" : "locked";
|
|
111
|
+
if (step.key === "domains") {
|
|
112
|
+
return {
|
|
113
|
+
key: step.key,
|
|
114
|
+
title: bothTracked ? translateDialog("stepDomainsTitle") : translateDialog("stepReviewTitle"),
|
|
115
|
+
subtitle: status === "done" ? translateDialog("stepDomainsDone") : translateDialog("stepDomainsSubtitle", { count: excessDomains }),
|
|
116
|
+
action: translateDialog("stepDomainsAction", { count: excessDomains }),
|
|
117
|
+
status,
|
|
118
|
+
onAction: status === "active" ? () => openInPagesApp("/domains") : void 0
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (step.key === "pages") {
|
|
122
|
+
return {
|
|
123
|
+
key: step.key,
|
|
124
|
+
title: bothTracked ? translateDialog("stepPagesTitle") : translateDialog("stepReviewTitle"),
|
|
125
|
+
subtitle: status === "done" ? translateDialog("stepPagesDone") : translateDialog("stepPagesSubtitle", { limit: planIncludedPages ?? 0 }),
|
|
126
|
+
action: translateDialog("stepPagesAction", { count: excessPages }),
|
|
127
|
+
status,
|
|
128
|
+
onAction: status === "active" ? () => openInPagesApp("") : void 0
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
key: step.key,
|
|
133
|
+
title: translateDialog("stepConfirmTitle"),
|
|
134
|
+
subtitle: translateDialog("stepConfirmSubtitle"),
|
|
135
|
+
action: translateDialog("stepConfirmAction"),
|
|
136
|
+
status,
|
|
137
|
+
onAction: status === "active" && readyToFinish ? handleFinish : void 0
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: (nextOpen) => !nextOpen && close(), children: /* @__PURE__ */ jsxs(
|
|
141
|
+
DialogContent,
|
|
142
|
+
{
|
|
143
|
+
showCloseButton: false,
|
|
144
|
+
className: "flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-135! lg:max-w-150! rounded-lg border",
|
|
145
|
+
children: [
|
|
146
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex h-14 md:h-16 items-center justify-center px-4 py-3", children: [
|
|
147
|
+
/* @__PURE__ */ jsx(DialogTitle, { className: "paragraph-medium-semibold text-zinc-950 text-center", children: translateDialog("heading", { planName }) }),
|
|
148
|
+
/* @__PURE__ */ jsxs(
|
|
149
|
+
"button",
|
|
150
|
+
{
|
|
151
|
+
type: "button",
|
|
152
|
+
onClick: close,
|
|
153
|
+
className: "absolute right-3 md:right-4 size-8 flex items-center justify-center rounded-lg cursor-pointer hover:bg-zinc-100 transition-colors focus:outline-none",
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ jsx(IconX, { size: 18, className: "text-zinc-400" }),
|
|
156
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: translate("common.actions.close") })
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
] }),
|
|
161
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 px-4 pb-4 lg:px-6 lg:pb-6", children: [
|
|
162
|
+
/* @__PURE__ */ jsx("div", { className: cn("rounded-lg p-4", readyToFinish ? "bg-green-50" : "bg-red-50"), children: /* @__PURE__ */ jsx(DialogDescription, { className: "paragraph-small-regular text-zinc-950", children: alert }) }),
|
|
163
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-5 rounded-xl border border-zinc-200 p-4 lg:p-5", children: steps.map((step, index) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
164
|
+
index > 0 && /* @__PURE__ */ jsx("div", { className: "h-px bg-zinc-200 ml-14" }),
|
|
165
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start gap-4", children: [
|
|
166
|
+
/* @__PURE__ */ jsx(
|
|
167
|
+
"span",
|
|
168
|
+
{
|
|
169
|
+
className: cn(
|
|
170
|
+
"mt-0.5 flex size-10 shrink-0 items-center justify-center rounded-full",
|
|
171
|
+
step.status === "done" ? "bg-green-50" : "bg-zinc-50"
|
|
172
|
+
),
|
|
173
|
+
children: step.status === "done" ? /* @__PURE__ */ jsx(IconCheck, { size: 20, className: "text-green-600" }) : step.status === "active" ? (
|
|
174
|
+
/* Só a etapa ativa gira — mesmo ritmo do spinner de propagação de domínio. */
|
|
175
|
+
/* @__PURE__ */ jsx(
|
|
176
|
+
IconLoader,
|
|
177
|
+
{
|
|
178
|
+
size: 20,
|
|
179
|
+
className: "animate-spin text-zinc-950",
|
|
180
|
+
style: { animationDuration: "10s" }
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
) : (
|
|
184
|
+
/* Travada: parada e apagada, esperando as etapas anteriores. */
|
|
185
|
+
/* @__PURE__ */ jsx(IconLoader, { size: 20, className: "text-zinc-400" })
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
),
|
|
189
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col gap-3 min-w-0", children: [
|
|
190
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
191
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold text-zinc-950", children: step.title }),
|
|
192
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-regular text-zinc-500", children: step.subtitle })
|
|
193
|
+
] }),
|
|
194
|
+
step.status !== "done" && /* @__PURE__ */ jsx(
|
|
195
|
+
Button,
|
|
196
|
+
{
|
|
197
|
+
type: "button",
|
|
198
|
+
variant: step.key === "confirm" ? "default" : "secondary",
|
|
199
|
+
className: "h-8 w-fit px-3",
|
|
200
|
+
disabled: !step.onAction,
|
|
201
|
+
onClick: step.onAction,
|
|
202
|
+
children: step.action
|
|
203
|
+
}
|
|
204
|
+
)
|
|
205
|
+
] })
|
|
206
|
+
] })
|
|
207
|
+
] }, step.key)) })
|
|
208
|
+
] })
|
|
209
|
+
]
|
|
210
|
+
}
|
|
211
|
+
) });
|
|
212
|
+
}
|
|
213
|
+
export {
|
|
214
|
+
CannotDowngradeDialog
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=CannotDowngradeDialog.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/account/sections/subscription/downgrade/CannotDowngradeDialog.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment, useEffect } from 'react';\nimport { IconCheck, IconLoader, IconX } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { Button } from '../../../../ui/buttons/Button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n} from '../../../../ui/overlay/Dialog';\nimport { useCountDomains } from '../../../../../modules/domains/hooks/count-domains.hook';\nimport { useCountPublishedPages } from '../../../../../modules/pages/hooks/count-published-pages.hook';\nimport { useWhitelabelUrls } from '../../../../../providers/whitelabel.provider';\nimport { cn } from '../../../../../infra/utils/clsx';\nimport { useSubscriptionFlows } from '../../../../../store/useSubscriptionFlows';\n\n/**\n * Estado de cada etapa do roteiro sequencial:\n * done = check verde · active = spinner girando + botão liberado ·\n * locked = spinner parado + botão desabilitado, à espera das etapas anteriores.\n */\ntype StepStatus = 'done' | 'active' | 'locked';\n\ntype DowngradeStep = {\n key: string;\n title: string;\n subtitle: string;\n action: string;\n status: StepStatus;\n /** Presente apenas na etapa ativa. */\n onAction?: () => void;\n};\n\n/** Roteiro do que a conta precisa ajustar antes de caber no plano mais barato. */\nexport function CannotDowngradeDialog() {\n const translate = useTranslations();\n const translateDialog = useTranslations(\n 'common.account.workspace.subscription.cannotDowngrade'\n );\n const { pagesUrl } = useWhitelabelUrls();\n\n const data = useSubscriptionFlows((state) => state.cannotDowngrade);\n const close = useSubscriptionFlows((state) => state.closeCannotDowngrade);\n const updateCannotDowngrade = useSubscriptionFlows((state) => state.updateCannotDowngrade);\n const openChangePlan = useSubscriptionFlows((state) => state.openChangePlan);\n\n const open = !!data;\n const planName = data?.planName ?? '';\n const planIncludedDomains = data?.planIncludedDomains ?? 0;\n const planIncludedPages = data?.planIncludedPages ?? null;\n\n // Recursos com etapa na tela — persistidos no payload, para a etapa não sumir ao ser\n // resolvida nem quando um excedente só é descoberto com o roteiro já aberto.\n const tracksDomains = data?.domainsExceeded ?? false;\n const tracksPages = data?.pagesExceeded ?? false;\n\n // Contagens ao vivo: o ajuste acontece fora daqui, então precisam ser reconferidas.\n const { data: registeredDomains, refetch: refetchDomains } = useCountDomains({ enabled: open });\n const { data: publishedPagesCount, refetch: refetchPages } = useCountPublishedPages({\n enabled: open,\n });\n\n const currentDomains = registeredDomains ?? data?.registeredDomains ?? 0;\n const publishedPages = publishedPagesCount ?? 0;\n\n // Volta do app de páginas: reconfere as duas contagens — tanto para destravar etapas já\n // resolvidas quanto para revelar limites que só estouram depois de um ajuste.\n useEffect(() => {\n if (!open) return;\n\n const recount = () => {\n if (document.visibilityState !== 'visible') return;\n refetchDomains();\n refetchPages();\n };\n\n window.addEventListener('focus', recount);\n document.addEventListener('visibilitychange', recount);\n\n return () => {\n window.removeEventListener('focus', recount);\n document.removeEventListener('visibilitychange', recount);\n };\n }, [open, refetchDomains, refetchPages]);\n\n // Vale o incluso no plano alvo — no downgrade não há a válvula dos domínios extras pagos.\n const domainsOverLimit = currentDomains > planIncludedDomains;\n const rawPagesOverLimit = planIncludedPages != null && publishedPages > planIncludedPages;\n // Páginas só são avaliadas com os domínios dentro do limite: antes disso a conta ainda\n // contém as páginas dos domínios que serão apagados, e o excedente seria falso positivo.\n const pagesOverLimit = !domainsOverLimit && rawPagesOverLimit;\n const excessDomains = Math.max(0, currentDomains - planIncludedDomains);\n const excessPages = planIncludedPages != null ? Math.max(0, publishedPages - planIncludedPages) : 0;\n const readyToFinish = !domainsOverLimit && !pagesOverLimit;\n\n // Excedente descoberto ao vivo vira etapa do roteiro: o latch mora no payload do fluxo, não\n // em estado local — uma vez na tela a etapa fica, e ao ser resolvida vira check.\n useEffect(() => {\n if (!open) return;\n\n const promote = {\n ...(domainsOverLimit && !tracksDomains ? { domainsExceeded: true } : {}),\n ...(pagesOverLimit && !tracksPages ? { pagesExceeded: true } : {}),\n };\n if (Object.keys(promote).length > 0) updateCannotDowngrade(promote);\n }, [open, domainsOverLimit, pagesOverLimit, tracksDomains, tracksPages, updateCannotDowngrade]);\n\n // Abre em outra aba de propósito: o roteiro continua aqui esperando o ajuste terminar.\n const openInPagesApp = (path: string) => {\n const base = pagesUrl.replace(/\\/$/, '');\n if (!base) return;\n window.open(`${base}${path}`, '_blank', 'noopener,noreferrer');\n };\n\n // Conta ajustada: segue para a troca, que mostra o que se perde e depois o pagamento.\n const handleFinish = () => {\n if (!data) return;\n\n openChangePlan({\n targetPlan: data.targetPlan,\n billingPeriod: data.billingPeriod,\n isDowngrade: true,\n selectedCreditIndex: 0,\n });\n };\n\n // Uma frase por recurso ainda excedido + a instrução final, num único parágrafo. Resolvido\n // tudo, o aviso vermelho passaria a se contradizer — vira confirmação.\n const alert = readyToFinish\n ? translateDialog('alertReady', { planName })\n : [\n ...(domainsOverLimit\n ? [\n planIncludedDomains > 0\n ? translateDialog('alertDomains', {\n planName,\n registeredDomains: currentDomains,\n planIncludedDomains,\n })\n : translateDialog('alertDomainsNone', {\n planName,\n registeredDomains: currentDomains,\n }),\n ]\n : []),\n ...(pagesOverLimit\n ? [\n translateDialog('alertPages', {\n planName,\n publishedPages,\n planIncludedPages: planIncludedPages ?? 0,\n }),\n ]\n : []),\n translateDialog('alertReviewSteps'),\n ].join(' ');\n\n // Com os dois recursos estourados o título genérico repetiria — aí nomeia cada um.\n const bothTracked = tracksDomains && tracksPages;\n\n // Stepper sequencial: a primeira etapa pendente é a ativa; concluir uma libera a seguinte.\n // Uma etapa resolvida DEPOIS da ativa fica travada mesmo assim — sua resolução só é\n // confiável quando chega a vez dela (ex.: páginas antes dos domínios).\n const stepOrder = [\n ...(tracksDomains ? [{ key: 'domains' as const, resolved: !domainsOverLimit }] : []),\n ...(tracksPages ? [{ key: 'pages' as const, resolved: !rawPagesOverLimit }] : []),\n { key: 'confirm' as const, resolved: false },\n ];\n // Sempre existe: a confirmação nunca se resolve sozinha.\n const activeIndex = stepOrder.findIndex((step) => !step.resolved);\n\n const steps: DowngradeStep[] = stepOrder.map((step, index) => {\n const status: StepStatus =\n index === activeIndex ? 'active' : index < activeIndex ? 'done' : 'locked';\n\n if (step.key === 'domains') {\n return {\n key: step.key,\n title: bothTracked ? translateDialog('stepDomainsTitle') : translateDialog('stepReviewTitle'),\n subtitle:\n status === 'done'\n ? translateDialog('stepDomainsDone')\n : translateDialog('stepDomainsSubtitle', { count: excessDomains }),\n action: translateDialog('stepDomainsAction', { count: excessDomains }),\n status,\n onAction: status === 'active' ? () => openInPagesApp('/domains') : undefined,\n };\n }\n\n if (step.key === 'pages') {\n return {\n key: step.key,\n title: bothTracked ? translateDialog('stepPagesTitle') : translateDialog('stepReviewTitle'),\n subtitle:\n status === 'done'\n ? translateDialog('stepPagesDone')\n : translateDialog('stepPagesSubtitle', { limit: planIncludedPages ?? 0 }),\n action: translateDialog('stepPagesAction', { count: excessPages }),\n status,\n onAction: status === 'active' ? () => openInPagesApp('') : undefined,\n };\n }\n\n return {\n key: step.key,\n title: translateDialog('stepConfirmTitle'),\n subtitle: translateDialog('stepConfirmSubtitle'),\n action: translateDialog('stepConfirmAction'),\n status,\n onAction: status === 'active' && readyToFinish ? handleFinish : undefined,\n };\n });\n\n return (\n <Dialog open={open} onOpenChange={(nextOpen) => !nextOpen && close()}>\n <DialogContent\n showCloseButton={false}\n className=\"flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-135! lg:max-w-150! rounded-lg border\"\n >\n <div className=\"relative flex h-14 md:h-16 items-center justify-center px-4 py-3\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950 text-center\">\n {translateDialog('heading', { planName })}\n </DialogTitle>\n <button\n type=\"button\"\n onClick={close}\n className=\"absolute right-3 md:right-4 size-8 flex items-center justify-center rounded-lg cursor-pointer hover:bg-zinc-100 transition-colors focus:outline-none\"\n >\n <IconX size={18} className=\"text-zinc-400\" />\n <span className=\"sr-only\">{translate('common.actions.close')}</span>\n </button>\n </div>\n\n <div className=\"flex flex-col gap-3 px-4 pb-4 lg:px-6 lg:pb-6\">\n <div className={cn('rounded-lg p-4', readyToFinish ? 'bg-green-50' : 'bg-red-50')}>\n <DialogDescription className=\"paragraph-small-regular text-zinc-950\">\n {alert}\n </DialogDescription>\n </div>\n\n <div className=\"flex flex-col gap-5 rounded-xl border border-zinc-200 p-4 lg:p-5\">\n {steps.map((step, index) => (\n <Fragment key={step.key}>\n {index > 0 && <div className=\"h-px bg-zinc-200 ml-14\" />}\n\n <div className=\"flex items-start gap-4\">\n {/* Centralizado no bloco de texto (44px), não na linha inteira. */}\n <span\n className={cn(\n 'mt-0.5 flex size-10 shrink-0 items-center justify-center rounded-full',\n step.status === 'done' ? 'bg-green-50' : 'bg-zinc-50'\n )}\n >\n {step.status === 'done' ? (\n <IconCheck size={20} className=\"text-green-600\" />\n ) : step.status === 'active' ? (\n /* Só a etapa ativa gira — mesmo ritmo do spinner de propagação de domínio. */\n <IconLoader\n size={20}\n className=\"animate-spin text-zinc-950\"\n style={{ animationDuration: '10s' }}\n />\n ) : (\n /* Travada: parada e apagada, esperando as etapas anteriores. */\n <IconLoader size={20} className=\"text-zinc-400\" />\n )}\n </span>\n\n <div className=\"flex flex-1 flex-col gap-3 min-w-0\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"paragraph-small-semibold text-zinc-950\">{step.title}</span>\n <span className=\"paragraph-small-regular text-zinc-500\">{step.subtitle}</span>\n </div>\n\n {step.status !== 'done' && (\n <Button\n type=\"button\"\n variant={step.key === 'confirm' ? 'default' : 'secondary'}\n className=\"h-8 w-fit px-3\"\n disabled={!step.onAction}\n onClick={step.onAction}\n >\n {step.action}\n </Button>\n )}\n </div>\n </div>\n </Fragment>\n ))}\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { useTranslations } from "next-intl";
|
|
5
|
+
import { Button } from "../../../../ui/buttons/Button";
|
|
6
|
+
import { RadioGroup, RadioGroupItem } from "../../../../ui/form/RadioGroup";
|
|
7
|
+
import {
|
|
8
|
+
Dialog,
|
|
9
|
+
DialogContent,
|
|
10
|
+
DialogDescription,
|
|
11
|
+
DialogTitle
|
|
12
|
+
} from "../../../../ui/overlay/Dialog";
|
|
13
|
+
import { useCountPublishedPages } from "../../../../../modules/pages/hooks/count-published-pages.hook";
|
|
14
|
+
import {
|
|
15
|
+
DOWNGRADE_REASONS,
|
|
16
|
+
DOWNGRADE_REASON_OTHER,
|
|
17
|
+
getDowngradeReasonLabels
|
|
18
|
+
} from "../../../../../modules/subscriptions/constants/downgrade.constants";
|
|
19
|
+
import { useWhitelabel } from "../../../../../providers/whitelabel.provider";
|
|
20
|
+
import { cn } from "../../../../../infra/utils/clsx";
|
|
21
|
+
import { useSubscriptionFlows } from "../../../../../store/useSubscriptionFlows";
|
|
22
|
+
function DowngradeReasonDialog() {
|
|
23
|
+
const translate = useTranslations();
|
|
24
|
+
const translateDialog = useTranslations(
|
|
25
|
+
"common.account.workspace.subscription.changePlan.downgradeReason"
|
|
26
|
+
);
|
|
27
|
+
const { whitelabel } = useWhitelabel();
|
|
28
|
+
const data = useSubscriptionFlows((state) => state.downgradeReason);
|
|
29
|
+
const close = useSubscriptionFlows((state) => state.closeDowngradeReason);
|
|
30
|
+
const openCannotDowngrade = useSubscriptionFlows((state) => state.openCannotDowngrade);
|
|
31
|
+
const openChangePlan = useSubscriptionFlows((state) => state.openChangePlan);
|
|
32
|
+
const reasonLabels = getDowngradeReasonLabels(translate);
|
|
33
|
+
const [selectedReason, setSelectedReason] = useState("");
|
|
34
|
+
const [reasonText, setReasonText] = useState("");
|
|
35
|
+
const { data: publishedPagesCount, isPending: isPagesPending } = useCountPublishedPages({
|
|
36
|
+
enabled: !!data
|
|
37
|
+
});
|
|
38
|
+
const canContinue = !!selectedReason && (selectedReason !== DOWNGRADE_REASON_OTHER || !!reasonText.trim());
|
|
39
|
+
const handleClose = () => {
|
|
40
|
+
setSelectedReason("");
|
|
41
|
+
setReasonText("");
|
|
42
|
+
close();
|
|
43
|
+
};
|
|
44
|
+
const handleContinue = () => {
|
|
45
|
+
if (!data) return;
|
|
46
|
+
const publishedPages = publishedPagesCount ?? 0;
|
|
47
|
+
const domainsExceeded = data.registeredDomains > data.planIncludedDomains;
|
|
48
|
+
const pagesExceeded = !domainsExceeded && data.planIncludedPages != null && publishedPages > data.planIncludedPages;
|
|
49
|
+
if (domainsExceeded || pagesExceeded) {
|
|
50
|
+
openCannotDowngrade({ ...data, domainsExceeded, pagesExceeded });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
handleClose();
|
|
54
|
+
openChangePlan({
|
|
55
|
+
targetPlan: data.targetPlan,
|
|
56
|
+
billingPeriod: data.billingPeriod,
|
|
57
|
+
isDowngrade: true,
|
|
58
|
+
selectedCreditIndex: 0
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
return /* @__PURE__ */ jsx(Dialog, { open: !!data, onOpenChange: (nextOpen) => !nextOpen && handleClose(), children: /* @__PURE__ */ jsxs(DialogContent, { className: "flex flex-col p-0 gap-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-117.5 lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-y-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300", children: [
|
|
62
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5 p-4 lg:p-5 flex-1 lg:flex-none", children: [
|
|
63
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
64
|
+
/* @__PURE__ */ jsx(DialogTitle, { className: "paragraph-medium-semibold text-zinc-950", children: translateDialog("title") }),
|
|
65
|
+
/* @__PURE__ */ jsx(DialogDescription, { className: "paragraph-small-regular text-zinc-500", children: translateDialog("subtitle", { wlName: whitelabel?.name ?? "" }) })
|
|
66
|
+
] }),
|
|
67
|
+
/* @__PURE__ */ jsx(RadioGroup, { value: selectedReason, onValueChange: setSelectedReason, children: /* @__PURE__ */ jsx("div", { className: "flex flex-col border border-zinc-200 rounded-lg overflow-hidden", children: DOWNGRADE_REASONS.map((reason, index) => /* @__PURE__ */ jsxs(
|
|
68
|
+
"label",
|
|
69
|
+
{
|
|
70
|
+
htmlFor: `downgrade-reason-${reason}`,
|
|
71
|
+
className: cn(
|
|
72
|
+
"flex items-center justify-between px-4 py-3.5 lg:px-5 lg:py-6 cursor-pointer hover:bg-zinc-50 transition-colors",
|
|
73
|
+
index < DOWNGRADE_REASONS.length - 1 && "border-b border-zinc-200",
|
|
74
|
+
selectedReason === reason && "bg-zinc-50"
|
|
75
|
+
),
|
|
76
|
+
children: [
|
|
77
|
+
/* @__PURE__ */ jsx("span", { className: "paragraph-small-medium text-zinc-600", children: reasonLabels[reason] }),
|
|
78
|
+
/* @__PURE__ */ jsx(
|
|
79
|
+
RadioGroupItem,
|
|
80
|
+
{
|
|
81
|
+
value: reason,
|
|
82
|
+
id: `downgrade-reason-${reason}`,
|
|
83
|
+
className: cn(
|
|
84
|
+
"size-[18px] border-[1.5px] shrink-0",
|
|
85
|
+
selectedReason === reason && "border-zinc-950"
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
reason
|
|
92
|
+
)) }) }),
|
|
93
|
+
selectedReason === DOWNGRADE_REASON_OTHER && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
94
|
+
/* @__PURE__ */ jsxs("label", { htmlFor: "downgrade-reason-text", className: "paragraph-small-medium text-zinc-950", children: [
|
|
95
|
+
translateDialog("reasonLabel"),
|
|
96
|
+
" ",
|
|
97
|
+
/* @__PURE__ */ jsx("span", { className: "text-red-500", children: translateDialog("reasonRequired") })
|
|
98
|
+
] }),
|
|
99
|
+
/* @__PURE__ */ jsx(
|
|
100
|
+
"textarea",
|
|
101
|
+
{
|
|
102
|
+
id: "downgrade-reason-text",
|
|
103
|
+
className: "w-full min-h-25 p-3 border border-zinc-200 rounded-lg resize-none paragraph-small-regular text-zinc-950 placeholder:text-zinc-400 focus:outline-none hover:border-zinc-400 focus:border-zinc-950 transition-colors",
|
|
104
|
+
placeholder: translateDialog("reasonPlaceholder"),
|
|
105
|
+
value: reasonText,
|
|
106
|
+
onChange: (event) => setReasonText(event.target.value)
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
] })
|
|
110
|
+
] }),
|
|
111
|
+
/* @__PURE__ */ jsxs("div", { className: "border-t border-zinc-200 flex flex-row items-center gap-2 px-4 lg:px-5 py-4 lg:py-5 mt-auto lg:mt-0", children: [
|
|
112
|
+
/* @__PURE__ */ jsx(
|
|
113
|
+
Button,
|
|
114
|
+
{
|
|
115
|
+
className: "h-10 w-fit",
|
|
116
|
+
onClick: handleContinue,
|
|
117
|
+
disabled: !canContinue || isPagesPending,
|
|
118
|
+
children: translateDialog("continueWithDowngrade")
|
|
119
|
+
}
|
|
120
|
+
),
|
|
121
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", className: "h-10 w-fit", onClick: handleClose, children: translate("common.actions.cancel") })
|
|
122
|
+
] })
|
|
123
|
+
] }) });
|
|
124
|
+
}
|
|
125
|
+
export {
|
|
126
|
+
DowngradeReasonDialog
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=DowngradeReasonDialog.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/account/sections/subscription/downgrade/DowngradeReasonDialog.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { useTranslations } from 'next-intl';\nimport { Button } from '../../../../ui/buttons/Button';\nimport { RadioGroup, RadioGroupItem } from '../../../../ui/form/RadioGroup';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n} from '../../../../ui/overlay/Dialog';\nimport { useCountPublishedPages } from '../../../../../modules/pages/hooks/count-published-pages.hook';\nimport {\n DOWNGRADE_REASONS,\n DOWNGRADE_REASON_OTHER,\n getDowngradeReasonLabels,\n} from '../../../../../modules/subscriptions/constants/downgrade.constants';\nimport { useWhitelabel } from '../../../../../providers/whitelabel.provider';\nimport { cn } from '../../../../../infra/utils/clsx';\nimport { useSubscriptionFlows } from '../../../../../store/useSubscriptionFlows';\n\n/** Primeiro passo do downgrade: por que a conta está descendo de plano. */\nexport function DowngradeReasonDialog() {\n const translate = useTranslations();\n const translateDialog = useTranslations(\n 'common.account.workspace.subscription.changePlan.downgradeReason'\n );\n const { whitelabel } = useWhitelabel();\n\n const data = useSubscriptionFlows((state) => state.downgradeReason);\n const close = useSubscriptionFlows((state) => state.closeDowngradeReason);\n const openCannotDowngrade = useSubscriptionFlows((state) => state.openCannotDowngrade);\n const openChangePlan = useSubscriptionFlows((state) => state.openChangePlan);\n\n const reasonLabels = getDowngradeReasonLabels(translate);\n\n const [selectedReason, setSelectedReason] = useState('');\n const [reasonText, setReasonText] = useState('');\n\n // `isPending` trava o continuar até a contagem chegar: sem ela o check de páginas passaria batido.\n const { data: publishedPagesCount, isPending: isPagesPending } = useCountPublishedPages({\n enabled: !!data,\n });\n\n const canContinue =\n !!selectedReason && (selectedReason !== DOWNGRADE_REASON_OTHER || !!reasonText.trim());\n\n const handleClose = () => {\n setSelectedReason('');\n setReasonText('');\n close();\n };\n\n const handleContinue = () => {\n if (!data) return;\n\n const publishedPages = publishedPagesCount ?? 0;\n // No downgrade vale o incluso no plano — sem a válvula dos domínios extras pagos\n // (ex.: Agência com 14 domínios → Negócio, que inclui 3, exige apagar 11).\n const domainsExceeded = data.registeredDomains > data.planIncludedDomains;\n // Com domínios a apagar, as páginas deles ainda inflam a contagem: o excedente real só\n // aparece depois do ajuste, e o roteiro o detecta ao vivo naquele momento.\n const pagesExceeded =\n !domainsExceeded && data.planIncludedPages != null && publishedPages > data.planIncludedPages;\n\n if (domainsExceeded || pagesExceeded) {\n openCannotDowngrade({ ...data, domainsExceeded, pagesExceeded });\n return;\n }\n\n handleClose();\n openChangePlan({\n targetPlan: data.targetPlan,\n billingPeriod: data.billingPeriod,\n isDowngrade: true,\n selectedCreditIndex: 0,\n });\n };\n\n return (\n <Dialog open={!!data} onOpenChange={(nextOpen) => !nextOpen && handleClose()}>\n <DialogContent className=\"flex flex-col p-0 gap-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-117.5 lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-y-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300\">\n <div className=\"flex flex-col gap-5 p-4 lg:p-5 flex-1 lg:flex-none\">\n <div className=\"flex flex-col gap-1\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\n {translateDialog('title')}\n </DialogTitle>\n <DialogDescription className=\"paragraph-small-regular text-zinc-500\">\n {translateDialog('subtitle', { wlName: whitelabel?.name ?? '' })}\n </DialogDescription>\n </div>\n\n <RadioGroup value={selectedReason} onValueChange={setSelectedReason}>\n <div className=\"flex flex-col border border-zinc-200 rounded-lg overflow-hidden\">\n {DOWNGRADE_REASONS.map((reason, index) => (\n <label\n key={reason}\n htmlFor={`downgrade-reason-${reason}`}\n className={cn(\n 'flex items-center justify-between px-4 py-3.5 lg:px-5 lg:py-6 cursor-pointer hover:bg-zinc-50 transition-colors',\n index < DOWNGRADE_REASONS.length - 1 && 'border-b border-zinc-200',\n selectedReason === reason && 'bg-zinc-50'\n )}\n >\n <span className=\"paragraph-small-medium text-zinc-600\">\n {reasonLabels[reason]}\n </span>\n <RadioGroupItem\n value={reason}\n id={`downgrade-reason-${reason}`}\n className={cn(\n 'size-[18px] border-[1.5px] shrink-0',\n selectedReason === reason && 'border-zinc-950'\n )}\n />\n </label>\n ))}\n </div>\n </RadioGroup>\n\n {selectedReason === DOWNGRADE_REASON_OTHER && (\n <div className=\"flex flex-col gap-2\">\n <label htmlFor=\"downgrade-reason-text\" className=\"paragraph-small-medium text-zinc-950\">\n {translateDialog('reasonLabel')}{' '}\n <span className=\"text-red-500\">{translateDialog('reasonRequired')}</span>\n </label>\n <textarea\n id=\"downgrade-reason-text\"\n className=\"w-full min-h-25 p-3 border border-zinc-200 rounded-lg resize-none paragraph-small-regular text-zinc-950 placeholder:text-zinc-400 focus:outline-none hover:border-zinc-400 focus:border-zinc-950 transition-colors\"\n placeholder={translateDialog('reasonPlaceholder')}\n value={reasonText}\n onChange={(event) => setReasonText(event.target.value)}\n />\n </div>\n )}\n </div>\n\n <div className=\"border-t border-zinc-200 flex flex-row items-center gap-2 px-4 lg:px-5 py-4 lg:py-5 mt-auto lg:mt-0\">\n <Button\n className=\"h-10 w-fit\"\n onClick={handleContinue}\n disabled={!canContinue || isPagesPending}\n >\n {translateDialog('continueWithDowngrade')}\n </Button>\n <Button variant=\"secondary\" className=\"h-10 w-fit\" onClick={handleClose}>\n {translate('common.actions.cancel')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|