@greatapps/common 1.1.790 → 1.1.792

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.
Files changed (791) hide show
  1. package/dist/components/account/AccountHubLinkHandler.mjs +36 -0
  2. package/dist/components/account/AccountHubLinkHandler.mjs.map +1 -0
  3. package/dist/components/account/AccountModalLayout.mjs +137 -0
  4. package/dist/components/account/AccountModalLayout.mjs.map +1 -0
  5. package/dist/components/account/AccountModals.mjs +10 -3
  6. package/dist/components/account/AccountModals.mjs.map +1 -1
  7. package/dist/components/account/AccountUnsavedChangesDialog.mjs +34 -0
  8. package/dist/components/account/AccountUnsavedChangesDialog.mjs.map +1 -0
  9. package/dist/components/account/DeleteAccountModal.mjs +1 -1
  10. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  11. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +8 -1
  12. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  13. package/dist/components/account/MyAccountModal.mjs +173 -0
  14. package/dist/components/account/MyAccountModal.mjs.map +1 -0
  15. package/dist/components/account/TwoFactorAuthModal.mjs +1 -1
  16. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  17. package/dist/components/account/hooks/useAccountHubActions.mjs +85 -0
  18. package/dist/components/account/hooks/useAccountHubActions.mjs.map +1 -0
  19. package/dist/components/account/hooks/useAddCardWithPaymentSwitch.mjs +44 -0
  20. package/dist/components/account/hooks/useAddCardWithPaymentSwitch.mjs.map +1 -0
  21. package/dist/components/account/hooks/useAffiliatesActions.mjs +69 -0
  22. package/dist/components/account/hooks/useAffiliatesActions.mjs.map +1 -0
  23. package/dist/components/account/hooks/useMyAccountModal.mjs +27 -0
  24. package/dist/components/account/hooks/useMyAccountModal.mjs.map +1 -0
  25. package/dist/components/account/hooks/useProjectsActions.mjs +40 -0
  26. package/dist/components/account/hooks/useProjectsActions.mjs.map +1 -0
  27. package/dist/components/account/hooks/useSubscriptionActions.mjs +87 -0
  28. package/dist/components/account/hooks/useSubscriptionActions.mjs.map +1 -0
  29. package/dist/components/account/hooks/useTeamActions.mjs +31 -0
  30. package/dist/components/account/hooks/useTeamActions.mjs.map +1 -0
  31. package/dist/components/account/sections/AffiliatesSection.mjs +313 -0
  32. package/dist/components/account/sections/AffiliatesSection.mjs.map +1 -0
  33. package/dist/components/account/sections/ChangePasswordSection.mjs +5 -5
  34. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  35. package/dist/components/account/sections/MyProfileSection.mjs +212 -164
  36. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  37. package/dist/components/account/sections/PreferencesSection.mjs +74 -68
  38. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  39. package/dist/components/account/sections/ProjectsSection.mjs +77 -0
  40. package/dist/components/account/sections/ProjectsSection.mjs.map +1 -0
  41. package/dist/components/account/sections/SecuritySection.mjs +55 -36
  42. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  43. package/dist/components/account/sections/SubscriptionSection.mjs +29 -0
  44. package/dist/components/account/sections/SubscriptionSection.mjs.map +1 -0
  45. package/dist/components/account/sections/TeamSection.mjs +119 -0
  46. package/dist/components/account/sections/TeamSection.mjs.map +1 -0
  47. package/dist/components/account/sections/TokenSection.mjs +41 -43
  48. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  49. package/dist/components/account/sections/affiliates/AffiliateCommissionCard.mjs +73 -0
  50. package/dist/components/account/sections/affiliates/AffiliateCommissionCard.mjs.map +1 -0
  51. package/dist/components/account/sections/affiliates/AffiliateFlows.mjs +20 -0
  52. package/dist/components/account/sections/affiliates/AffiliateFlows.mjs.map +1 -0
  53. package/dist/components/account/sections/affiliates/AffiliateLeadsSheet.mjs +99 -0
  54. package/dist/components/account/sections/affiliates/AffiliateLeadsSheet.mjs.map +1 -0
  55. package/dist/components/account/sections/affiliates/AffiliateStatsCard.mjs +31 -0
  56. package/dist/components/account/sections/affiliates/AffiliateStatsCard.mjs.map +1 -0
  57. package/dist/components/account/sections/affiliates/AffiliateStepCard.mjs +15 -0
  58. package/dist/components/account/sections/affiliates/AffiliateStepCard.mjs.map +1 -0
  59. package/dist/components/account/sections/affiliates/AffiliateTransactionsList.mjs +108 -0
  60. package/dist/components/account/sections/affiliates/AffiliateTransactionsList.mjs.map +1 -0
  61. package/dist/components/account/sections/affiliates/NoReceivingAccountModal.mjs +49 -0
  62. package/dist/components/account/sections/affiliates/NoReceivingAccountModal.mjs.map +1 -0
  63. package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs +182 -0
  64. package/dist/components/account/sections/affiliates/ReceivingAccountModal.mjs.map +1 -0
  65. package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs +476 -0
  66. package/dist/components/account/sections/affiliates/RequestWithdrawalSheet.mjs.map +1 -0
  67. package/dist/components/account/sections/affiliates/ViewAttachmentModal.mjs +34 -0
  68. package/dist/components/account/sections/affiliates/ViewAttachmentModal.mjs.map +1 -0
  69. package/dist/components/account/sections/affiliates/reports/AffiliatesIndicatorsChart.mjs +27 -0
  70. package/dist/components/account/sections/affiliates/reports/AffiliatesIndicatorsChart.mjs.map +1 -0
  71. package/dist/components/account/sections/affiliates/reports/AffiliatesReportsTab.mjs +30 -0
  72. package/dist/components/account/sections/affiliates/reports/AffiliatesReportsTab.mjs.map +1 -0
  73. package/dist/components/account/sections/affiliates/reports/useAffiliatesIndicatorsChart.mjs +120 -0
  74. package/dist/components/account/sections/affiliates/reports/useAffiliatesIndicatorsChart.mjs.map +1 -0
  75. package/dist/components/account/sections/projects/DeleteProjectModal.mjs +205 -0
  76. package/dist/components/account/sections/projects/DeleteProjectModal.mjs.map +1 -0
  77. package/dist/components/account/sections/projects/ProjectFlows.mjs +16 -0
  78. package/dist/components/account/sections/projects/ProjectFlows.mjs.map +1 -0
  79. package/dist/components/account/sections/projects/ProjectMembersStack.mjs +53 -0
  80. package/dist/components/account/sections/projects/ProjectMembersStack.mjs.map +1 -0
  81. package/dist/components/account/sections/projects/ProjectRow.mjs +85 -0
  82. package/dist/components/account/sections/projects/ProjectRow.mjs.map +1 -0
  83. package/dist/components/account/sections/projects/ProjectSheet.mjs +499 -0
  84. package/dist/components/account/sections/projects/ProjectSheet.mjs.map +1 -0
  85. package/dist/components/account/sections/projects/ProjectsDisabledModal.mjs +55 -0
  86. package/dist/components/account/sections/projects/ProjectsDisabledModal.mjs.map +1 -0
  87. package/dist/components/account/sections/projects/project-form.schema.mjs +28 -0
  88. package/dist/components/account/sections/projects/project-form.schema.mjs.map +1 -0
  89. package/dist/components/account/sections/shared/ConnectListRow.mjs +45 -0
  90. package/dist/components/account/sections/shared/ConnectListRow.mjs.map +1 -0
  91. package/dist/components/account/sections/shared/DateFilterPopover.mjs +51 -0
  92. package/dist/components/account/sections/shared/DateFilterPopover.mjs.map +1 -0
  93. package/dist/components/account/sections/shared/EntityAvatar.mjs +41 -0
  94. package/dist/components/account/sections/shared/EntityAvatar.mjs.map +1 -0
  95. package/dist/components/account/sections/shared/FilterPopover.mjs +62 -0
  96. package/dist/components/account/sections/shared/FilterPopover.mjs.map +1 -0
  97. package/dist/components/account/sections/shared/FormSection.mjs +14 -0
  98. package/dist/components/account/sections/shared/FormSection.mjs.map +1 -0
  99. package/dist/components/account/sections/shared/IconBox.mjs +18 -0
  100. package/dist/components/account/sections/shared/IconBox.mjs.map +1 -0
  101. package/dist/components/account/sections/shared/InfiniteScrollList.mjs +36 -0
  102. package/dist/components/account/sections/shared/InfiniteScrollList.mjs.map +1 -0
  103. package/dist/components/account/sections/shared/ListPagination.mjs +69 -0
  104. package/dist/components/account/sections/shared/ListPagination.mjs.map +1 -0
  105. package/dist/components/account/sections/shared/RowActionsMenu.mjs +52 -0
  106. package/dist/components/account/sections/shared/RowActionsMenu.mjs.map +1 -0
  107. package/dist/components/account/sections/shared/SectionLoadError.mjs +20 -0
  108. package/dist/components/account/sections/shared/SectionLoadError.mjs.map +1 -0
  109. package/dist/components/account/sections/shared/StatusBadge.mjs +26 -0
  110. package/dist/components/account/sections/shared/StatusBadge.mjs.map +1 -0
  111. package/dist/components/account/sections/shared/WorkspaceSection.mjs +10 -0
  112. package/dist/components/account/sections/shared/WorkspaceSection.mjs.map +1 -0
  113. package/dist/components/account/sections/subscription/AiCreditsUsage.mjs +106 -0
  114. package/dist/components/account/sections/subscription/AiCreditsUsage.mjs.map +1 -0
  115. package/dist/components/account/sections/subscription/BillingAddressSheet.mjs +407 -0
  116. package/dist/components/account/sections/subscription/BillingAddressSheet.mjs.map +1 -0
  117. package/dist/components/account/sections/subscription/BoletoDetailsDialog.mjs +73 -0
  118. package/dist/components/account/sections/subscription/BoletoDetailsDialog.mjs.map +1 -0
  119. package/dist/components/account/sections/subscription/BoletoGeneratedDialog.mjs +22 -0
  120. package/dist/components/account/sections/subscription/BoletoGeneratedDialog.mjs.map +1 -0
  121. package/dist/components/account/sections/subscription/CancelPlanDialog.mjs +161 -0
  122. package/dist/components/account/sections/subscription/CancelPlanDialog.mjs.map +1 -0
  123. package/dist/components/account/sections/subscription/ChargeRow.mjs +127 -0
  124. package/dist/components/account/sections/subscription/ChargeRow.mjs.map +1 -0
  125. package/dist/components/account/sections/subscription/ChargeStatusBadge.mjs +27 -0
  126. package/dist/components/account/sections/subscription/ChargeStatusBadge.mjs.map +1 -0
  127. package/dist/components/account/sections/subscription/ChargesList.mjs +88 -0
  128. package/dist/components/account/sections/subscription/ChargesList.mjs.map +1 -0
  129. package/dist/components/account/sections/subscription/ManageCardsSheet.mjs +49 -0
  130. package/dist/components/account/sections/subscription/ManageCardsSheet.mjs.map +1 -0
  131. package/dist/components/account/sections/subscription/OverdueReceiptOpener.mjs +26 -0
  132. package/dist/components/account/sections/subscription/OverdueReceiptOpener.mjs.map +1 -0
  133. package/dist/components/account/sections/subscription/PayChargeDialog.mjs +222 -0
  134. package/dist/components/account/sections/subscription/PayChargeDialog.mjs.map +1 -0
  135. package/dist/components/account/sections/subscription/PaymentConfirmationDialog.mjs +61 -0
  136. package/dist/components/account/sections/subscription/PaymentConfirmationDialog.mjs.map +1 -0
  137. package/dist/components/account/sections/subscription/PaymentMethodsCard.mjs +72 -0
  138. package/dist/components/account/sections/subscription/PaymentMethodsCard.mjs.map +1 -0
  139. package/dist/components/account/sections/subscription/PendingChangeDialog.mjs +117 -0
  140. package/dist/components/account/sections/subscription/PendingChangeDialog.mjs.map +1 -0
  141. package/dist/components/account/sections/subscription/PixDetailsDialog.mjs +165 -0
  142. package/dist/components/account/sections/subscription/PixDetailsDialog.mjs.map +1 -0
  143. package/dist/components/account/sections/subscription/PixPaymentDialog.mjs +155 -0
  144. package/dist/components/account/sections/subscription/PixPaymentDialog.mjs.map +1 -0
  145. package/dist/components/account/sections/subscription/PlanDetailsSheet.mjs +253 -0
  146. package/dist/components/account/sections/subscription/PlanDetailsSheet.mjs.map +1 -0
  147. package/dist/components/account/sections/subscription/ReceiptDetailsSheet.mjs +237 -0
  148. package/dist/components/account/sections/subscription/ReceiptDetailsSheet.mjs.map +1 -0
  149. package/dist/components/account/sections/subscription/SubscriptionFlows.mjs +40 -0
  150. package/dist/components/account/sections/subscription/SubscriptionFlows.mjs.map +1 -0
  151. package/dist/components/account/sections/subscription/SubscriptionPlanCard.mjs +303 -0
  152. package/dist/components/account/sections/subscription/SubscriptionPlanCard.mjs.map +1 -0
  153. package/dist/components/account/sections/subscription/UsageReportSheet.mjs +163 -0
  154. package/dist/components/account/sections/subscription/UsageReportSheet.mjs.map +1 -0
  155. package/dist/components/account/sections/subscription/change-plan/ChangePlanSheet.mjs +75 -0
  156. package/dist/components/account/sections/subscription/change-plan/ChangePlanSheet.mjs.map +1 -0
  157. package/dist/components/account/sections/subscription/change-plan/components/AbTestDetailsDialog.mjs +55 -0
  158. package/dist/components/account/sections/subscription/change-plan/components/AbTestDetailsDialog.mjs.map +1 -0
  159. package/dist/components/account/sections/subscription/change-plan/components/AddonsBlock.mjs +188 -0
  160. package/dist/components/account/sections/subscription/change-plan/components/AddonsBlock.mjs.map +1 -0
  161. package/dist/components/account/sections/subscription/change-plan/components/AlternativeBucketsSection.mjs +66 -0
  162. package/dist/components/account/sections/subscription/change-plan/components/AlternativeBucketsSection.mjs.map +1 -0
  163. package/dist/components/account/sections/subscription/change-plan/components/CouponBlock.mjs +42 -0
  164. package/dist/components/account/sections/subscription/change-plan/components/CouponBlock.mjs.map +1 -0
  165. package/dist/components/account/sections/subscription/change-plan/components/CouponDialog.mjs +119 -0
  166. package/dist/components/account/sections/subscription/change-plan/components/CouponDialog.mjs.map +1 -0
  167. package/dist/components/account/sections/subscription/change-plan/components/PricePreview.mjs +17 -0
  168. package/dist/components/account/sections/subscription/change-plan/components/PricePreview.mjs.map +1 -0
  169. package/dist/components/account/sections/subscription/change-plan/components/SummaryBlock.mjs +130 -0
  170. package/dist/components/account/sections/subscription/change-plan/components/SummaryBlock.mjs.map +1 -0
  171. package/dist/components/account/sections/subscription/change-plan/plan-comparison.mjs +38 -0
  172. package/dist/components/account/sections/subscription/change-plan/plan-comparison.mjs.map +1 -0
  173. package/dist/components/account/sections/subscription/change-plan/steps/PaymentSummaryStep.mjs +127 -0
  174. package/dist/components/account/sections/subscription/change-plan/steps/PaymentSummaryStep.mjs.map +1 -0
  175. package/dist/components/account/sections/subscription/change-plan/steps/PlanComparisonStep.mjs +111 -0
  176. package/dist/components/account/sections/subscription/change-plan/steps/PlanComparisonStep.mjs.map +1 -0
  177. package/dist/components/account/sections/subscription/change-plan/steps/PlanViewStep.mjs +69 -0
  178. package/dist/components/account/sections/subscription/change-plan/steps/PlanViewStep.mjs.map +1 -0
  179. package/dist/components/account/sections/subscription/change-plan/steps/ReactivationConfigStep.mjs +88 -0
  180. package/dist/components/account/sections/subscription/change-plan/steps/ReactivationConfigStep.mjs.map +1 -0
  181. package/dist/components/account/sections/subscription/change-plan/steps/ReactivationPaymentStep.mjs +115 -0
  182. package/dist/components/account/sections/subscription/change-plan/steps/ReactivationPaymentStep.mjs.map +1 -0
  183. package/dist/components/account/sections/subscription/change-plan/useChangePlanState.mjs +918 -0
  184. package/dist/components/account/sections/subscription/change-plan/useChangePlanState.mjs.map +1 -0
  185. package/dist/components/account/sections/subscription/downgrade/CannotDowngradeDialog.mjs +216 -0
  186. package/dist/components/account/sections/subscription/downgrade/CannotDowngradeDialog.mjs.map +1 -0
  187. package/dist/components/account/sections/subscription/downgrade/DowngradeReasonDialog.mjs +128 -0
  188. package/dist/components/account/sections/subscription/downgrade/DowngradeReasonDialog.mjs.map +1 -0
  189. package/dist/components/account/sections/subscription/plans/PlanCard.mjs +281 -0
  190. package/dist/components/account/sections/subscription/plans/PlanCard.mjs.map +1 -0
  191. package/dist/components/account/sections/subscription/plans/PlanCardSkeleton.mjs +53 -0
  192. package/dist/components/account/sections/subscription/plans/PlanCardSkeleton.mjs.map +1 -0
  193. package/dist/components/account/sections/subscription/plans/PlansCatalogDialog.mjs +119 -0
  194. package/dist/components/account/sections/subscription/plans/PlansCatalogDialog.mjs.map +1 -0
  195. package/dist/components/account/sections/team/DeleteUserModal.mjs +116 -0
  196. package/dist/components/account/sections/team/DeleteUserModal.mjs.map +1 -0
  197. package/dist/components/account/sections/team/TeamFlows.mjs +14 -0
  198. package/dist/components/account/sections/team/TeamFlows.mjs.map +1 -0
  199. package/dist/components/account/sections/team/TeamMemberRow.mjs +99 -0
  200. package/dist/components/account/sections/team/TeamMemberRow.mjs.map +1 -0
  201. package/dist/components/account/sections/team/UserSheet.mjs +570 -0
  202. package/dist/components/account/sections/team/UserSheet.mjs.map +1 -0
  203. package/dist/components/account/sections/team/steps/NotificationsStep.mjs +80 -0
  204. package/dist/components/account/sections/team/steps/NotificationsStep.mjs.map +1 -0
  205. package/dist/components/account/sections/team/steps/ProjectSelectionStep.mjs +180 -0
  206. package/dist/components/account/sections/team/steps/ProjectSelectionStep.mjs.map +1 -0
  207. package/dist/components/account/sections/team/steps/UserInformationStep.mjs +371 -0
  208. package/dist/components/account/sections/team/steps/UserInformationStep.mjs.map +1 -0
  209. package/dist/components/account/sections/team/user-form.schema.mjs +37 -0
  210. package/dist/components/account/sections/team/user-form.schema.mjs.map +1 -0
  211. package/dist/components/account/types/workspace-actions.type.mjs +1 -0
  212. package/dist/components/account/types/workspace-actions.type.mjs.map +1 -0
  213. package/dist/components/layouts/ProfilePopover.mjs +10 -12
  214. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  215. package/dist/components/layouts/UsersSelectorPopover.mjs +7 -4
  216. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  217. package/dist/components/modals/AccountDeletionWarningModal.mjs +4 -5
  218. package/dist/components/modals/AccountDeletionWarningModal.mjs.map +1 -1
  219. package/dist/components/modals/AccountFrozenModal.mjs +6 -3
  220. package/dist/components/modals/AccountFrozenModal.mjs.map +1 -1
  221. package/dist/components/modals/Modals.mjs +3 -3
  222. package/dist/components/modals/Modals.mjs.map +1 -1
  223. package/dist/components/modals/PaidPlanRequiredModal.mjs +4 -5
  224. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  225. package/dist/components/modals/cards/AddFirstCardWarningModal.mjs +63 -0
  226. package/dist/components/modals/cards/AddFirstCardWarningModal.mjs.map +1 -0
  227. package/dist/components/modals/cards/SwitchPaymentToCardModal.mjs +187 -0
  228. package/dist/components/modals/cards/SwitchPaymentToCardModal.mjs.map +1 -0
  229. package/dist/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.mjs +5 -4
  230. package/dist/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.mjs.map +1 -1
  231. package/dist/components/ui/data-display/CardItem.mjs +9 -1
  232. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  233. package/dist/components/ui/data-display/PaymentMethodIcons.mjs +50 -0
  234. package/dist/components/ui/data-display/PaymentMethodIcons.mjs.map +1 -0
  235. package/dist/components/ui/form/BillingPeriodSelector.mjs +108 -0
  236. package/dist/components/ui/form/BillingPeriodSelector.mjs.map +1 -0
  237. package/dist/components/ui/form/PaymentMethodToggle.mjs +82 -0
  238. package/dist/components/ui/form/PaymentMethodToggle.mjs.map +1 -0
  239. package/dist/components/ui/form/RadioOptionFieldIcon.mjs +57 -0
  240. package/dist/components/ui/form/RadioOptionFieldIcon.mjs.map +1 -0
  241. package/dist/components/ui/form/SegmentedControl.mjs +56 -0
  242. package/dist/components/ui/form/SegmentedControl.mjs.map +1 -0
  243. package/dist/components/ui/overlay/Dialog.mjs +21 -4
  244. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  245. package/dist/components/ui/overlay/Sheet.mjs +26 -8
  246. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  247. package/dist/components/ui/overlay/layers.mjs +52 -5
  248. package/dist/components/ui/overlay/layers.mjs.map +1 -1
  249. package/dist/enums/AccountHubFlow.mjs +13 -0
  250. package/dist/enums/AccountHubFlow.mjs.map +1 -0
  251. package/dist/enums/DateFilterPeriod.mjs +22 -0
  252. package/dist/enums/DateFilterPeriod.mjs.map +1 -0
  253. package/dist/enums/WorkspaceSectionType.mjs +11 -0
  254. package/dist/enums/WorkspaceSectionType.mjs.map +1 -0
  255. package/dist/handlers.mjs +24 -0
  256. package/dist/handlers.mjs.map +1 -1
  257. package/dist/hooks/useDebounce.mjs +5 -3
  258. package/dist/hooks/useDebounce.mjs.map +1 -1
  259. package/dist/hooks/useUploadProgress.mjs +33 -0
  260. package/dist/hooks/useUploadProgress.mjs.map +1 -0
  261. package/dist/i18n/messages/en-us.mjs +868 -3
  262. package/dist/i18n/messages/en-us.mjs.map +1 -1
  263. package/dist/i18n/messages/es-es.mjs +868 -3
  264. package/dist/i18n/messages/es-es.mjs.map +1 -1
  265. package/dist/i18n/messages/pt-br.mjs +868 -3
  266. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  267. package/dist/index.mjs +87 -7
  268. package/dist/index.mjs.map +1 -1
  269. package/dist/infra/http/paged.mjs +20 -0
  270. package/dist/infra/http/paged.mjs.map +1 -0
  271. package/dist/middleware.mjs +2 -0
  272. package/dist/middleware.mjs.map +1 -1
  273. package/dist/middlewares/create-auth-middleware.mjs +2 -4
  274. package/dist/middlewares/create-auth-middleware.mjs.map +1 -1
  275. package/dist/middlewares/create-legacy-account-routes-middleware.mjs +44 -0
  276. package/dist/middlewares/create-legacy-account-routes-middleware.mjs.map +1 -0
  277. package/dist/middlewares/is-route-equals.mjs +7 -0
  278. package/dist/middlewares/is-route-equals.mjs.map +1 -0
  279. package/dist/modules/accounts/actions/account-management.action.mjs +20 -1
  280. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  281. package/dist/modules/accounts/constants/account-hub-link.constants.mjs +9 -0
  282. package/dist/modules/accounts/constants/account-hub-link.constants.mjs.map +1 -0
  283. package/dist/modules/accounts/constants/legacy-account-routes.constants.mjs +5 -0
  284. package/dist/modules/accounts/constants/legacy-account-routes.constants.mjs.map +1 -0
  285. package/dist/modules/accounts/handlers/list-account-members.handler.mjs +22 -0
  286. package/dist/modules/accounts/handlers/list-account-members.handler.mjs.map +1 -0
  287. package/dist/modules/accounts/hooks/add-user-projects.hook.mjs +51 -0
  288. package/dist/modules/accounts/hooks/add-user-projects.hook.mjs.map +1 -0
  289. package/dist/modules/accounts/hooks/create-account-user.hook.mjs +20 -0
  290. package/dist/modules/accounts/hooks/create-account-user.hook.mjs.map +1 -0
  291. package/dist/modules/accounts/hooks/remove-user-projects.hook.mjs +47 -0
  292. package/dist/modules/accounts/hooks/remove-user-projects.hook.mjs.map +1 -0
  293. package/dist/modules/accounts/hooks/use-account-members.hook.mjs +20 -0
  294. package/dist/modules/accounts/hooks/use-account-members.hook.mjs.map +1 -0
  295. package/dist/modules/accounts/services/account.service.mjs +59 -0
  296. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  297. package/dist/modules/accounts/types/account-hub-link.type.mjs +1 -0
  298. package/dist/modules/accounts/types/account-hub-link.type.mjs.map +1 -0
  299. package/dist/modules/accounts/utils/build-account-hub-url.mjs +16 -0
  300. package/dist/modules/accounts/utils/build-account-hub-url.mjs.map +1 -0
  301. package/dist/modules/accounts/utils/is-account-hub-flow.mjs +9 -0
  302. package/dist/modules/accounts/utils/is-account-hub-flow.mjs.map +1 -0
  303. package/dist/modules/accounts/utils/is-account-section.mjs +9 -0
  304. package/dist/modules/accounts/utils/is-account-section.mjs.map +1 -0
  305. package/dist/modules/accounts/utils/is-my-account-section.mjs +13 -0
  306. package/dist/modules/accounts/utils/is-my-account-section.mjs.map +1 -0
  307. package/dist/modules/accounts/utils/map-legacy-account-route.mjs +93 -0
  308. package/dist/modules/accounts/utils/map-legacy-account-route.mjs.map +1 -0
  309. package/dist/modules/accounts/utils/parse-account-hub-link.mjs +20 -0
  310. package/dist/modules/accounts/utils/parse-account-hub-link.mjs.map +1 -0
  311. package/dist/modules/affiliates/actions/ensure-affiliate.action.mjs +10 -0
  312. package/dist/modules/affiliates/actions/ensure-affiliate.action.mjs.map +1 -0
  313. package/dist/modules/affiliates/actions/request-deposit.action.mjs +10 -0
  314. package/dist/modules/affiliates/actions/request-deposit.action.mjs.map +1 -0
  315. package/dist/modules/affiliates/actions/update-affiliate.action.mjs +10 -0
  316. package/dist/modules/affiliates/actions/update-affiliate.action.mjs.map +1 -0
  317. package/dist/modules/affiliates/constants/affiliate.constants.mjs +11 -0
  318. package/dist/modules/affiliates/constants/affiliate.constants.mjs.map +1 -0
  319. package/dist/modules/affiliates/constants/query-keys.constants.mjs +15 -0
  320. package/dist/modules/affiliates/constants/query-keys.constants.mjs.map +1 -0
  321. package/dist/modules/affiliates/handlers/affiliate-report-analytics.handler.mjs +16 -0
  322. package/dist/modules/affiliates/handlers/affiliate-report-analytics.handler.mjs.map +1 -0
  323. package/dist/modules/affiliates/handlers/affiliate-withdrawal-limits.handler.mjs +12 -0
  324. package/dist/modules/affiliates/handlers/affiliate-withdrawal-limits.handler.mjs.map +1 -0
  325. package/dist/modules/affiliates/handlers/current-affiliate.handler.mjs +12 -0
  326. package/dist/modules/affiliates/handlers/current-affiliate.handler.mjs.map +1 -0
  327. package/dist/modules/affiliates/handlers/list-affiliate-coupons.handler.mjs +12 -0
  328. package/dist/modules/affiliates/handlers/list-affiliate-coupons.handler.mjs.map +1 -0
  329. package/dist/modules/affiliates/handlers/list-affiliate-leads.handler.mjs +22 -0
  330. package/dist/modules/affiliates/handlers/list-affiliate-leads.handler.mjs.map +1 -0
  331. package/dist/modules/affiliates/handlers/list-affiliate-transactions.handler.mjs +22 -0
  332. package/dist/modules/affiliates/handlers/list-affiliate-transactions.handler.mjs.map +1 -0
  333. package/dist/modules/affiliates/hooks/use-affiliate-coupons.hook.mjs +17 -0
  334. package/dist/modules/affiliates/hooks/use-affiliate-coupons.hook.mjs.map +1 -0
  335. package/dist/modules/affiliates/hooks/use-affiliate-leads.hook.mjs +22 -0
  336. package/dist/modules/affiliates/hooks/use-affiliate-leads.hook.mjs.map +1 -0
  337. package/dist/modules/affiliates/hooks/use-affiliate-report-analytics.hook.mjs +17 -0
  338. package/dist/modules/affiliates/hooks/use-affiliate-report-analytics.hook.mjs.map +1 -0
  339. package/dist/modules/affiliates/hooks/use-affiliate-transactions.hook.mjs +20 -0
  340. package/dist/modules/affiliates/hooks/use-affiliate-transactions.hook.mjs.map +1 -0
  341. package/dist/modules/affiliates/hooks/use-current-affiliate.hook.mjs +17 -0
  342. package/dist/modules/affiliates/hooks/use-current-affiliate.hook.mjs.map +1 -0
  343. package/dist/modules/affiliates/hooks/use-ensure-affiliate.hook.mjs +23 -0
  344. package/dist/modules/affiliates/hooks/use-ensure-affiliate.hook.mjs.map +1 -0
  345. package/dist/modules/affiliates/hooks/use-request-deposit.hook.mjs +28 -0
  346. package/dist/modules/affiliates/hooks/use-request-deposit.hook.mjs.map +1 -0
  347. package/dist/modules/affiliates/hooks/use-update-affiliate.hook.mjs +22 -0
  348. package/dist/modules/affiliates/hooks/use-update-affiliate.hook.mjs.map +1 -0
  349. package/dist/modules/affiliates/hooks/use-withdrawal-limits.hook.mjs +17 -0
  350. package/dist/modules/affiliates/hooks/use-withdrawal-limits.hook.mjs.map +1 -0
  351. package/dist/modules/affiliates/services/affiliates.service.mjs +183 -0
  352. package/dist/modules/affiliates/services/affiliates.service.mjs.map +1 -0
  353. package/dist/modules/affiliates/types/affiliate.type.mjs +100 -0
  354. package/dist/modules/affiliates/types/affiliate.type.mjs.map +1 -0
  355. package/dist/modules/affiliates/utils/get-affiliate-share-link.mjs +9 -0
  356. package/dist/modules/affiliates/utils/get-affiliate-share-link.mjs.map +1 -0
  357. package/dist/modules/charges/actions/get-nota-fiscal.action.mjs +10 -0
  358. package/dist/modules/charges/actions/get-nota-fiscal.action.mjs.map +1 -0
  359. package/dist/modules/charges/actions/refresh-pix.action.mjs +10 -0
  360. package/dist/modules/charges/actions/refresh-pix.action.mjs.map +1 -0
  361. package/dist/modules/charges/hooks/nota-fiscal.hook.mjs +13 -0
  362. package/dist/modules/charges/hooks/nota-fiscal.hook.mjs.map +1 -0
  363. package/dist/modules/charges/hooks/refresh-pix.hook.mjs +13 -0
  364. package/dist/modules/charges/hooks/refresh-pix.hook.mjs.map +1 -0
  365. package/dist/modules/charges/services/charges.service.mjs +67 -0
  366. package/dist/modules/charges/services/charges.service.mjs.map +1 -1
  367. package/dist/modules/charges/types/nota-fiscal.type.mjs +1 -0
  368. package/dist/modules/charges/types/nota-fiscal.type.mjs.map +1 -0
  369. package/dist/modules/charges/types/refresh-pix.type.mjs +1 -0
  370. package/dist/modules/charges/types/refresh-pix.type.mjs.map +1 -0
  371. package/dist/modules/charges/utils/get-charge-download-url.mjs +8 -0
  372. package/dist/modules/charges/utils/get-charge-download-url.mjs.map +1 -0
  373. package/dist/modules/coupons/constants/query-keys.constants.mjs +5 -0
  374. package/dist/modules/coupons/constants/query-keys.constants.mjs.map +1 -0
  375. package/dist/modules/coupons/handlers/find-coupon-by-code.handler.mjs +17 -0
  376. package/dist/modules/coupons/handlers/find-coupon-by-code.handler.mjs.map +1 -0
  377. package/dist/modules/coupons/handlers/find-coupon-by-id.handler.mjs +16 -0
  378. package/dist/modules/coupons/handlers/find-coupon-by-id.handler.mjs.map +1 -0
  379. package/dist/modules/coupons/hooks/use-coupon-by-code.hook.mjs +15 -0
  380. package/dist/modules/coupons/hooks/use-coupon-by-code.hook.mjs.map +1 -0
  381. package/dist/modules/coupons/hooks/use-coupon-by-id.hook.mjs +18 -0
  382. package/dist/modules/coupons/hooks/use-coupon-by-id.hook.mjs.map +1 -0
  383. package/dist/modules/coupons/services/coupons.service.mjs +44 -0
  384. package/dist/modules/coupons/services/coupons.service.mjs.map +1 -0
  385. package/dist/modules/coupons/types/coupon.type.mjs +61 -0
  386. package/dist/modules/coupons/types/coupon.type.mjs.map +1 -0
  387. package/dist/modules/coupons/utils/coupon-restrictions.mjs +60 -0
  388. package/dist/modules/coupons/utils/coupon-restrictions.mjs.map +1 -0
  389. package/dist/modules/domains/handlers/count-domains.handler.mjs +12 -0
  390. package/dist/modules/domains/handlers/count-domains.handler.mjs.map +1 -0
  391. package/dist/modules/domains/hooks/count-domains.hook.mjs +17 -0
  392. package/dist/modules/domains/hooks/count-domains.hook.mjs.map +1 -0
  393. package/dist/modules/domains/services/domains.service.mjs +18 -0
  394. package/dist/modules/domains/services/domains.service.mjs.map +1 -0
  395. package/dist/modules/ia-credits/handlers/list-ia-credit-operations.handler.mjs +15 -0
  396. package/dist/modules/ia-credits/handlers/list-ia-credit-operations.handler.mjs.map +1 -0
  397. package/dist/modules/ia-credits/hooks/ia-credit-operations.hook.mjs +28 -0
  398. package/dist/modules/ia-credits/hooks/ia-credit-operations.hook.mjs.map +1 -0
  399. package/dist/modules/ia-credits/services/ia-credits.service.mjs +23 -2
  400. package/dist/modules/ia-credits/services/ia-credits.service.mjs.map +1 -1
  401. package/dist/modules/pages/handlers/count-pages.handler.mjs +4 -2
  402. package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -1
  403. package/dist/modules/pages/hooks/count-published-pages.hook.mjs +26 -0
  404. package/dist/modules/pages/hooks/count-published-pages.hook.mjs.map +1 -0
  405. package/dist/modules/pages/services/pages.service.mjs +3 -2
  406. package/dist/modules/pages/services/pages.service.mjs.map +1 -1
  407. package/dist/modules/plans/constants/plan-tooltips.constants.mjs +14 -0
  408. package/dist/modules/plans/constants/plan-tooltips.constants.mjs.map +1 -0
  409. package/dist/modules/plans/hooks/use-enriched-plans.hook.mjs +28 -0
  410. package/dist/modules/plans/hooks/use-enriched-plans.hook.mjs.map +1 -0
  411. package/dist/modules/plans/hooks/use-ui-plans.hook.mjs +20 -0
  412. package/dist/modules/plans/hooks/use-ui-plans.hook.mjs.map +1 -0
  413. package/dist/modules/projects/hooks/add-project-users.hook.mjs +25 -0
  414. package/dist/modules/projects/hooks/add-project-users.hook.mjs.map +1 -0
  415. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs +3 -6
  416. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  417. package/dist/modules/projects/hooks/list-available-users.hook.mjs +3 -6
  418. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  419. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs +3 -6
  420. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  421. package/dist/modules/projects/hooks/list-project-users.hook.mjs +3 -6
  422. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  423. package/dist/modules/projects/hooks/remove-project-users.hook.mjs +25 -0
  424. package/dist/modules/projects/hooks/remove-project-users.hook.mjs.map +1 -0
  425. package/dist/modules/projects/services/project-users.service.mjs +5 -0
  426. package/dist/modules/projects/services/project-users.service.mjs.map +1 -1
  427. package/dist/modules/projects/types.mjs +3 -2
  428. package/dist/modules/projects/types.mjs.map +1 -1
  429. package/dist/modules/subscriptions/actions/cancel-subscription.action.mjs +10 -0
  430. package/dist/modules/subscriptions/actions/cancel-subscription.action.mjs.map +1 -0
  431. package/dist/modules/subscriptions/actions/create-subscription.action.mjs +10 -0
  432. package/dist/modules/subscriptions/actions/create-subscription.action.mjs.map +1 -0
  433. package/dist/modules/subscriptions/actions/find-pending-pix-status.action.mjs +10 -0
  434. package/dist/modules/subscriptions/actions/find-pending-pix-status.action.mjs.map +1 -0
  435. package/dist/modules/subscriptions/actions/find-subscription-by-id.action.mjs +10 -0
  436. package/dist/modules/subscriptions/actions/find-subscription-by-id.action.mjs.map +1 -0
  437. package/dist/modules/subscriptions/constants/addons.constants.mjs +35 -0
  438. package/dist/modules/subscriptions/constants/addons.constants.mjs.map +1 -1
  439. package/dist/modules/subscriptions/constants/downgrade.constants.mjs +25 -0
  440. package/dist/modules/subscriptions/constants/downgrade.constants.mjs.map +1 -0
  441. package/dist/modules/subscriptions/constants/subscription.constants.mjs +2 -0
  442. package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
  443. package/dist/modules/subscriptions/handlers/pending-pix-status.handler.mjs +15 -0
  444. package/dist/modules/subscriptions/handlers/pending-pix-status.handler.mjs.map +1 -0
  445. package/dist/modules/subscriptions/hooks/cancel-subscription.hook.mjs +25 -0
  446. package/dist/modules/subscriptions/hooks/cancel-subscription.hook.mjs.map +1 -0
  447. package/dist/modules/subscriptions/hooks/create-subscription.hook.mjs +33 -0
  448. package/dist/modules/subscriptions/hooks/create-subscription.hook.mjs.map +1 -0
  449. package/dist/modules/subscriptions/hooks/find-subscription-by-id.hook.mjs +18 -0
  450. package/dist/modules/subscriptions/hooks/find-subscription-by-id.hook.mjs.map +1 -0
  451. package/dist/modules/subscriptions/hooks/pending-pix-status.hook.mjs +25 -0
  452. package/dist/modules/subscriptions/hooks/pending-pix-status.hook.mjs.map +1 -0
  453. package/dist/modules/subscriptions/services/subscriptions.service.mjs +71 -0
  454. package/dist/modules/subscriptions/services/subscriptions.service.mjs.map +1 -1
  455. package/dist/modules/subscriptions/types/cancel-subscription.type.mjs +9 -0
  456. package/dist/modules/subscriptions/types/cancel-subscription.type.mjs.map +1 -0
  457. package/dist/modules/subscriptions/types/create-subscription.type.mjs +62 -0
  458. package/dist/modules/subscriptions/types/create-subscription.type.mjs.map +1 -0
  459. package/dist/modules/subscriptions/types/pending-pix-status.type.mjs +28 -0
  460. package/dist/modules/subscriptions/types/pending-pix-status.type.mjs.map +1 -0
  461. package/dist/modules/subscriptions/types/subscription.type.mjs +9 -1
  462. package/dist/modules/subscriptions/types/subscription.type.mjs.map +1 -1
  463. package/dist/modules/subscriptions/utils/addon-buckets.mjs +69 -0
  464. package/dist/modules/subscriptions/utils/addon-buckets.mjs.map +1 -0
  465. package/dist/modules/subscriptions/utils/confirm-payment-if-required.mjs +8 -2
  466. package/dist/modules/subscriptions/utils/confirm-payment-if-required.mjs.map +1 -1
  467. package/dist/modules/subscriptions/utils/first-period-pricing.mjs +25 -0
  468. package/dist/modules/subscriptions/utils/first-period-pricing.mjs.map +1 -0
  469. package/dist/modules/subscriptions/utils/is-api-subscription.mjs +8 -0
  470. package/dist/modules/subscriptions/utils/is-api-subscription.mjs.map +1 -0
  471. package/dist/modules/subscriptions/utils/is-boleto-payer.mjs +17 -0
  472. package/dist/modules/subscriptions/utils/is-boleto-payer.mjs.map +1 -0
  473. package/dist/modules/subscriptions/utils/is-free-subscription.mjs +8 -0
  474. package/dist/modules/subscriptions/utils/is-free-subscription.mjs.map +1 -0
  475. package/dist/modules/subscriptions/utils/periodicity.mjs +55 -1
  476. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  477. package/dist/modules/subscriptions/utils/resolve-subscription-plan-name.mjs +27 -0
  478. package/dist/modules/subscriptions/utils/resolve-subscription-plan-name.mjs.map +1 -0
  479. package/dist/modules/users/hooks/messages.hook.mjs +3 -5
  480. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  481. package/dist/server.mjs +6 -0
  482. package/dist/server.mjs.map +1 -1
  483. package/dist/store/useAccountModals.mjs +9 -2
  484. package/dist/store/useAccountModals.mjs.map +1 -1
  485. package/dist/store/useAccountUnsavedChanges.mjs +31 -0
  486. package/dist/store/useAccountUnsavedChanges.mjs.map +1 -0
  487. package/dist/store/useAffiliateFlows.mjs +23 -0
  488. package/dist/store/useAffiliateFlows.mjs.map +1 -0
  489. package/dist/store/useProjectFlows.mjs +18 -0
  490. package/dist/store/useProjectFlows.mjs.map +1 -0
  491. package/dist/store/useSubscriptionFlows.mjs +58 -0
  492. package/dist/store/useSubscriptionFlows.mjs.map +1 -0
  493. package/dist/store/useTeamFlows.mjs +15 -0
  494. package/dist/store/useTeamFlows.mjs.map +1 -0
  495. package/dist/testing/factories/coupon.factory.mjs +19 -0
  496. package/dist/testing/factories/coupon.factory.mjs.map +1 -0
  497. package/dist/testing/factories/index.mjs +6 -0
  498. package/dist/testing/factories/index.mjs.map +1 -1
  499. package/dist/testing/factories/project-user.factory.mjs +17 -0
  500. package/dist/testing/factories/project-user.factory.mjs.map +1 -0
  501. package/dist/testing/factories/project.factory.mjs +21 -0
  502. package/dist/testing/factories/project.factory.mjs.map +1 -0
  503. package/dist/testing/react/providers.mjs +1 -1
  504. package/dist/testing/react/providers.mjs.map +1 -1
  505. package/dist/utils/browser/chart-custom-tooltip.mjs +69 -0
  506. package/dist/utils/browser/chart-custom-tooltip.mjs.map +1 -0
  507. package/dist/utils/browser/get-css-variable.mjs +9 -0
  508. package/dist/utils/browser/get-css-variable.mjs.map +1 -0
  509. package/dist/utils/constants/scrollbar.mjs +5 -0
  510. package/dist/utils/constants/scrollbar.mjs.map +1 -0
  511. package/dist/utils/date-filter-period.mjs +34 -0
  512. package/dist/utils/date-filter-period.mjs.map +1 -0
  513. package/dist/utils/file/index.mjs +11 -1
  514. package/dist/utils/file/index.mjs.map +1 -1
  515. package/dist/utils/format/initials.mjs +8 -0
  516. package/dist/utils/format/initials.mjs.map +1 -0
  517. package/dist/utils/format/masks.mjs +32 -1
  518. package/dist/utils/format/masks.mjs.map +1 -1
  519. package/dist/utils/qrcode/to-data-url.mjs +12 -0
  520. package/dist/utils/qrcode/to-data-url.mjs.map +1 -0
  521. package/dist/utils/validators/account.mjs +1 -7
  522. package/dist/utils/validators/account.mjs.map +1 -1
  523. package/package.json +15 -2
  524. package/src/components/account/AccountHubLinkHandler.tsx +39 -0
  525. package/src/components/account/AccountModalLayout.tsx +190 -0
  526. package/src/components/account/AccountModals.tsx +12 -2
  527. package/src/components/account/AccountUnsavedChangesDialog.tsx +49 -0
  528. package/src/components/account/DeleteAccountModal.tsx +1 -1
  529. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +9 -1
  530. package/src/components/account/MyAccountModal.tsx +222 -0
  531. package/src/components/account/TwoFactorAuthModal.tsx +1 -1
  532. package/src/components/account/hooks/useAccountHubActions.ts +95 -0
  533. package/src/components/account/hooks/useAddCardWithPaymentSwitch.ts +70 -0
  534. package/src/components/account/hooks/useAffiliatesActions.tsx +78 -0
  535. package/src/components/account/hooks/useMyAccountModal.ts +40 -0
  536. package/src/components/account/hooks/useProjectsActions.ts +44 -0
  537. package/src/components/account/hooks/useSubscriptionActions.ts +99 -0
  538. package/src/components/account/hooks/useTeamActions.ts +35 -0
  539. package/src/components/account/sections/AffiliatesSection.tsx +342 -0
  540. package/src/components/account/sections/ChangePasswordSection.tsx +6 -10
  541. package/src/components/account/sections/MyProfileSection.tsx +215 -147
  542. package/src/components/account/sections/PreferencesSection.tsx +71 -71
  543. package/src/components/account/sections/ProjectsSection.tsx +110 -0
  544. package/src/components/account/sections/SecuritySection.tsx +72 -62
  545. package/src/components/account/sections/SubscriptionSection.tsx +36 -0
  546. package/src/components/account/sections/TeamSection.tsx +161 -0
  547. package/src/components/account/sections/TokenSection.tsx +4 -8
  548. package/src/components/account/sections/affiliates/AffiliateCommissionCard.tsx +83 -0
  549. package/src/components/account/sections/affiliates/AffiliateFlows.tsx +20 -0
  550. package/src/components/account/sections/affiliates/AffiliateLeadsSheet.tsx +143 -0
  551. package/src/components/account/sections/affiliates/AffiliateStatsCard.tsx +56 -0
  552. package/src/components/account/sections/affiliates/AffiliateStepCard.tsx +20 -0
  553. package/src/components/account/sections/affiliates/AffiliateTransactionsList.tsx +194 -0
  554. package/src/components/account/sections/affiliates/NoReceivingAccountModal.tsx +63 -0
  555. package/src/components/account/sections/affiliates/ReceivingAccountModal.tsx +213 -0
  556. package/src/components/account/sections/affiliates/RequestWithdrawalSheet.tsx +586 -0
  557. package/src/components/account/sections/affiliates/ViewAttachmentModal.tsx +47 -0
  558. package/src/components/account/sections/affiliates/reports/AffiliatesIndicatorsChart.tsx +45 -0
  559. package/src/components/account/sections/affiliates/reports/AffiliatesReportsTab.tsx +44 -0
  560. package/src/components/account/sections/affiliates/reports/useAffiliatesIndicatorsChart.ts +148 -0
  561. package/src/components/account/sections/projects/DeleteProjectModal.tsx +246 -0
  562. package/src/components/account/sections/projects/ProjectFlows.tsx +16 -0
  563. package/src/components/account/sections/projects/ProjectMembersStack.tsx +75 -0
  564. package/src/components/account/sections/projects/ProjectRow.tsx +96 -0
  565. package/src/components/account/sections/projects/ProjectSheet.tsx +603 -0
  566. package/src/components/account/sections/projects/ProjectsDisabledModal.tsx +69 -0
  567. package/src/components/account/sections/projects/project-form.schema.ts +30 -0
  568. package/src/components/account/sections/shared/ConnectListRow.tsx +68 -0
  569. package/src/components/account/sections/shared/DateFilterPopover.tsx +58 -0
  570. package/src/components/account/sections/shared/EntityAvatar.tsx +54 -0
  571. package/src/components/account/sections/shared/FilterPopover.tsx +79 -0
  572. package/src/components/account/sections/shared/FormSection.tsx +23 -0
  573. package/src/components/account/sections/shared/IconBox.tsx +21 -0
  574. package/src/components/account/sections/shared/InfiniteScrollList.tsx +57 -0
  575. package/src/components/account/sections/shared/ListPagination.tsx +84 -0
  576. package/src/components/account/sections/shared/RowActionsMenu.tsx +66 -0
  577. package/src/components/account/sections/shared/SectionLoadError.tsx +27 -0
  578. package/src/components/account/sections/shared/StatusBadge.tsx +33 -0
  579. package/src/components/account/sections/shared/WorkspaceSection.tsx +22 -0
  580. package/src/components/account/sections/subscription/AiCreditsUsage.tsx +152 -0
  581. package/src/components/account/sections/subscription/BillingAddressSheet.tsx +460 -0
  582. package/src/components/account/sections/subscription/BoletoDetailsDialog.tsx +104 -0
  583. package/src/components/account/sections/subscription/BoletoGeneratedDialog.tsx +24 -0
  584. package/src/components/account/sections/subscription/CancelPlanDialog.tsx +221 -0
  585. package/src/components/account/sections/subscription/ChargeRow.tsx +161 -0
  586. package/src/components/account/sections/subscription/ChargeStatusBadge.tsx +29 -0
  587. package/src/components/account/sections/subscription/ChargesList.tsx +125 -0
  588. package/src/components/account/sections/subscription/ManageCardsSheet.tsx +93 -0
  589. package/src/components/account/sections/subscription/OverdueReceiptOpener.tsx +29 -0
  590. package/src/components/account/sections/subscription/PayChargeDialog.tsx +306 -0
  591. package/src/components/account/sections/subscription/PaymentConfirmationDialog.tsx +70 -0
  592. package/src/components/account/sections/subscription/PaymentMethodsCard.tsx +117 -0
  593. package/src/components/account/sections/subscription/PendingChangeDialog.tsx +168 -0
  594. package/src/components/account/sections/subscription/PixDetailsDialog.tsx +246 -0
  595. package/src/components/account/sections/subscription/PixPaymentDialog.tsx +242 -0
  596. package/src/components/account/sections/subscription/PlanDetailsSheet.tsx +380 -0
  597. package/src/components/account/sections/subscription/ReceiptDetailsSheet.tsx +318 -0
  598. package/src/components/account/sections/subscription/SubscriptionFlows.tsx +40 -0
  599. package/src/components/account/sections/subscription/SubscriptionPlanCard.tsx +433 -0
  600. package/src/components/account/sections/subscription/UsageReportSheet.tsx +244 -0
  601. package/src/components/account/sections/subscription/change-plan/ChangePlanSheet.tsx +95 -0
  602. package/src/components/account/sections/subscription/change-plan/components/AbTestDetailsDialog.tsx +57 -0
  603. package/src/components/account/sections/subscription/change-plan/components/AddonsBlock.tsx +214 -0
  604. package/src/components/account/sections/subscription/change-plan/components/AlternativeBucketsSection.tsx +92 -0
  605. package/src/components/account/sections/subscription/change-plan/components/CouponBlock.tsx +42 -0
  606. package/src/components/account/sections/subscription/change-plan/components/CouponDialog.tsx +134 -0
  607. package/src/components/account/sections/subscription/change-plan/components/PricePreview.tsx +28 -0
  608. package/src/components/account/sections/subscription/change-plan/components/SummaryBlock.tsx +194 -0
  609. package/src/components/account/sections/subscription/change-plan/plan-comparison.ts +52 -0
  610. package/src/components/account/sections/subscription/change-plan/steps/PaymentSummaryStep.tsx +161 -0
  611. package/src/components/account/sections/subscription/change-plan/steps/PlanComparisonStep.tsx +165 -0
  612. package/src/components/account/sections/subscription/change-plan/steps/PlanViewStep.tsx +89 -0
  613. package/src/components/account/sections/subscription/change-plan/steps/ReactivationConfigStep.tsx +117 -0
  614. package/src/components/account/sections/subscription/change-plan/steps/ReactivationPaymentStep.tsx +139 -0
  615. package/src/components/account/sections/subscription/change-plan/useChangePlanState.tsx +1158 -0
  616. package/src/components/account/sections/subscription/downgrade/CannotDowngradeDialog.tsx +297 -0
  617. package/src/components/account/sections/subscription/downgrade/DowngradeReasonDialog.tsx +154 -0
  618. package/src/components/account/sections/subscription/plans/PlanCard.tsx +417 -0
  619. package/src/components/account/sections/subscription/plans/PlanCardSkeleton.tsx +70 -0
  620. package/src/components/account/sections/subscription/plans/PlansCatalogDialog.tsx +156 -0
  621. package/src/components/account/sections/team/DeleteUserModal.tsx +134 -0
  622. package/src/components/account/sections/team/TeamFlows.tsx +14 -0
  623. package/src/components/account/sections/team/TeamMemberRow.tsx +151 -0
  624. package/src/components/account/sections/team/UserSheet.tsx +688 -0
  625. package/src/components/account/sections/team/steps/NotificationsStep.tsx +109 -0
  626. package/src/components/account/sections/team/steps/ProjectSelectionStep.tsx +219 -0
  627. package/src/components/account/sections/team/steps/UserInformationStep.tsx +423 -0
  628. package/src/components/account/sections/team/user-form.schema.ts +43 -0
  629. package/src/components/account/types/workspace-actions.type.ts +56 -0
  630. package/src/components/layouts/ProfilePopover.tsx +11 -12
  631. package/src/components/layouts/UsersSelectorPopover.tsx +7 -4
  632. package/src/components/modals/AccountDeletionWarningModal.tsx +4 -5
  633. package/src/components/modals/AccountFrozenModal.tsx +6 -3
  634. package/src/components/modals/Modals.tsx +6 -3
  635. package/src/components/modals/PaidPlanRequiredModal.tsx +4 -5
  636. package/src/components/modals/cards/AddFirstCardWarningModal.tsx +72 -0
  637. package/src/components/modals/cards/SwitchPaymentToCardModal.tsx +232 -0
  638. package/src/components/modals/promo/AiCreditsOfferModal/AiCreditsOfferModal.tsx +5 -4
  639. package/src/components/ui/data-display/CardItem.tsx +9 -5
  640. package/src/components/ui/data-display/PaymentMethodIcons.tsx +43 -0
  641. package/src/components/ui/form/BillingPeriodSelector.tsx +173 -0
  642. package/src/components/ui/form/PaymentMethodToggle.tsx +119 -0
  643. package/src/components/ui/form/RadioOptionFieldIcon.tsx +64 -0
  644. package/src/components/ui/form/SegmentedControl.tsx +77 -0
  645. package/src/components/ui/overlay/Dialog.tsx +21 -2
  646. package/src/components/ui/overlay/Sheet.tsx +26 -5
  647. package/src/components/ui/overlay/layers.tsx +88 -4
  648. package/src/enums/AccountHubFlow.ts +8 -0
  649. package/src/enums/DateFilterPeriod.ts +17 -0
  650. package/src/enums/WorkspaceSectionType.ts +6 -0
  651. package/src/handlers.ts +14 -0
  652. package/src/hooks/useDebounce.ts +5 -3
  653. package/src/hooks/useUploadProgress.ts +42 -0
  654. package/src/i18n/messages/en-us.ts +909 -2
  655. package/src/i18n/messages/es-es.ts +913 -2
  656. package/src/i18n/messages/pt-br.ts +913 -2
  657. package/src/index.ts +56 -1
  658. package/src/infra/http/paged.ts +24 -0
  659. package/src/middleware.ts +1 -0
  660. package/src/middlewares/create-auth-middleware.ts +2 -5
  661. package/src/middlewares/create-legacy-account-routes-middleware.ts +54 -0
  662. package/src/middlewares/is-route-equals.ts +3 -0
  663. package/src/modules/accounts/actions/account-management.action.ts +22 -1
  664. package/src/modules/accounts/constants/account-hub-link.constants.ts +3 -0
  665. package/src/modules/accounts/constants/legacy-account-routes.constants.ts +1 -0
  666. package/src/modules/accounts/handlers/list-account-members.handler.ts +23 -0
  667. package/src/modules/accounts/hooks/add-user-projects.hook.ts +72 -0
  668. package/src/modules/accounts/hooks/create-account-user.hook.ts +21 -0
  669. package/src/modules/accounts/hooks/remove-user-projects.hook.ts +68 -0
  670. package/src/modules/accounts/hooks/use-account-members.hook.ts +31 -0
  671. package/src/modules/accounts/services/account.service.ts +71 -0
  672. package/src/modules/accounts/types/account-hub-link.type.ts +13 -0
  673. package/src/modules/accounts/types.ts +9 -0
  674. package/src/modules/accounts/utils/build-account-hub-url.ts +14 -0
  675. package/src/modules/accounts/utils/is-account-hub-flow.ts +7 -0
  676. package/src/modules/accounts/utils/is-account-section.ts +7 -0
  677. package/src/modules/accounts/utils/is-my-account-section.ts +12 -0
  678. package/src/modules/accounts/utils/map-legacy-account-route.ts +108 -0
  679. package/src/modules/accounts/utils/parse-account-hub-link.ts +21 -0
  680. package/src/modules/affiliates/actions/ensure-affiliate.action.ts +9 -0
  681. package/src/modules/affiliates/actions/request-deposit.action.ts +9 -0
  682. package/src/modules/affiliates/actions/update-affiliate.action.ts +9 -0
  683. package/src/modules/affiliates/constants/affiliate.constants.ts +11 -0
  684. package/src/modules/affiliates/constants/query-keys.constants.ts +7 -0
  685. package/src/modules/affiliates/handlers/affiliate-report-analytics.handler.ts +16 -0
  686. package/src/modules/affiliates/handlers/affiliate-withdrawal-limits.handler.ts +10 -0
  687. package/src/modules/affiliates/handlers/current-affiliate.handler.ts +10 -0
  688. package/src/modules/affiliates/handlers/list-affiliate-coupons.handler.ts +10 -0
  689. package/src/modules/affiliates/handlers/list-affiliate-leads.handler.ts +23 -0
  690. package/src/modules/affiliates/handlers/list-affiliate-transactions.handler.ts +23 -0
  691. package/src/modules/affiliates/hooks/use-affiliate-coupons.hook.ts +19 -0
  692. package/src/modules/affiliates/hooks/use-affiliate-leads.hook.ts +27 -0
  693. package/src/modules/affiliates/hooks/use-affiliate-report-analytics.hook.ts +19 -0
  694. package/src/modules/affiliates/hooks/use-affiliate-transactions.hook.ts +25 -0
  695. package/src/modules/affiliates/hooks/use-current-affiliate.hook.ts +19 -0
  696. package/src/modules/affiliates/hooks/use-ensure-affiliate.hook.ts +24 -0
  697. package/src/modules/affiliates/hooks/use-request-deposit.hook.ts +29 -0
  698. package/src/modules/affiliates/hooks/use-update-affiliate.hook.ts +24 -0
  699. package/src/modules/affiliates/hooks/use-withdrawal-limits.hook.ts +20 -0
  700. package/src/modules/affiliates/services/affiliates.service.ts +240 -0
  701. package/src/modules/affiliates/types/affiliate.type.ts +180 -0
  702. package/src/modules/affiliates/utils/get-affiliate-share-link.ts +8 -0
  703. package/src/modules/charges/actions/get-nota-fiscal.action.ts +8 -0
  704. package/src/modules/charges/actions/refresh-pix.action.ts +8 -0
  705. package/src/modules/charges/hooks/nota-fiscal.hook.ts +13 -0
  706. package/src/modules/charges/hooks/refresh-pix.hook.ts +13 -0
  707. package/src/modules/charges/services/charges.service.ts +121 -0
  708. package/src/modules/charges/types/nota-fiscal.type.ts +20 -0
  709. package/src/modules/charges/types/refresh-pix.type.ts +14 -0
  710. package/src/modules/charges/utils/get-charge-download-url.ts +10 -0
  711. package/src/modules/coupons/constants/query-keys.constants.ts +1 -0
  712. package/src/modules/coupons/handlers/find-coupon-by-code.handler.ts +16 -0
  713. package/src/modules/coupons/handlers/find-coupon-by-id.handler.ts +15 -0
  714. package/src/modules/coupons/hooks/use-coupon-by-code.hook.ts +16 -0
  715. package/src/modules/coupons/hooks/use-coupon-by-id.hook.ts +20 -0
  716. package/src/modules/coupons/services/coupons.service.ts +54 -0
  717. package/src/modules/coupons/types/coupon.type.ts +70 -0
  718. package/src/modules/coupons/utils/coupon-restrictions.ts +112 -0
  719. package/src/modules/domains/handlers/count-domains.handler.ts +10 -0
  720. package/src/modules/domains/hooks/count-domains.hook.ts +17 -0
  721. package/src/modules/domains/services/domains.service.ts +18 -0
  722. package/src/modules/ia-credits/handlers/list-ia-credit-operations.handler.ts +14 -0
  723. package/src/modules/ia-credits/hooks/ia-credit-operations.hook.ts +33 -0
  724. package/src/modules/ia-credits/services/ia-credits.service.ts +32 -1
  725. package/src/modules/pages/handlers/count-pages.handler.ts +5 -2
  726. package/src/modules/pages/hooks/count-published-pages.hook.ts +26 -0
  727. package/src/modules/pages/services/pages.service.ts +3 -2
  728. package/src/modules/plans/constants/plan-tooltips.constants.ts +16 -0
  729. package/src/modules/plans/hooks/use-enriched-plans.hook.ts +31 -0
  730. package/src/modules/plans/hooks/use-ui-plans.hook.ts +22 -0
  731. package/src/modules/projects/hooks/add-project-users.hook.ts +29 -0
  732. package/src/modules/projects/hooks/list-all-account-users.hook.ts +3 -6
  733. package/src/modules/projects/hooks/list-available-users.hook.ts +3 -6
  734. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +3 -6
  735. package/src/modules/projects/hooks/list-project-users.hook.ts +3 -6
  736. package/src/modules/projects/hooks/remove-project-users.hook.ts +29 -0
  737. package/src/modules/projects/services/project-users.service.ts +135 -130
  738. package/src/modules/projects/types.ts +89 -88
  739. package/src/modules/subscriptions/actions/cancel-subscription.action.ts +12 -0
  740. package/src/modules/subscriptions/actions/create-subscription.action.ts +9 -0
  741. package/src/modules/subscriptions/actions/find-pending-pix-status.action.ts +8 -0
  742. package/src/modules/subscriptions/actions/find-subscription-by-id.action.ts +8 -0
  743. package/src/modules/subscriptions/constants/addons.constants.ts +50 -0
  744. package/src/modules/subscriptions/constants/downgrade.constants.ts +30 -0
  745. package/src/modules/subscriptions/constants/subscription.constants.ts +3 -0
  746. package/src/modules/subscriptions/handlers/pending-pix-status.handler.ts +17 -0
  747. package/src/modules/subscriptions/hooks/cancel-subscription.hook.ts +28 -0
  748. package/src/modules/subscriptions/hooks/create-subscription.hook.ts +34 -0
  749. package/src/modules/subscriptions/hooks/find-subscription-by-id.hook.ts +17 -0
  750. package/src/modules/subscriptions/hooks/pending-pix-status.hook.ts +30 -0
  751. package/src/modules/subscriptions/services/subscriptions.service.ts +401 -301
  752. package/src/modules/subscriptions/types/cancel-subscription.type.ts +8 -0
  753. package/src/modules/subscriptions/types/create-subscription.type.ts +79 -0
  754. package/src/modules/subscriptions/types/pending-pix-status.type.ts +33 -0
  755. package/src/modules/subscriptions/types/subscription.type.ts +157 -147
  756. package/src/modules/subscriptions/utils/addon-buckets.ts +129 -0
  757. package/src/modules/subscriptions/utils/confirm-payment-if-required.ts +9 -2
  758. package/src/modules/subscriptions/utils/first-period-pricing.ts +63 -0
  759. package/src/modules/subscriptions/utils/is-api-subscription.ts +6 -0
  760. package/src/modules/subscriptions/utils/is-boleto-payer.ts +21 -0
  761. package/src/modules/subscriptions/utils/is-free-subscription.ts +6 -0
  762. package/src/modules/subscriptions/utils/periodicity.ts +101 -0
  763. package/src/modules/subscriptions/utils/resolve-subscription-plan-name.ts +44 -0
  764. package/src/modules/users/hooks/messages.hook.ts +3 -5
  765. package/src/server.ts +102 -99
  766. package/src/store/useAccountModals.ts +22 -5
  767. package/src/store/useAccountUnsavedChanges.ts +52 -0
  768. package/src/store/useAffiliateFlows.ts +46 -0
  769. package/src/store/useProjectFlows.ts +42 -0
  770. package/src/store/useSubscriptionFlows.ts +176 -0
  771. package/src/store/useTeamFlows.ts +34 -0
  772. package/src/testing/factories/coupon.factory.ts +17 -0
  773. package/src/testing/factories/index.ts +3 -0
  774. package/src/testing/factories/project-user.factory.ts +15 -0
  775. package/src/testing/factories/project.factory.ts +19 -0
  776. package/src/testing/react/providers.tsx +2 -1
  777. package/src/utils/browser/chart-custom-tooltip.ts +85 -0
  778. package/src/utils/browser/get-css-variable.ts +6 -0
  779. package/src/utils/constants/scrollbar.ts +10 -0
  780. package/src/utils/date-filter-period.ts +34 -0
  781. package/src/utils/file/index.ts +13 -0
  782. package/src/utils/format/initials.ts +10 -0
  783. package/src/utils/format/masks.ts +41 -0
  784. package/src/utils/qrcode/to-data-url.ts +23 -0
  785. package/src/utils/validators/account.ts +0 -8
  786. package/dist/components/account/ConfigurationsMyAccountModal.mjs +0 -143
  787. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +0 -1
  788. package/dist/components/account/hooks/useConfigurationsModal.mjs +0 -34
  789. package/dist/components/account/hooks/useConfigurationsModal.mjs.map +0 -1
  790. package/src/components/account/ConfigurationsMyAccountModal.tsx +0 -179
  791. package/src/components/account/hooks/useConfigurationsModal.ts +0 -45
@@ -0,0 +1,417 @@
1
+ 'use client';
2
+
3
+ import { IconCheck, IconInfoCircle, IconStack2, IconUsers, IconWorld, IconX } from '@tabler/icons-react';
4
+ import { useTranslations } from 'next-intl';
5
+ import { Button } from '../../../../ui/buttons/Button';
6
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../../../../ui/overlay/Tooltip';
7
+ import { useCurrencyFormatter } from '../../../../../modules/accounts/hooks/use-currency-formatter.hook';
8
+ import { useManagementPermissions } from '../../../../../modules/auth/hooks/useManagementPermissions';
9
+ import {
10
+ couponAllowedBillingPeriod,
11
+ isCouponApplicableToPlan,
12
+ } from '../../../../../modules/coupons/utils/coupon-restrictions';
13
+ import type { CouponStripeData } from '../../../../../modules/coupons/types/coupon.type';
14
+ import { useCountDomains } from '../../../../../modules/domains/hooks/count-domains.hook';
15
+ import { getPlanTooltips } from '../../../../../modules/plans/constants/plan-tooltips.constants';
16
+ import { useEnrichedPlans } from '../../../../../modules/plans/hooks/use-enriched-plans.hook';
17
+ import { useUiPlans } from '../../../../../modules/plans/hooks/use-ui-plans.hook';
18
+ import type { PlanTooltips, UiPlan } from '../../../../../modules/plans/types/plan.type';
19
+ import {
20
+ ADDON_IDS,
21
+ buildAiCreditOptions,
22
+ AI_CREDIT_SIZES,
23
+ } from '../../../../../modules/subscriptions/constants/addons.constants';
24
+ import { useCurrentSubscription } from '../../../../../modules/subscriptions/hooks/use-current-subscription.hook';
25
+ import type { BillingPeriod } from '../../../../../modules/subscriptions/types/billing-period.type';
26
+ import { isFreeSubscription } from '../../../../../modules/subscriptions/utils/is-free-subscription';
27
+ import { roundDiscountPercent } from '../../../../../modules/subscriptions/utils/periodicity';
28
+ import { useExternalContracting, useIsDefaultWhitelabel } from '../../../../../providers/whitelabel.provider';
29
+ import { useSubscriptionFlows } from '../../../../../store/useSubscriptionFlows';
30
+ import { parseCurrencyToNumber } from '../../../../../utils/format/currency';
31
+ import { cn } from '../../../../../infra/utils/clsx';
32
+
33
+ function InfoTooltip({ tooltipKey, disabled }: { tooltipKey: keyof PlanTooltips; disabled?: boolean }) {
34
+ const translate = useTranslations();
35
+ const planTooltips = getPlanTooltips(translate);
36
+
37
+ return (
38
+ <Tooltip>
39
+ <TooltipTrigger asChild>
40
+ <button type="button" className="flex items-center justify-center size-6 shrink-0">
41
+ <IconInfoCircle
42
+ size={16}
43
+ className={disabled ? 'text-zinc-500 opacity-40' : 'text-zinc-950'}
44
+ />
45
+ </button>
46
+ </TooltipTrigger>
47
+ <TooltipContent side="right" className="max-w-53.75 p-3">
48
+ {planTooltips[tooltipKey]}
49
+ </TooltipContent>
50
+ </Tooltip>
51
+ );
52
+ }
53
+
54
+ interface PlanCardProps {
55
+ plan: UiPlan;
56
+ billingPeriod: BillingPeriod;
57
+ couponStripeData?: CouponStripeData | null;
58
+ onBeforeAction?: () => void;
59
+ }
60
+
61
+ /** Card do catálogo: recursos do plano, preço no período escolhido e a ação de contratar/trocar. */
62
+ export function PlanCard({ plan, billingPeriod, couponStripeData, onBeforeAction }: PlanCardProps) {
63
+ const translate = useTranslations();
64
+ const translateCard = useTranslations('common.plans.card');
65
+ const translateCatalog = useTranslations('common.account.workspace.subscription.plansCatalog');
66
+ const isDefaultWhitelabel = useIsDefaultWhitelabel();
67
+ const { redirectToExternal } = useExternalContracting();
68
+ const { isOwnerOrAdmin } = useManagementPermissions();
69
+ const { formatCurrencyNumber } = useCurrencyFormatter();
70
+
71
+ const openChangePlan = useSubscriptionFlows((state) => state.openChangePlan);
72
+ const openDowngradeReason = useSubscriptionFlows((state) => state.openDowngradeReason);
73
+ const openCannotDowngrade = useSubscriptionFlows((state) => state.openCannotDowngrade);
74
+
75
+ const aiCreditOptions = buildAiCreditOptions(plan.items);
76
+ const defaultCredit = aiCreditOptions[0];
77
+ // Créditos de IA inclusos no plano = item AI (id_addon 6) com value 0 (base/incluso).
78
+ // Lido do live plan.items; a quantidade varia por plano (não hardcodar).
79
+ const includedAiCredits =
80
+ plan.items.find((item) => item.id_addon === ADDON_IDS.AI && (item.value ?? 0) === 0)?.quantity ?? 0;
81
+ // Plano inclui Teste A/B quando há item AB_TEST (id_addon 4) — espelha a lógica do
82
+ // PlanDetailsSheet (item da assinatura com quantity > 0). Agência exibe como incluso.
83
+ const includesAbTest = plan.items.some(
84
+ (item) => item.id_addon === ADDON_IDS.AB_TEST && item.quantity > 0
85
+ );
86
+
87
+ const { data: plans = [], subscriptionId } = useEnrichedPlans();
88
+ const { data: allPlans = [] } = useUiPlans();
89
+ const currentPlan = plans.find((item) => item.isCurrentPlan);
90
+
91
+ const { data: subscriptionData, isPending: isLoadingSubscription } = useCurrentSubscription();
92
+ const { data: registeredDomains = 0 } = useCountDomains();
93
+
94
+ const activeSubscription = subscriptionData?.data?.[0] ?? null;
95
+ const isFirstPurchase =
96
+ !activeSubscription ||
97
+ !activeSubscription.active ||
98
+ isFreeSubscription(activeSubscription) ||
99
+ activeSubscription.type === 'trial';
100
+ const isSubscriptionLoaded = !isLoadingSubscription;
101
+
102
+ const priceUnavailable = !!plan.priceUnavailable;
103
+
104
+ // Cupom da campanha: badge + preço promocional só no(s) plano(s) e periodicidade que ele
105
+ // cobre, e só na primeira contratação (regra da oferta). O desconto é calculado a partir
106
+ // do stripe_data do cupom (mesma fonte usada pela troca de plano via getCouponByCode).
107
+ const couponApplies = isCouponApplicableToPlan(couponStripeData, plan.planId);
108
+ const couponPeriod = couponAllowedBillingPeriod(couponStripeData?.periodicity);
109
+ const couponActiveForCard =
110
+ !!couponStripeData &&
111
+ isFirstPurchase &&
112
+ !priceUnavailable &&
113
+ couponApplies &&
114
+ (couponPeriod === null || couponPeriod === billingPeriod);
115
+ const couponPercentOff = couponStripeData?.percent_off ?? 0;
116
+ const couponAmountOff = couponStripeData?.amount_off ?? 0; // centavos (Stripe)
117
+
118
+ const computePriceData = () => {
119
+ if (priceUnavailable) {
120
+ return {
121
+ creditLabel: '',
122
+ creditPrice: '',
123
+ totalFormatted: plan.price,
124
+ promoTotalFormatted: '',
125
+ promoActive: false,
126
+ periodLabel: '',
127
+ upfrontNote: '',
128
+ badgePercent: 0,
129
+ };
130
+ }
131
+
132
+ const planPriceMonthly = parseCurrencyToNumber(plan.price);
133
+ const creditPriceMonthly = isDefaultWhitelabel ? (defaultCredit.price ?? 0) : 0;
134
+ const baseMonthly = planPriceMonthly + creditPriceMonthly;
135
+
136
+ // O desconto de periodicidade varia por plano e por moeda, então sai da razão entre o
137
+ // mensal do período e o mensal avulso, ambos já resolvidos pela API.
138
+ const periodDiscountFactor = (period: 'semiannual' | 'annual') => {
139
+ const listMonthly = plan.pricingByPeriod?.monthly ?? 0;
140
+ const periodMonthly = plan.pricingByPeriod?.[period];
141
+ if (!listMonthly || periodMonthly == null) return 1;
142
+ return periodMonthly / listMonthly;
143
+ };
144
+
145
+ const periodPricingKey =
146
+ billingPeriod === 'annual' ? 'annual' : billingPeriod === 'semiannual' ? 'semester' : 'monthly';
147
+ const periodPricing = plan.pricing?.[periodPricingKey];
148
+
149
+ let months = 1;
150
+ let discountFactor = 1;
151
+ if (billingPeriod === 'semiannual') {
152
+ months = 6;
153
+ discountFactor = periodDiscountFactor('semiannual');
154
+ } else if (billingPeriod === 'annual') {
155
+ months = 12;
156
+ discountFactor = periodDiscountFactor('annual');
157
+ }
158
+
159
+ const badgePercent = periodPricing ? roundDiscountPercent(periodPricing.discount_percent) : 0;
160
+ const total = baseMonthly * months * discountFactor;
161
+
162
+ const promoTotal = couponActiveForCard
163
+ ? couponPercentOff > 0
164
+ ? total * (1 - couponPercentOff / 100)
165
+ : couponAmountOff > 0
166
+ ? Math.max(0, total - couponAmountOff / 100)
167
+ : total
168
+ : total;
169
+
170
+ // O card anuncia o equivalente mensal e repete embaixo o valor à vista; o cálculo acima
171
+ // continua no total do período porque cupom de valor fixo desconta sobre ele.
172
+ const chargedTotal = couponActiveForCard && promoTotal < total ? promoTotal : total;
173
+ let upfrontNote = '';
174
+ if (billingPeriod === 'annual') {
175
+ upfrontNote = translateCard('upfrontNoteAnnual', { price: formatCurrencyNumber(chargedTotal) });
176
+ } else if (billingPeriod === 'semiannual') {
177
+ upfrontNote = translateCard('upfrontNoteSemiannual', {
178
+ price: formatCurrencyNumber(chargedTotal),
179
+ });
180
+ }
181
+
182
+ return {
183
+ creditLabel:
184
+ isDefaultWhitelabel && defaultCredit.credits !== AI_CREDIT_SIZES[0]
185
+ ? translateCard('aiCreditsLabel', { credits: defaultCredit.credits.toLocaleString('pt-BR') })
186
+ : '',
187
+ creditPrice:
188
+ defaultCredit.price === 0
189
+ ? translateCard('defaultPrice')
190
+ : formatCurrencyNumber(defaultCredit.price),
191
+ totalFormatted: formatCurrencyNumber(total / months),
192
+ promoTotalFormatted: formatCurrencyNumber(promoTotal / months),
193
+ promoActive: couponActiveForCard && promoTotal < total,
194
+ periodLabel: translate('common.periodicity.suffixMonthly'),
195
+ upfrontNote,
196
+ badgePercent,
197
+ };
198
+ };
199
+
200
+ const handleSelectPlan = () => {
201
+ if (priceUnavailable || !isSubscriptionLoaded) return;
202
+
203
+ // Contratação externa do whitelabel tem prioridade sobre qualquer fluxo interno.
204
+ if (redirectToExternal(isFirstPurchase ? 'plans' : 'contracting')) return;
205
+
206
+ const targetPlan = allPlans.find((item) => item.planId === plan.planId);
207
+ const targetDomainItem = targetPlan?.items.find((item) => item.id_addon === ADDON_IDS.DOMAINS);
208
+ const targetIncludedDomains = targetDomainItem?.quantity ?? 0;
209
+ const targetSupportsExtraDomains = !!targetDomainItem && targetDomainItem.quantity > 1;
210
+
211
+ // Limite de páginas publicadas do plano alvo (0/ausente = ilimitadas).
212
+ const targetPagesItem = targetPlan?.items.find((item) => item.id_addon === ADDON_IDS.PAGES);
213
+ const targetIncludedPages =
214
+ targetPagesItem && targetPagesItem.quantity > 0 ? targetPagesItem.quantity : null;
215
+
216
+ const newPlanMonthly = plan.pricingByPeriod?.monthly ?? parseCurrencyToNumber(plan.price);
217
+ const currentPlanMonthly = currentPlan
218
+ ? (currentPlan.pricingByPeriod?.monthly ?? parseCurrencyToNumber(currentPlan.price))
219
+ : 0;
220
+ const isDowngrade = !isFirstPurchase && newPlanMonthly < currentPlanMonthly;
221
+
222
+ const downgradeData = {
223
+ targetPlan: plan,
224
+ planName: plan.name,
225
+ billingPeriod,
226
+ planIncludedDomains: targetIncludedDomains,
227
+ planIncludedPages: targetIncludedPages,
228
+ registeredDomains,
229
+ };
230
+
231
+ onBeforeAction?.();
232
+
233
+ // Downgrade coleta o motivo primeiro; conflitos de domínio/página são conferidos lá.
234
+ if (isDowngrade) {
235
+ openDowngradeReason(downgradeData);
236
+ return;
237
+ }
238
+
239
+ // O plano alvo não vende domínios extras e a conta tem mais do que o incluso: abre o
240
+ // roteiro de ajuste em vez de deixar a troca falhar no pagamento.
241
+ if (!targetSupportsExtraDomains && registeredDomains > targetIncludedDomains) {
242
+ openCannotDowngrade({ ...downgradeData, domainsExceeded: true, pagesExceeded: false });
243
+ return;
244
+ }
245
+
246
+
247
+ // Sem assinatura paga corrente a troca é uma contratação: o fluxo de reativação já cria a
248
+ // assinatura do zero (mesmo caminho do checkout do gapps), com o plano escolhido aqui.
249
+ if (isFirstPurchase) {
250
+ openChangePlan({ targetPlan: plan, billingPeriod, isReactivation: true, selectedCreditIndex: 0 });
251
+ return;
252
+ }
253
+
254
+ if (subscriptionId == null) return;
255
+
256
+ openChangePlan({ targetPlan: plan, billingPeriod, isDowngrade, selectedCreditIndex: 0 });
257
+ };
258
+
259
+ const priceData = computePriceData();
260
+ const isCurrentForPeriod = plan.isCurrentPlan && plan.currentPeriodicity === billingPeriod;
261
+ const shouldShowCurrentPlanBadge =
262
+ isCurrentForPeriod &&
263
+ !isFreeSubscription(activeSubscription) &&
264
+ activeSubscription?.type !== 'trial' &&
265
+ !activeSubscription?.date_cancellation;
266
+
267
+ return (
268
+ <div
269
+ className={cn(
270
+ 'flex flex-col flex-1 min-w-0 rounded-lg overflow-hidden relative',
271
+ plan.isPopular ? 'bg-primary' : 'border border-zinc-200'
272
+ )}
273
+ >
274
+ {plan.isPopular && (
275
+ <div className="flex items-center justify-center h-8 px-1.5 shrink-0 bg-primary">
276
+ <span className="paragraph-xsmall-semibold text-zinc-950">
277
+ {translateCard('mostPopular')}
278
+ </span>
279
+ </div>
280
+ )}
281
+
282
+ <div
283
+ className={cn(
284
+ 'flex flex-col flex-1 bg-white overflow-hidden relative',
285
+ plan.isPopular && 'border-2 border-primary rounded-lg'
286
+ )}
287
+ >
288
+ <div className="pt-2 px-2 bg-white shrink-0">
289
+ <div className="flex flex-col gap-6 p-5 bg-zinc-50 rounded">
290
+ <div className="flex items-start justify-between gap-2">
291
+ <span className="paragraph-medium-semibold text-zinc-950 font-outfit">{plan.name}</span>
292
+ {priceData.promoActive && (
293
+ <span className="shrink-0 rounded-md bg-cyan-50 px-2 py-1 paragraph-xsmall-semibold text-cyan-700">
294
+ {translateCard('promoBadge')}
295
+ </span>
296
+ )}
297
+ </div>
298
+ <div className="flex flex-col gap-3">
299
+ <div className="flex items-center gap-2">
300
+ <IconStack2 size={16} className="text-zinc-950 shrink-0" />
301
+ <span className="paragraph-small-medium text-zinc-950">{plan.mainFeatures.pages}</span>
302
+ </div>
303
+ <div className="flex items-center gap-2">
304
+ <IconWorld size={16} className="text-zinc-950 shrink-0" />
305
+ <span className="paragraph-small-medium text-zinc-950">
306
+ {plan.mainFeatures.domains}
307
+ </span>
308
+ <InfoTooltip tooltipKey="domains" />
309
+ </div>
310
+ <div className="flex items-center gap-2">
311
+ <IconUsers size={16} className="text-zinc-950 shrink-0" />
312
+ <span className="paragraph-small-medium text-zinc-950">{plan.mainFeatures.users}</span>
313
+ <InfoTooltip tooltipKey="users" />
314
+ </div>
315
+ </div>
316
+ </div>
317
+ </div>
318
+
319
+ <div className="flex-1 p-6 bg-white">
320
+ <div className="flex flex-col gap-3">
321
+ {plan.features.map((feature, index) => (
322
+ <div key={index} className="flex items-center gap-2">
323
+ {feature.icon === 'check' ? (
324
+ <IconCheck size={16} className="text-zinc-950 shrink-0" />
325
+ ) : (
326
+ <IconX size={16} className="text-zinc-950 shrink-0" />
327
+ )}
328
+ <span
329
+ className={cn(
330
+ 'paragraph-small-medium text-zinc-500',
331
+ feature.disabled && 'opacity-40'
332
+ )}
333
+ >
334
+ {feature.text}
335
+ </span>
336
+ {feature.tooltip && (
337
+ <InfoTooltip tooltipKey={feature.tooltip} disabled={feature.disabled} />
338
+ )}
339
+ </div>
340
+ ))}
341
+ {includesAbTest && (
342
+ <div className="flex items-center gap-2">
343
+ <IconCheck size={16} className="text-zinc-950 shrink-0" />
344
+ <span className="paragraph-small-medium text-zinc-500">
345
+ {translateCard('abTestIncluded')}
346
+ </span>
347
+ </div>
348
+ )}
349
+ {isDefaultWhitelabel && includedAiCredits > 0 && (
350
+ <div className="flex items-center gap-2">
351
+ <IconCheck size={16} className="text-zinc-950 shrink-0" />
352
+ <span className="paragraph-small-medium text-zinc-500">
353
+ {translateCard('aiCreditsIncluded', {
354
+ credits: includedAiCredits.toLocaleString('pt-BR'),
355
+ })}
356
+ </span>
357
+ </div>
358
+ )}
359
+ </div>
360
+ </div>
361
+
362
+ <div className="shrink-0 relative">
363
+ <div className="absolute -top-6 left-0 right-0 h-6 bg-linear-to-t from-white to-transparent pointer-events-none" />
364
+ <div className="flex flex-col gap-6 p-6 border-t border-zinc-200 bg-white">
365
+ <div className="flex flex-col gap-2">
366
+ {priceData.promoActive ? (
367
+ <span className="paragraph-xsmall-medium text-zinc-500 line-through">
368
+ {translateCard('promoFrom')} {priceData.totalFormatted}
369
+ </span>
370
+ ) : (
371
+ priceData.badgePercent > 0 && (
372
+ <span className="w-fit paragraph-xsmall-semibold h-5 flex items-center px-1.5 rounded bg-green-50 text-green-600 border border-green-100">
373
+ {translateCatalog('discountBadge', { percent: String(priceData.badgePercent) })}
374
+ </span>
375
+ )
376
+ )}
377
+ <p className="paragraph-xlarge-semibold text-zinc-950 tracking-[-0.24px] font-outfit">
378
+ {priceData.promoActive ? priceData.promoTotalFormatted : priceData.totalFormatted}
379
+ <span className="paragraph-xsmall-medium text-zinc-500"> {priceData.periodLabel}</span>
380
+ </p>
381
+ </div>
382
+ <div className="flex flex-col gap-2">
383
+ {shouldShowCurrentPlanBadge ? (
384
+ <div className="flex items-center gap-3 h-12">
385
+ <div className="flex items-center justify-center size-6 bg-zinc-200 rounded-full shrink-0">
386
+ <IconCheck size={16} className="text-zinc-950" />
387
+ </div>
388
+ <span className="paragraph-small-semibold text-zinc-950">
389
+ {translateCard('currentPlan')}
390
+ </span>
391
+ </div>
392
+ ) : isOwnerOrAdmin ? (
393
+ <Button
394
+ className={cn(
395
+ 'w-full h-12 paragraph-small-semibold',
396
+ plan.buttonVariant === 'brand'
397
+ ? 'bg-primary hover:bg-primary text-zinc-950'
398
+ : 'bg-zinc-950 hover:bg-zinc-950 text-white'
399
+ )}
400
+ onClick={handleSelectPlan}
401
+ disabled={priceUnavailable}
402
+ >
403
+ {translateCard('selectPlan')}
404
+ </Button>
405
+ ) : null}
406
+ {priceData.upfrontNote && (
407
+ <span className="paragraph-xsmall-medium text-zinc-500 text-center text-balance">
408
+ {priceData.upfrontNote}
409
+ </span>
410
+ )}
411
+ </div>
412
+ </div>
413
+ </div>
414
+ </div>
415
+ </div>
416
+ );
417
+ }
@@ -0,0 +1,70 @@
1
+ import { Skeleton } from '../../../../ui/feedback/Skeleton';
2
+ import { cn } from '../../../../../infra/utils/clsx';
3
+
4
+ interface PlanCardSkeletonProps {
5
+ isPopular?: boolean;
6
+ isDefaultWhitelabel?: boolean;
7
+ }
8
+
9
+ /** Esqueleto do card enquanto o catálogo (e o cupom da campanha) carrega. */
10
+ export function PlanCardSkeleton({ isPopular, isDefaultWhitelabel = true }: PlanCardSkeletonProps) {
11
+ const accentBg = isDefaultWhitelabel ? 'bg-cyan-300' : 'bg-zinc-300';
12
+ const accentBorder = isDefaultWhitelabel ? 'border-cyan-300' : 'border-zinc-300';
13
+ const skeletonBg = isDefaultWhitelabel ? 'bg-cyan-200' : 'bg-zinc-200';
14
+
15
+ return (
16
+ <div
17
+ className={cn(
18
+ 'flex flex-col flex-1 min-w-0 rounded-lg overflow-hidden relative',
19
+ isPopular ? accentBg : 'border border-zinc-200'
20
+ )}
21
+ >
22
+ {isPopular && (
23
+ <div className={cn('flex items-center justify-center h-8 px-1.5 shrink-0', accentBg)}>
24
+ <Skeleton className={cn('h-3 w-20', skeletonBg)} />
25
+ </div>
26
+ )}
27
+ <div
28
+ className={cn(
29
+ 'flex flex-col flex-1 bg-white overflow-hidden relative',
30
+ isPopular && `border-2 ${accentBorder} rounded-lg`
31
+ )}
32
+ >
33
+ <div className="pt-2 px-2 bg-white shrink-0">
34
+ <div className="flex flex-col gap-6 p-5 bg-zinc-50 rounded">
35
+ <Skeleton className="h-4 w-24" />
36
+ <div className="flex flex-col gap-3">
37
+ {[1, 2, 3].map((row) => (
38
+ <div key={row} className="flex items-center gap-2">
39
+ <Skeleton className="size-4 rounded shrink-0" />
40
+ <Skeleton className="h-3.5 w-32" />
41
+ </div>
42
+ ))}
43
+ </div>
44
+ </div>
45
+ </div>
46
+
47
+ <div className="flex-1 p-6 bg-white">
48
+ <div className="flex flex-col gap-3">
49
+ {[120, 110, 140, 125, 130, 100, 145, 115].map((width, index) => (
50
+ <div key={index} className="flex items-center gap-2">
51
+ <Skeleton className="size-4 rounded shrink-0" />
52
+ <Skeleton className="h-3.5" style={{ width }} />
53
+ </div>
54
+ ))}
55
+ </div>
56
+ </div>
57
+
58
+ <div className="shrink-0">
59
+ <div className="flex flex-col gap-6 p-6 border-t border-zinc-200 bg-white">
60
+ <div className="flex flex-col gap-2">
61
+ <Skeleton className="h-3 w-16" />
62
+ <Skeleton className="h-5 w-36" />
63
+ </div>
64
+ <Skeleton className="h-12 w-full rounded-lg" />
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ );
70
+ }
@@ -0,0 +1,156 @@
1
+ 'use client';
2
+
3
+ import { useState, type ReactNode } from 'react';
4
+ import { IconX } from '@tabler/icons-react';
5
+ import { useTranslations } from 'next-intl';
6
+ import { Dialog, DialogContent, DialogTitle } from '../../../../ui/overlay/Dialog';
7
+ import { SegmentedControl } from '../../../../ui/form/SegmentedControl';
8
+ import { useCurrencyFormatter } from '../../../../../modules/accounts/hooks/use-currency-formatter.hook';
9
+ import { couponAllowedBillingPeriod } from '../../../../../modules/coupons/utils/coupon-restrictions';
10
+ import { HIDDEN_PLAN_IDS } from '../../../../../modules/plans/constants/plan-tooltips.constants';
11
+ import { useEnrichedPlans } from '../../../../../modules/plans/hooks/use-enriched-plans.hook';
12
+ import { STARTER_PLAN_ID } from '../../../../../modules/subscriptions/constants/addons.constants';
13
+ import { useCurrentSubscription } from '../../../../../modules/subscriptions/hooks/use-current-subscription.hook';
14
+ import type { BillingPeriod } from '../../../../../modules/subscriptions/types/billing-period.type';
15
+ import { isFreeSubscription } from '../../../../../modules/subscriptions/utils/is-free-subscription';
16
+ import {
17
+ getCatalogBadgePercents,
18
+ periodicityToBillingPeriod,
19
+ USD_CATALOG_MAX_ANNUAL_DISCOUNT_PERCENT,
20
+ } from '../../../../../modules/subscriptions/utils/periodicity';
21
+ import { useIsDefaultWhitelabel } from '../../../../../providers/whitelabel.provider';
22
+ import { useSubscriptionFlows } from '../../../../../store/useSubscriptionFlows';
23
+ import { PlanCard } from './PlanCard';
24
+ import { PlanCardSkeleton } from './PlanCardSkeleton';
25
+
26
+ const PERIOD_DISCOUNT_BADGE_CLASS =
27
+ 'absolute -top-4.5 whitespace-nowrap text-[10px] font-semibold leading-none px-1.5 py-1 rounded text-green-600 bg-green-50 border border-green-100 lg:static lg:whitespace-normal lg:text-xs lg:leading-4 lg:px-1.5 lg:h-6 lg:flex lg:items-center lg:rounded-lg';
28
+
29
+ function PlansCatalogContent({ onClose }: { onClose: () => void }) {
30
+ const translate = useTranslations('common.account.workspace.subscription.plansCatalog');
31
+ const { currency } = useCurrencyFormatter();
32
+ const isUsd = currency === 'usd';
33
+ const isDefaultWhitelabel = useIsDefaultWhitelabel();
34
+
35
+ const appliedCouponStripeData =
36
+ useSubscriptionFlows((state) => state.plansCatalog?.appliedCouponStripeData) ?? null;
37
+
38
+ const { data: plans = [], isPending: isLoadingPlans } = useEnrichedPlans();
39
+ const { data: subscriptionData } = useCurrentSubscription();
40
+ const activeSubscription = subscriptionData?.data?.[0] ?? null;
41
+
42
+ const defaultPeriod = periodicityToBillingPeriod(activeSubscription?.periodicity) ?? 'monthly';
43
+ const requestedPeriod =
44
+ couponAllowedBillingPeriod(appliedCouponStripeData?.periodicity) ?? defaultPeriod;
45
+ // Semestral não tem coluna própria na vitrine: cai no anual, que é o período com desconto.
46
+ const [billingPeriod, setBillingPeriod] = useState<BillingPeriod>(
47
+ requestedPeriod === 'semiannual' ? 'annual' : requestedPeriod
48
+ );
49
+
50
+ const badgePercents = getCatalogBadgePercents(plans);
51
+
52
+ const periodOptions: Array<{ value: BillingPeriod; label: ReactNode }> = [
53
+ { value: 'monthly', label: translate('periodMonthly') },
54
+ {
55
+ value: 'annual',
56
+ label: (
57
+ <span className="relative lg:flex lg:items-center lg:gap-1">
58
+ {translate('periodAnnual')}
59
+ {isUsd ? (
60
+ <span className={`${PERIOD_DISCOUNT_BADGE_CLASS} -right-8`}>
61
+ {translate('discountCatalog', {
62
+ percent: String(USD_CATALOG_MAX_ANNUAL_DISCOUNT_PERCENT),
63
+ })}
64
+ </span>
65
+ ) : badgePercents ? (
66
+ <span className={`${PERIOD_DISCOUNT_BADGE_CLASS} -right-5`}>
67
+ {translate('discountBadge', { percent: String(badgePercents.annual) })}
68
+ </span>
69
+ ) : null}
70
+ </span>
71
+ ),
72
+ },
73
+ ];
74
+
75
+ // Iniciante só aparece para quem ainda não assina (ou já está nele): é plano de entrada.
76
+ const isFree = !activeSubscription || isFreeSubscription(activeSubscription);
77
+ const visiblePlans =
78
+ isFree || activeSubscription?.id_plan === STARTER_PLAN_ID
79
+ ? plans
80
+ : plans
81
+ .filter((plan) => plan.planId !== STARTER_PLAN_ID)
82
+ .filter((plan) => !HIDDEN_PLAN_IDS.includes(plan.planId));
83
+
84
+ return (
85
+ <>
86
+ <div className="flex items-center justify-center h-14 px-4 py-3 bg-white relative border-b border-zinc-200 shrink-0">
87
+ <DialogTitle className="paragraph-medium-semibold text-zinc-950 text-center">
88
+ {translate('title')}
89
+ </DialogTitle>
90
+ <button
91
+ type="button"
92
+ onClick={onClose}
93
+ className="absolute right-4 size-8 flex items-center justify-center rounded-lg cursor-pointer hover:bg-zinc-100 transition-colors"
94
+ >
95
+ <IconX size={18} className="text-zinc-400" />
96
+ </button>
97
+ </div>
98
+
99
+ <div className="flex flex-col gap-5 items-center pt-4 lg:pt-6 pb-4 lg:pb-6 px-4 lg:px-6 flex-1 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">
100
+ <SegmentedControl<BillingPeriod>
101
+ value={billingPeriod}
102
+ onChange={setBillingPeriod}
103
+ className="w-85.75 lg:w-auto"
104
+ optionClassName="flex-1 lg:flex-none"
105
+ options={periodOptions}
106
+ />
107
+
108
+ {isLoadingPlans ? (
109
+ <div className="flex flex-col lg:flex-row gap-4 w-full lg:items-end items-stretch lg:justify-center lg:mx-auto">
110
+ {[1, 2, 3].map((index) => (
111
+ <div
112
+ key={index}
113
+ className="shrink-0 min-w-[85%] sm:min-w-[85%] md:min-w-[calc(50%-0.5rem)] lg:flex-1 lg:shrink lg:min-w-0 lg:max-w-107.5"
114
+ >
115
+ <PlanCardSkeleton isPopular={index === 2} isDefaultWhitelabel={isDefaultWhitelabel} />
116
+ </div>
117
+ ))}
118
+ </div>
119
+ ) : (
120
+ <div className="flex flex-col lg:flex-row gap-4 w-full lg:items-end items-stretch lg:justify-center lg:mx-auto">
121
+ {visiblePlans.map((plan) => (
122
+ <div
123
+ key={plan.name}
124
+ className="shrink-0 min-w-[85%] sm:min-w-[85%] md:min-w-[calc(50%-0.5rem)] lg:flex-1 lg:shrink lg:min-w-0 lg:max-w-107.5"
125
+ >
126
+ <PlanCard
127
+ plan={plan}
128
+ billingPeriod={billingPeriod}
129
+ couponStripeData={appliedCouponStripeData}
130
+ onBeforeAction={onClose}
131
+ />
132
+ </div>
133
+ ))}
134
+ </div>
135
+ )}
136
+ </div>
137
+ </>
138
+ );
139
+ }
140
+
141
+ /** Vitrine de planos em tela cheia, por cima do modal Minha conta. */
142
+ export function PlansCatalogDialog() {
143
+ const plansCatalog = useSubscriptionFlows((state) => state.plansCatalog);
144
+ const close = useSubscriptionFlows((state) => state.closePlansCatalog);
145
+
146
+ return (
147
+ <Dialog open={!!plansCatalog} onOpenChange={(nextOpen) => !nextOpen && close()}>
148
+ <DialogContent
149
+ showCloseButton={false}
150
+ className="flex flex-col p-0 gap-0 inset-0 w-dvw h-dvh max-w-none sm:max-w-none translate-x-0 translate-y-0 border-0 rounded-none shadow-none"
151
+ >
152
+ {!!plansCatalog && <PlansCatalogContent onClose={close} />}
153
+ </DialogContent>
154
+ </Dialog>
155
+ );
156
+ }