@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 @@
1
+ {"version":3,"sources":["../../../../src/modules/coupons/hooks/use-coupon-by-code.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport type { SuccessResult } from '../../../infra/api/types';\nimport type { Coupon } from '../types/coupon.type';\n\n/** Validação de cupom digitado na troca de plano. */\nexport function useCouponByCode() {\n return useMutation<Coupon | undefined, Error, string>({\n mutationFn: async (code) => {\n const result = await apiFetch<SuccessResult<Coupon>>('/api/coupons', { params: { code } });\n return result.data;\n },\n });\n}\n"],"mappings":";AAEA,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAKlB,SAAS,kBAAkB;AAChC,SAAO,YAA+C;AAAA,IACpD,YAAY,OAAO,SAAS;AAC1B,YAAM,SAAS,MAAM,SAAgC,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACzF,aAAO,OAAO;AAAA,IAChB;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
+ import { COUPON_QUERY_KEY } from "../constants/query-keys.constants";
6
+ function useCouponById(id) {
7
+ const queryKey = useAuthQueryKey([...COUPON_QUERY_KEY, id]);
8
+ return useQuery({
9
+ queryKey,
10
+ queryFn: ({ signal }) => apiFetch(`/api/coupons/${id}`, { signal }),
11
+ enabled: id != null,
12
+ staleTime: 5 * 60 * 1e3
13
+ });
14
+ }
15
+ export {
16
+ useCouponById
17
+ };
18
+ //# sourceMappingURL=use-coupon-by-id.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/coupons/hooks/use-coupon-by-id.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport type { SuccessResult } from '../../../infra/api/types';\nimport { COUPON_QUERY_KEY } from '../constants/query-keys.constants';\nimport type { Coupon } from '../types/coupon.type';\n\n/** Cupom aplicado na assinatura, para explicar o valor cobrado. */\nexport function useCouponById(id: number | string | null | undefined) {\n const queryKey = useAuthQueryKey([...COUPON_QUERY_KEY, id]);\n\n return useQuery({\n queryKey,\n queryFn: ({ signal }) => apiFetch<SuccessResult<Coupon>>(`/api/coupons/${id}`, { signal }),\n enabled: id != null,\n staleTime: 5 * 60 * 1000,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAEhC,SAAS,wBAAwB;AAI1B,SAAS,cAAc,IAAwC;AACpE,QAAM,WAAW,gBAAgB,CAAC,GAAG,kBAAkB,EAAE,CAAC;AAE1D,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,CAAC,EAAE,OAAO,MAAM,SAAgC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,IACzF,SAAS,MAAM;AAAA,IACf,WAAW,IAAI,KAAK;AAAA,EACtB,CAAC;AACH;","names":[]}
@@ -0,0 +1,44 @@
1
+ import "server-only";
2
+ import { api } from "../../../infra/api/client";
3
+ import { ApiError } from "../../../infra/api/types";
4
+ import { buildQueryParams } from "../../../infra/utils/params";
5
+ import { getUserContext } from "../../auth/utils/get-user-context";
6
+ import { CouponSchema } from "../types/coupon.type";
7
+ async function resolveAccountId() {
8
+ try {
9
+ const { id_account } = await getUserContext();
10
+ return id_account;
11
+ } catch {
12
+ return void 0;
13
+ }
14
+ }
15
+ class CouponsService {
16
+ async getCouponById(id) {
17
+ const id_account = await resolveAccountId();
18
+ const query = buildQueryParams({ id_account });
19
+ const url = query ? `/coupons/${id}?${query}` : `/coupons/${id}`;
20
+ const response = await api.apps.get(url);
21
+ if (response.status === 0 || !response.data?.[0]) {
22
+ throw new ApiError("Cupom n\xE3o encontrado", "GET_COUPON_BY_ID_FAILED", 404);
23
+ }
24
+ return { success: true, data: CouponSchema.parse(response.data[0]) };
25
+ }
26
+ async getCouponByCode(code) {
27
+ const id_account = await resolveAccountId();
28
+ const query = buildQueryParams({ code, id_account });
29
+ const response = await api.apps.get(`/coupons?${query}`);
30
+ if (response.status === 0 || !response.data?.[0]) {
31
+ throw new ApiError("Cupom n\xE3o encontrado ou inv\xE1lido", "GET_COUPON_BY_CODE_FAILED", 404);
32
+ }
33
+ const coupon = CouponSchema.parse(response.data[0]);
34
+ if (!coupon.active) {
35
+ throw new ApiError("Cupom inativo", "COUPON_INACTIVE", 400);
36
+ }
37
+ return { success: true, data: coupon };
38
+ }
39
+ }
40
+ const couponsService = new CouponsService();
41
+ export {
42
+ couponsService
43
+ };
44
+ //# sourceMappingURL=coupons.service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/coupons/services/coupons.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api } from '../../../infra/api/client';\nimport { ApiError, type ApiPaginatedActionResult, type SuccessResult } from '../../../infra/api/types';\nimport { buildQueryParams } from '../../../infra/utils/params';\nimport { getUserContext } from '../../auth/utils/get-user-context';\nimport { CouponSchema, type Coupon } from '../types/coupon.type';\n\n/** Conta da sessão quando houver — o cupom também é consultado em fluxo sem login. */\nasync function resolveAccountId(): Promise<number | undefined> {\n try {\n const { id_account } = await getUserContext();\n return id_account;\n } catch {\n return undefined;\n }\n}\n\nclass CouponsService {\n async getCouponById(id: number | string): Promise<SuccessResult<Coupon>> {\n const id_account = await resolveAccountId();\n const query = buildQueryParams({ id_account });\n const url = query ? `/coupons/${id}?${query}` : `/coupons/${id}`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<Coupon>>(url);\n\n if (response.status === 0 || !response.data?.[0]) {\n throw new ApiError('Cupom não encontrado', 'GET_COUPON_BY_ID_FAILED', 404);\n }\n\n return { success: true, data: CouponSchema.parse(response.data[0]) };\n }\n\n async getCouponByCode(code: string): Promise<SuccessResult<Coupon>> {\n const id_account = await resolveAccountId();\n const query = buildQueryParams({ code, id_account });\n\n const response = await api.apps.get<ApiPaginatedActionResult<Coupon>>(`/coupons?${query}`);\n\n if (response.status === 0 || !response.data?.[0]) {\n throw new ApiError('Cupom não encontrado ou inválido', 'GET_COUPON_BY_CODE_FAILED', 404);\n }\n\n const coupon = CouponSchema.parse(response.data[0]);\n\n if (!coupon.active) {\n throw new ApiError('Cupom inativo', 'COUPON_INACTIVE', 400);\n }\n\n return { success: true, data: coupon };\n }\n}\n\nexport const couponsService = new CouponsService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAW;AACpB,SAAS,gBAAmE;AAC5E,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,oBAAiC;AAG1C,eAAe,mBAAgD;AAC7D,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAC5C,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAM,eAAe;AAAA,EACnB,MAAM,cAAc,IAAqD;AACvE,UAAM,aAAa,MAAM,iBAAiB;AAC1C,UAAM,QAAQ,iBAAiB,EAAE,WAAW,CAAC;AAC7C,UAAM,MAAM,QAAQ,YAAY,EAAE,IAAI,KAAK,KAAK,YAAY,EAAE;AAE9D,UAAM,WAAW,MAAM,IAAI,KAAK,IAAsC,GAAG;AAEzE,QAAI,SAAS,WAAW,KAAK,CAAC,SAAS,OAAO,CAAC,GAAG;AAChD,YAAM,IAAI,SAAS,2BAAwB,2BAA2B,GAAG;AAAA,IAC3E;AAEA,WAAO,EAAE,SAAS,MAAM,MAAM,aAAa,MAAM,SAAS,KAAK,CAAC,CAAC,EAAE;AAAA,EACrE;AAAA,EAEA,MAAM,gBAAgB,MAA8C;AAClE,UAAM,aAAa,MAAM,iBAAiB;AAC1C,UAAM,QAAQ,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,UAAM,WAAW,MAAM,IAAI,KAAK,IAAsC,YAAY,KAAK,EAAE;AAEzF,QAAI,SAAS,WAAW,KAAK,CAAC,SAAS,OAAO,CAAC,GAAG;AAChD,YAAM,IAAI,SAAS,0CAAoC,6BAA6B,GAAG;AAAA,IACzF;AAEA,UAAM,SAAS,aAAa,MAAM,SAAS,KAAK,CAAC,CAAC;AAElD,QAAI,CAAC,OAAO,QAAQ;AAClB,YAAM,IAAI,SAAS,iBAAiB,mBAAmB,GAAG;AAAA,IAC5D;AAEA,WAAO,EAAE,SAAS,MAAM,MAAM,OAAO;AAAA,EACvC;AACF;AAEO,MAAM,iBAAiB,IAAI,eAAe;","names":[]}
@@ -0,0 +1,61 @@
1
+ import z from "zod";
2
+ const CouponPeriodicitySchema = z.union([
3
+ z.literal("30"),
4
+ z.literal("180"),
5
+ z.literal("365"),
6
+ z.literal("any")
7
+ ]);
8
+ const CouponPaymentMethodSchema = z.union([
9
+ z.literal("billet"),
10
+ z.literal("pix"),
11
+ z.literal("card"),
12
+ z.literal("any")
13
+ ]);
14
+ const CouponAppliesToSchema = z.object({
15
+ id: z.string().nullish(),
16
+ id_plan: z.number().nullish(),
17
+ name: z.string().nullish()
18
+ });
19
+ const CouponStripeDataSchema = z.object({
20
+ periodicity: CouponPeriodicitySchema.optional(),
21
+ payment_method: CouponPaymentMethodSchema.optional(),
22
+ usable: z.boolean().optional(),
23
+ usable_global: z.boolean().optional(),
24
+ invalid_reason: z.string().nullable().optional(),
25
+ percent_off: z.number().nullable().optional(),
26
+ amount_off: z.number().nullable().optional(),
27
+ applies_to: z.array(CouponAppliesToSchema).nullable().optional(),
28
+ type: z.string().optional(),
29
+ /**
30
+ * Stripe: 'once' | 'repeating' | 'forever'. String tolerante de propósito — um enum estrito
31
+ * derrubaria o parse do cupom inteiro num valor novo do backend.
32
+ */
33
+ duration: z.string().nullish(),
34
+ duration_in_months: z.number().nullish()
35
+ }).passthrough();
36
+ const CouponSchema = z.object({
37
+ id: z.number(),
38
+ id_wl: z.number().optional(),
39
+ id_affiliate: z.number().nullable().optional(),
40
+ title: z.string(),
41
+ code: z.string(),
42
+ discount: z.number(),
43
+ discount_type: z.number().nullable(),
44
+ date: z.union([z.date(), z.coerce.date()]).nullable().optional(),
45
+ active: z.boolean(),
46
+ deleted: z.union([z.number(), z.boolean()]).transform((val) => val === 1 || val === true).optional().default(false),
47
+ stripe_coupon_id: z.string().nullable().optional(),
48
+ stripe_promo_id: z.string().nullable().optional(),
49
+ stripe_data: CouponStripeDataSchema.nullable().optional(),
50
+ datetime_add: z.union([z.date(), z.coerce.date()]).nullable().optional(),
51
+ datetime_alt: z.union([z.date(), z.coerce.date()]).nullable().optional(),
52
+ datetime_del: z.union([z.date(), z.coerce.date()]).nullable().optional()
53
+ });
54
+ export {
55
+ CouponAppliesToSchema,
56
+ CouponPaymentMethodSchema,
57
+ CouponPeriodicitySchema,
58
+ CouponSchema,
59
+ CouponStripeDataSchema
60
+ };
61
+ //# sourceMappingURL=coupon.type.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/coupons/types/coupon.type.ts"],"sourcesContent":["import z from 'zod';\n\nexport const CouponPeriodicitySchema = z.union([\n z.literal('30'),\n z.literal('180'),\n z.literal('365'),\n z.literal('any'),\n]);\nexport type CouponPeriodicity = z.infer<typeof CouponPeriodicitySchema>;\n\nexport const CouponPaymentMethodSchema = z.union([\n z.literal('billet'),\n z.literal('pix'),\n z.literal('card'),\n z.literal('any'),\n]);\nexport type CouponPaymentMethod = z.infer<typeof CouponPaymentMethodSchema>;\n\nexport const CouponAppliesToSchema = z.object({\n id: z.string().nullish(),\n id_plan: z.number().nullish(),\n name: z.string().nullish(),\n});\nexport type CouponAppliesTo = z.infer<typeof CouponAppliesToSchema>;\n\nexport const CouponStripeDataSchema = z\n .object({\n periodicity: CouponPeriodicitySchema.optional(),\n payment_method: CouponPaymentMethodSchema.optional(),\n usable: z.boolean().optional(),\n usable_global: z.boolean().optional(),\n invalid_reason: z.string().nullable().optional(),\n percent_off: z.number().nullable().optional(),\n amount_off: z.number().nullable().optional(),\n applies_to: z.array(CouponAppliesToSchema).nullable().optional(),\n type: z.string().optional(),\n /**\n * Stripe: 'once' | 'repeating' | 'forever'. String tolerante de propósito — um enum estrito\n * derrubaria o parse do cupom inteiro num valor novo do backend.\n */\n duration: z.string().nullish(),\n duration_in_months: z.number().nullish(),\n })\n .passthrough();\nexport type CouponStripeData = z.infer<typeof CouponStripeDataSchema>;\n\nexport const CouponSchema = z.object({\n id: z.number(),\n id_wl: z.number().optional(),\n id_affiliate: z.number().nullable().optional(),\n title: z.string(),\n code: z.string(),\n discount: z.number(),\n discount_type: z.number().nullable(),\n date: z.union([z.date(), z.coerce.date()]).nullable().optional(),\n active: z.boolean(),\n deleted: z\n .union([z.number(), z.boolean()])\n .transform((val) => val === 1 || val === true)\n .optional()\n .default(false),\n stripe_coupon_id: z.string().nullable().optional(),\n stripe_promo_id: z.string().nullable().optional(),\n stripe_data: CouponStripeDataSchema.nullable().optional(),\n datetime_add: z.union([z.date(), z.coerce.date()]).nullable().optional(),\n datetime_alt: z.union([z.date(), z.coerce.date()]).nullable().optional(),\n datetime_del: z.union([z.date(), z.coerce.date()]).nullable().optional(),\n});\n\nexport type Coupon = z.infer<typeof CouponSchema>;\n"],"mappings":"AAAA,OAAO,OAAO;AAEP,MAAM,0BAA0B,EAAE,MAAM;AAAA,EAC7C,EAAE,QAAQ,IAAI;AAAA,EACd,EAAE,QAAQ,KAAK;AAAA,EACf,EAAE,QAAQ,KAAK;AAAA,EACf,EAAE,QAAQ,KAAK;AACjB,CAAC;AAGM,MAAM,4BAA4B,EAAE,MAAM;AAAA,EAC/C,EAAE,QAAQ,QAAQ;AAAA,EAClB,EAAE,QAAQ,KAAK;AAAA,EACf,EAAE,QAAQ,MAAM;AAAA,EAChB,EAAE,QAAQ,KAAK;AACjB,CAAC;AAGM,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,IAAI,EAAE,OAAO,EAAE,QAAQ;AAAA,EACvB,SAAS,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,MAAM,EAAE,OAAO,EAAE,QAAQ;AAC3B,CAAC;AAGM,MAAM,yBAAyB,EACnC,OAAO;AAAA,EACN,aAAa,wBAAwB,SAAS;AAAA,EAC9C,gBAAgB,0BAA0B,SAAS;AAAA,EACnD,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,EACpC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,YAAY,EAAE,MAAM,qBAAqB,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/D,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1B,UAAU,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,oBAAoB,EAAE,OAAO,EAAE,QAAQ;AACzC,CAAC,EACA,YAAY;AAGR,MAAM,eAAe,EAAE,OAAO;AAAA,EACnC,IAAI,EAAE,OAAO;AAAA,EACb,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,OAAO;AAAA,EACnB,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/D,QAAQ,EAAE,QAAQ;AAAA,EAClB,SAAS,EACN,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAC/B,UAAU,CAAC,QAAQ,QAAQ,KAAK,QAAQ,IAAI,EAC5C,SAAS,EACT,QAAQ,KAAK;AAAA,EAChB,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,aAAa,uBAAuB,SAAS,EAAE,SAAS;AAAA,EACxD,cAAc,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EACvE,cAAc,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EACvE,cAAc,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AACzE,CAAC;","names":[]}
@@ -0,0 +1,60 @@
1
+ function couponAllowedBillingPeriod(periodicity) {
2
+ if (!periodicity || periodicity === "any") return null;
3
+ if (periodicity === "30") return "monthly";
4
+ if (periodicity === "180") return "semiannual";
5
+ if (periodicity === "365") return "annual";
6
+ return null;
7
+ }
8
+ function couponDisabledBillingPeriods(periodicity) {
9
+ const allowed = couponAllowedBillingPeriod(periodicity);
10
+ if (allowed === null) return [];
11
+ const all = ["monthly", "semiannual", "annual"];
12
+ return all.filter((p) => p !== allowed);
13
+ }
14
+ function couponAllowedPaymentMethod(paymentMethod) {
15
+ if (!paymentMethod || paymentMethod === "any") return null;
16
+ if (paymentMethod === "billet") return "boleto";
17
+ if (paymentMethod === "card") return "card";
18
+ if (paymentMethod === "pix") return "pix";
19
+ return null;
20
+ }
21
+ function couponDisabledPaymentMethods(paymentMethod) {
22
+ const allowed = couponAllowedPaymentMethod(paymentMethod);
23
+ if (allowed === null) return [];
24
+ const all = ["card", "boleto", "pix"];
25
+ return all.filter((p) => p !== allowed);
26
+ }
27
+ function couponUnlocksAllPaymentMethods(stripeData) {
28
+ if (!stripeData) return false;
29
+ if (stripeData.type !== "offer") return false;
30
+ const pm = stripeData.payment_method;
31
+ return !pm || pm === "any";
32
+ }
33
+ function getCouponRestrictions(stripeData) {
34
+ const isOffer = stripeData?.type === "offer";
35
+ return {
36
+ allowedBillingPeriod: couponAllowedBillingPeriod(stripeData?.periodicity),
37
+ disabledBillingPeriods: couponDisabledBillingPeriods(stripeData?.periodicity),
38
+ allowedPaymentMethod: isOffer ? couponAllowedPaymentMethod(stripeData?.payment_method) : null,
39
+ disabledPaymentMethods: isOffer ? couponDisabledPaymentMethods(stripeData?.payment_method) : [],
40
+ unlocksAllPaymentMethods: couponUnlocksAllPaymentMethods(stripeData)
41
+ };
42
+ }
43
+ function isCouponApplicableToPlan(stripeData, idPlan) {
44
+ const appliesTo = stripeData?.applies_to;
45
+ if (!appliesTo || appliesTo.length === 0) return true;
46
+ const planEntries = appliesTo.filter((a) => a.id_plan != null);
47
+ if (planEntries.length === 0) return true;
48
+ if (idPlan == null) return true;
49
+ return planEntries.some((a) => a.id_plan === idPlan);
50
+ }
51
+ export {
52
+ couponAllowedBillingPeriod,
53
+ couponAllowedPaymentMethod,
54
+ couponDisabledBillingPeriods,
55
+ couponDisabledPaymentMethods,
56
+ couponUnlocksAllPaymentMethods,
57
+ getCouponRestrictions,
58
+ isCouponApplicableToPlan
59
+ };
60
+ //# sourceMappingURL=coupon-restrictions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/coupons/utils/coupon-restrictions.ts"],"sourcesContent":["import type { BillingPeriod } from '../../subscriptions/types/billing-period.type';\nimport type {\n CouponPaymentMethod,\n CouponPeriodicity,\n CouponStripeData,\n} from '../types/coupon.type';\n\nexport type CouponPaymentMethodUi = 'card' | 'boleto' | 'pix';\n\n/**\n * Maps the coupon's periodicity constraint to the BillingPeriod allowed.\n * Returns null when there's no restriction (`any` or undefined).\n */\nexport function couponAllowedBillingPeriod(\n periodicity: CouponPeriodicity | undefined,\n): BillingPeriod | null {\n if (!periodicity || periodicity === 'any') return null;\n if (periodicity === '30') return 'monthly';\n if (periodicity === '180') return 'semiannual';\n if (periodicity === '365') return 'annual';\n return null;\n}\n\n/**\n * Returns the list of BillingPeriods that are BLOCKED by the coupon.\n * Returns [] when there's no restriction.\n */\nexport function couponDisabledBillingPeriods(\n periodicity: CouponPeriodicity | undefined,\n): BillingPeriod[] {\n const allowed = couponAllowedBillingPeriod(periodicity);\n if (allowed === null) return [];\n const all: BillingPeriod[] = ['monthly', 'semiannual', 'annual'];\n return all.filter((p) => p !== allowed);\n}\n\n/**\n * Maps the coupon's payment_method constraint to the payment method UI allowed.\n * Returns null when there's no restriction (`any` or undefined).\n */\nexport function couponAllowedPaymentMethod(\n paymentMethod: CouponPaymentMethod | undefined,\n): CouponPaymentMethodUi | null {\n if (!paymentMethod || paymentMethod === 'any') return null;\n if (paymentMethod === 'billet') return 'boleto';\n if (paymentMethod === 'card') return 'card';\n if (paymentMethod === 'pix') return 'pix';\n return null;\n}\n\n/**\n * Returns the list of payment methods that are BLOCKED by the coupon.\n */\nexport function couponDisabledPaymentMethods(\n paymentMethod: CouponPaymentMethod | undefined,\n): CouponPaymentMethodUi[] {\n const allowed = couponAllowedPaymentMethod(paymentMethod);\n if (allowed === null) return [];\n const all: CouponPaymentMethodUi[] = ['card', 'boleto', 'pix'];\n return all.filter((p) => p !== allowed);\n}\n\n/**\n * Ofertas com payment_method \"any\" liberam todos os métodos de pagamento\n * (incluindo boleto em mensal/semestral) — regra de negócio do time comercial.\n */\nexport function couponUnlocksAllPaymentMethods(\n stripeData: CouponStripeData | null | undefined,\n): boolean {\n if (!stripeData) return false;\n if (stripeData.type !== 'offer') return false;\n const pm = stripeData.payment_method;\n return !pm || pm === 'any';\n}\n\n/**\n * Convenience: extracts both restrictions from a stripe_data object.\n *\n * Restrições de método de pagamento (allowed/disabled) só valem para offers.\n * Outros tipos de cupom (discount, etc.) são ignorados para método —\n * o user pode pagar com cartão/boleto/pix livremente. Restrições de\n * periodicidade continuam valendo para todos os tipos.\n */\nexport function getCouponRestrictions(stripeData: CouponStripeData | null | undefined) {\n const isOffer = stripeData?.type === 'offer';\n return {\n allowedBillingPeriod: couponAllowedBillingPeriod(stripeData?.periodicity),\n disabledBillingPeriods: couponDisabledBillingPeriods(stripeData?.periodicity),\n allowedPaymentMethod: isOffer ? couponAllowedPaymentMethod(stripeData?.payment_method) : null,\n disabledPaymentMethods: isOffer ? couponDisabledPaymentMethods(stripeData?.payment_method) : [],\n unlocksAllPaymentMethods: couponUnlocksAllPaymentMethods(stripeData),\n };\n}\n\n/**\n * Checks if the coupon applies to a given plan.\n * Returns true when:\n * - applies_to is empty/undefined (no restriction)\n * - OR applies_to contains only addon entries (id_plan null) — sem restrição de plano\n * - OR the plan is in the list\n */\nexport function isCouponApplicableToPlan(\n stripeData: CouponStripeData | null | undefined,\n idPlan: number | null | undefined,\n): boolean {\n const appliesTo = stripeData?.applies_to;\n if (!appliesTo || appliesTo.length === 0) return true;\n const planEntries = appliesTo.filter((a) => a.id_plan != null);\n if (planEntries.length === 0) return true;\n if (idPlan == null) return true;\n return planEntries.some((a) => a.id_plan === idPlan);\n}\n"],"mappings":"AAaO,SAAS,2BACd,aACsB;AACtB,MAAI,CAAC,eAAe,gBAAgB,MAAO,QAAO;AAClD,MAAI,gBAAgB,KAAM,QAAO;AACjC,MAAI,gBAAgB,MAAO,QAAO;AAClC,MAAI,gBAAgB,MAAO,QAAO;AAClC,SAAO;AACT;AAMO,SAAS,6BACd,aACiB;AACjB,QAAM,UAAU,2BAA2B,WAAW;AACtD,MAAI,YAAY,KAAM,QAAO,CAAC;AAC9B,QAAM,MAAuB,CAAC,WAAW,cAAc,QAAQ;AAC/D,SAAO,IAAI,OAAO,CAAC,MAAM,MAAM,OAAO;AACxC;AAMO,SAAS,2BACd,eAC8B;AAC9B,MAAI,CAAC,iBAAiB,kBAAkB,MAAO,QAAO;AACtD,MAAI,kBAAkB,SAAU,QAAO;AACvC,MAAI,kBAAkB,OAAQ,QAAO;AACrC,MAAI,kBAAkB,MAAO,QAAO;AACpC,SAAO;AACT;AAKO,SAAS,6BACd,eACyB;AACzB,QAAM,UAAU,2BAA2B,aAAa;AACxD,MAAI,YAAY,KAAM,QAAO,CAAC;AAC9B,QAAM,MAA+B,CAAC,QAAQ,UAAU,KAAK;AAC7D,SAAO,IAAI,OAAO,CAAC,MAAM,MAAM,OAAO;AACxC;AAMO,SAAS,+BACd,YACS;AACT,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,WAAW,SAAS,QAAS,QAAO;AACxC,QAAM,KAAK,WAAW;AACtB,SAAO,CAAC,MAAM,OAAO;AACvB;AAUO,SAAS,sBAAsB,YAAiD;AACrF,QAAM,UAAU,YAAY,SAAS;AACrC,SAAO;AAAA,IACL,sBAAsB,2BAA2B,YAAY,WAAW;AAAA,IACxE,wBAAwB,6BAA6B,YAAY,WAAW;AAAA,IAC5E,sBAAsB,UAAU,2BAA2B,YAAY,cAAc,IAAI;AAAA,IACzF,wBAAwB,UAAU,6BAA6B,YAAY,cAAc,IAAI,CAAC;AAAA,IAC9F,0BAA0B,+BAA+B,UAAU;AAAA,EACrE;AACF;AASO,SAAS,yBACd,YACA,QACS;AACT,QAAM,YAAY,YAAY;AAC9B,MAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,QAAM,cAAc,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI;AAC7D,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,YAAY,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM;AACrD;","names":[]}
@@ -0,0 +1,12 @@
1
+ import "server-only";
2
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
+ import { domainsService } from "../services/domains.service";
4
+ function createCountDomainsHandler() {
5
+ return async function GET() {
6
+ return safeRouteHandler(() => domainsService.countPaid());
7
+ };
8
+ }
9
+ export {
10
+ createCountDomainsHandler
11
+ };
12
+ //# sourceMappingURL=count-domains.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/domains/handlers/count-domains.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { domainsService } from '../services/domains.service';\n\nexport function createCountDomainsHandler() {\n return async function GET() {\n return safeRouteHandler(() => domainsService.countPaid());\n };\n}\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAExB,SAAS,4BAA4B;AAC1C,SAAO,eAAe,MAAM;AAC1B,WAAO,iBAAiB,MAAM,eAAe,UAAU,CAAC;AAAA,EAC1D;AACF;","names":[]}
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
+ function useCountDomains(options = {}) {
6
+ const queryKey = useAuthQueryKey(["domains", "count"]);
7
+ return useQuery({
8
+ queryKey,
9
+ queryFn: ({ signal }) => apiFetch("/api/domains/count", { signal }),
10
+ staleTime: 6e4,
11
+ enabled: options.enabled ?? true
12
+ });
13
+ }
14
+ export {
15
+ useCountDomains
16
+ };
17
+ //# sourceMappingURL=count-domains.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/domains/hooks/count-domains.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\n/** Domínios pagos já registrados na conta. */\nexport function useCountDomains(options: { enabled?: boolean } = {}) {\n const queryKey = useAuthQueryKey(['domains', 'count']);\n\n return useQuery({\n queryKey,\n queryFn: ({ signal }) => apiFetch<number>('/api/domains/count', { signal }),\n staleTime: 60_000,\n enabled: options.enabled ?? true,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAGzB,SAAS,gBAAgB,UAAiC,CAAC,GAAG;AACnE,QAAM,WAAW,gBAAgB,CAAC,WAAW,OAAO,CAAC;AAErD,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,CAAC,EAAE,OAAO,MAAM,SAAiB,sBAAsB,EAAE,OAAO,CAAC;AAAA,IAC1E,WAAW;AAAA,IACX,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;","names":[]}
@@ -0,0 +1,18 @@
1
+ import "server-only";
2
+ import { api } from "../../../infra/api/client";
3
+ import { getUserContext } from "../../auth/utils/get-user-context";
4
+ class DomainsService {
5
+ /** Quantos domínios pagos a conta já usa — o piso de slots na troca de plano. */
6
+ async countPaid() {
7
+ const { id_account } = await getUserContext();
8
+ const response = await api.pages.get(
9
+ `/account/${id_account}/domains`
10
+ );
11
+ return response.total_paid ?? 0;
12
+ }
13
+ }
14
+ const domainsService = new DomainsService();
15
+ export {
16
+ domainsService
17
+ };
18
+ //# sourceMappingURL=domains.service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/domains/services/domains.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api } from '../../../infra/api/client';\nimport { getUserContext } from '../../auth/utils/get-user-context';\n\nclass DomainsService {\n /** Quantos domínios pagos a conta já usa — o piso de slots na troca de plano. */\n async countPaid(): Promise<number> {\n const { id_account } = await getUserContext();\n const response = await api.pages.get<{ status: 0 | 1; total_paid: number }>(\n `/account/${id_account}/domains`\n );\n\n return response.total_paid ?? 0;\n }\n}\n\nexport const domainsService = new DomainsService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAW;AACpB,SAAS,sBAAsB;AAE/B,MAAM,eAAe;AAAA;AAAA,EAEnB,MAAM,YAA6B;AACjC,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAC5C,UAAM,WAAW,MAAM,IAAI,MAAM;AAAA,MAC/B,YAAY,UAAU;AAAA,IACxB;AAEA,WAAO,SAAS,cAAc;AAAA,EAChC;AACF;AAEO,MAAM,iBAAiB,IAAI,eAAe;","names":[]}
@@ -0,0 +1,15 @@
1
+ import "server-only";
2
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
+ import { iaCreditsService } from "../services/ia-credits.service";
4
+ function createListIaCreditOperationsHandler() {
5
+ return async function GET(_req, { params }) {
6
+ return safeRouteHandler(async () => {
7
+ const { id } = await params;
8
+ return iaCreditsService.listOperations(id);
9
+ });
10
+ };
11
+ }
12
+ export {
13
+ createListIaCreditOperationsHandler
14
+ };
15
+ //# sourceMappingURL=list-ia-credit-operations.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/ia-credits/handlers/list-ia-credit-operations.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { iaCreditsService } from '../services/ia-credits.service';\n\nexport function createListIaCreditOperationsHandler() {\n return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return iaCreditsService.listOperations(id);\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAE1B,SAAS,sCAAsC;AACpD,SAAO,eAAe,IAAI,MAAmB,EAAE,OAAO,GAAwC;AAC5F,WAAO,iBAAiB,YAAY;AAClC,YAAM,EAAE,GAAG,IAAI,MAAM;AACrB,aAAO,iBAAiB,eAAe,EAAE;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
+ import { useCurrentSubscription } from "../../subscriptions/hooks/use-current-subscription.hook";
6
+ function useIaCreditOperations() {
7
+ const { data: subscriptionData, isPending: isSubscriptionLoading } = useCurrentSubscription();
8
+ const subscriptionId = subscriptionData?.data?.[0]?.id;
9
+ const queryKey = useAuthQueryKey(["ia-credits", "operations", subscriptionId]);
10
+ const query = useQuery({
11
+ queryKey,
12
+ queryFn: ({ signal }) => apiFetch(
13
+ `/api/subscriptions/${subscriptionId}/ia-credits/operations`,
14
+ { signal }
15
+ ),
16
+ enabled: subscriptionId != null
17
+ });
18
+ return {
19
+ operations: query.data?.data ?? [],
20
+ isLoading: isSubscriptionLoading || query.isPending,
21
+ isError: query.isError,
22
+ error: query.error
23
+ };
24
+ }
25
+ export {
26
+ useIaCreditOperations
27
+ };
28
+ //# sourceMappingURL=ia-credit-operations.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/ia-credits/hooks/ia-credit-operations.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport type { PaginatedSuccessResult } from '../../../infra/api/types';\nimport { useCurrentSubscription } from '../../subscriptions/hooks/use-current-subscription.hook';\nimport type { IaCreditOperation } from '../types';\n\n/** Extrato bruto das operações de crédito de IA da assinatura corrente (relatório de uso). */\nexport function useIaCreditOperations() {\n const { data: subscriptionData, isPending: isSubscriptionLoading } = useCurrentSubscription();\n const subscriptionId = subscriptionData?.data?.[0]?.id;\n\n const queryKey = useAuthQueryKey(['ia-credits', 'operations', subscriptionId]);\n\n const query = useQuery({\n queryKey,\n queryFn: ({ signal }) =>\n apiFetch<PaginatedSuccessResult<IaCreditOperation>>(\n `/api/subscriptions/${subscriptionId}/ia-credits/operations`,\n { signal }\n ),\n enabled: subscriptionId != null,\n });\n\n return {\n operations: query.data?.data ?? [],\n isLoading: isSubscriptionLoading || query.isPending,\n isError: query.isError,\n error: query.error,\n };\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAEhC,SAAS,8BAA8B;AAIhC,SAAS,wBAAwB;AACtC,QAAM,EAAE,MAAM,kBAAkB,WAAW,sBAAsB,IAAI,uBAAuB;AAC5F,QAAM,iBAAiB,kBAAkB,OAAO,CAAC,GAAG;AAEpD,QAAM,WAAW,gBAAgB,CAAC,cAAc,cAAc,cAAc,CAAC;AAE7E,QAAM,QAAQ,SAAS;AAAA,IACrB;AAAA,IACA,SAAS,CAAC,EAAE,OAAO,MACjB;AAAA,MACE,sBAAsB,cAAc;AAAA,MACpC,EAAE,OAAO;AAAA,IACX;AAAA,IACF,SAAS,kBAAkB;AAAA,EAC7B,CAAC;AAED,SAAO;AAAA,IACL,YAAY,MAAM,MAAM,QAAQ,CAAC;AAAA,IACjC,WAAW,yBAAyB,MAAM;AAAA,IAC1C,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,EACf;AACF;","names":[]}
@@ -1,10 +1,13 @@
1
1
  import "server-only";
2
2
  import { api } from "../../../infra/api/client";
3
- import { ApiError } from "../../../infra/api/types";
3
+ import {
4
+ ApiError
5
+ } from "../../../infra/api/types";
4
6
  import { getUserContext } from "../../auth/utils/get-user-context";
5
7
  import { subscriptionsService } from "../../subscriptions/services/subscriptions.service";
6
8
  import {
7
- IaCreditAddBatchSchema
9
+ IaCreditAddBatchSchema,
10
+ IaCreditOperationSchema
8
11
  } from "../types";
9
12
  import { AI_CREDITS_FIRST_PURCHASE_OFFER } from "../constants/ai-credits-offer.constants";
10
13
  class IaCreditsService {
@@ -16,6 +19,24 @@ class IaCreditsService {
16
19
  ]);
17
20
  return { success: true, data: { availableCredits, addBatches } };
18
21
  }
22
+ /**
23
+ * Extrato bruto (add/subtract) das operações de crédito da assinatura, usado pelo relatório de
24
+ * uso. O summary agrega; aqui vão as operações uma a uma.
25
+ */
26
+ async listOperations(subscriptionId) {
27
+ const { id_account } = await getUserContext();
28
+ const endpoint = `/accounts/${id_account}/subscriptions/${subscriptionId}/items/balance/list?page=1&limit=100&sort=id:DESC`;
29
+ const response = await api.apps.get(endpoint);
30
+ if (response.status === 0) {
31
+ throw new ApiError(
32
+ response.message || "Erro ao listar cr\xE9ditos de IA",
33
+ "LIST_IA_CREDITS_OPERATIONS_FAILED",
34
+ 400
35
+ );
36
+ }
37
+ const data = (response.data ?? []).map((item) => IaCreditOperationSchema.parse(item));
38
+ return { success: true, data, total: response.total ?? data.length };
39
+ }
19
40
  // Saldo atual = balance_after_operation da última operação do extrato
20
41
  // (sort id:DESC, limit=1). Já é o saldo do usuário, não precisa recalcular.
21
42
  async fetchCurrentBalance(idAccount, subscriptionId) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/ia-credits/services/ia-credits.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api } from '../../../infra/api/client';\nimport { ApiError, ApiPaginatedActionResult, SuccessResult } from '../../../infra/api/types';\nimport { getUserContext } from '../../auth/utils/get-user-context';\nimport { subscriptionsService } from '../../subscriptions/services/subscriptions.service';\nimport {\n IaCreditAddBatch,\n IaCreditAddBatchSchema,\n IaCreditOperation,\n IaCreditsSummaryData,\n} from '../types';\nimport { AI_CREDITS_FIRST_PURCHASE_OFFER } from '../constants/ai-credits-offer.constants';\nimport type {\n AiCreditsOfferEligibility,\n PurchaseIaCreditsInput,\n PurchaseIaCreditsResult,\n} from '../types/ai-credits-offer.type';\n\n/** Shape da API pra elegibilidade — `price_cents`/`anchor_cents` viram camelCase ao sair do service. */\ninterface AiCreditsOfferEligibilityApiItem {\n eligible: boolean;\n reason: AiCreditsOfferEligibility['reason'];\n credits: number;\n price_cents: number | null;\n anchor_cents: number | null;\n}\n\nclass IaCreditsService {\n async getSummaryData(\n subscriptionId: number | string\n ): Promise<SuccessResult<IaCreditsSummaryData>> {\n const { id_account } = await getUserContext();\n\n const [availableCredits, addBatches] = await Promise.all([\n this.fetchCurrentBalance(id_account, subscriptionId),\n this.fetchAddBatches(id_account, subscriptionId),\n ]);\n\n return { success: true, data: { availableCredits, addBatches } };\n }\n\n // Saldo atual = balance_after_operation da última operação do extrato\n // (sort id:DESC, limit=1). Já é o saldo do usuário, não precisa recalcular.\n private async fetchCurrentBalance(\n idAccount: number | string,\n subscriptionId: number | string\n ): Promise<number> {\n const endpoint = `/accounts/${idAccount}/subscriptions/${subscriptionId}/items/balance/list?page=1&limit=1&sort=id:DESC`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<IaCreditOperation>>(endpoint);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao consultar saldo de créditos de IA',\n 'GET_IA_CREDITS_BALANCE_FAILED',\n 400\n );\n }\n\n const balance = (response.data ?? [])[0]?.balance_after_operation;\n return balance == null ? 0 : Number(balance);\n }\n\n // Lotes de adição com added/consumed/remaining já agregados pelo backend.\n // sort id:DESC garante que os lotes mais recentes (não expirados) entram\n // primeiro no limite; lotes expirados são filtrados no hook.\n private async fetchAddBatches(\n idAccount: number | string,\n subscriptionId: number | string\n ): Promise<IaCreditAddBatch[]> {\n const endpoint = `/accounts/${idAccount}/subscriptions/${subscriptionId}/items/balance/list/add?page=1&limit=100&sort=id:DESC`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<IaCreditAddBatch>>(endpoint);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao listar lotes de créditos de IA',\n 'LIST_IA_CREDITS_ADDS_FAILED',\n 400\n );\n }\n\n const raw = response.data ?? [];\n return raw.map((item) => IaCreditAddBatchSchema.parse(item));\n }\n\n /**\n * Elegibilidade da oferta de primeira compra, pra assinatura ATIVA da conta — resolvida aqui (e\n * não recebida por parâmetro) porque o consumidor (`createGetAiCreditsOfferEligibilityHandler`)\n * não tem id de assinatura: a rota é `/api/ai-credits-offer/eligibility`, sem `:id`.\n *\n * Sem assinatura ativa a resposta já sai inelegível — nem vale bater no backend, que exige\n * `id_subscription` na URL.\n */\n async offerEligibility(): Promise<AiCreditsOfferEligibility> {\n const { id_account } = await getUserContext();\n const { data: subscriptions } = await subscriptionsService.listSubscriptions({ limit: 1 });\n const subscription = subscriptions[0];\n\n if (!subscription) {\n return {\n eligible: false,\n reason: 'no_active_subscription',\n credits: AI_CREDITS_FIRST_PURCHASE_OFFER.credits,\n priceCents: null,\n anchorCents: null,\n };\n }\n\n const endpoint = `/accounts/${id_account}/subscriptions/${subscription.id}/items/balance/purchase-offer/${AI_CREDITS_FIRST_PURCHASE_OFFER.slug}`;\n const response = await api.apps.get<ApiPaginatedActionResult<AiCreditsOfferEligibilityApiItem>>(\n endpoint\n );\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao consultar elegibilidade da oferta de créditos de IA',\n 'GET_OFFER_ELIGIBILITY_FAILED',\n 400\n );\n }\n\n const raw = response.data[0];\n if (!raw) {\n throw new ApiError(\n 'Resposta vazia ao consultar elegibilidade da oferta de créditos de IA',\n 'GET_OFFER_ELIGIBILITY_EMPTY',\n 502\n );\n }\n\n return {\n eligible: raw.eligible,\n reason: raw.reason,\n credits: raw.credits,\n priceCents: raw.price_cents,\n anchorCents: raw.anchor_cents,\n };\n }\n\n /**\n * Compra de créditos de IA — avulsa comum (`offer` ausente) OU a oferta de primeira compra\n * (`offer: AI_CREDITS_FIRST_PURCHASE_OFFER.slug`). Devolve o envelope CRU do gapps-r3-api\n * (`status` 1/2/0), sem reembrulhar em `SuccessResult`: quem consome é sempre o hook de compra,\n * que já sabe interpretar esses três status (ver `usePurchaseIaCredits`).\n */\n async purchase(\n subscriptionId: number | string,\n input: PurchaseIaCreditsInput\n ): Promise<PurchaseIaCreditsResult> {\n const { id_account } = await getUserContext();\n\n return api.apps.post<PurchaseIaCreditsResult>(\n `/accounts/${id_account}/subscriptions/${subscriptionId}/items/balance/purchase`,\n {\n ...(input.offer ? { offer: input.offer } : { quantity: input.quantity }),\n payment_method: input.paymentMethod,\n ...(input.idCard ? { id_card: input.idCard } : {}),\n }\n );\n }\n}\n\nexport const iaCreditsService = new IaCreditsService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAW;AACpB,SAAS,gBAAyD;AAClE,SAAS,sBAAsB;AAC/B,SAAS,4BAA4B;AACrC;AAAA,EAEE;AAAA,OAGK;AACP,SAAS,uCAAuC;AAgBhD,MAAM,iBAAiB;AAAA,EACrB,MAAM,eACJ,gBAC8C;AAC9C,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAE5C,UAAM,CAAC,kBAAkB,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvD,KAAK,oBAAoB,YAAY,cAAc;AAAA,MACnD,KAAK,gBAAgB,YAAY,cAAc;AAAA,IACjD,CAAC;AAED,WAAO,EAAE,SAAS,MAAM,MAAM,EAAE,kBAAkB,WAAW,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA,EAIA,MAAc,oBACZ,WACA,gBACiB;AACjB,UAAM,WAAW,aAAa,SAAS,kBAAkB,cAAc;AAEvE,UAAM,WAAW,MAAM,IAAI,KAAK,IAAiD,QAAQ;AAEzF,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,QAAQ,CAAC,GAAG,CAAC,GAAG;AAC1C,WAAO,WAAW,OAAO,IAAI,OAAO,OAAO;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,WACA,gBAC6B;AAC7B,UAAM,WAAW,aAAa,SAAS,kBAAkB,cAAc;AAEvE,UAAM,WAAW,MAAM,IAAI,KAAK,IAAgD,QAAQ;AAExF,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,SAAS,QAAQ,CAAC;AAC9B,WAAO,IAAI,IAAI,CAAC,SAAS,uBAAuB,MAAM,IAAI,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBAAuD;AAC3D,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAC5C,UAAM,EAAE,MAAM,cAAc,IAAI,MAAM,qBAAqB,kBAAkB,EAAE,OAAO,EAAE,CAAC;AACzF,UAAM,eAAe,cAAc,CAAC;AAEpC,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,gCAAgC;AAAA,QACzC,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,UAAU,kBAAkB,aAAa,EAAE,iCAAiC,gCAAgC,IAAI;AAC9I,UAAM,WAAW,MAAM,IAAI,KAAK;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,SAAS,KAAK,CAAC;AAC3B,QAAI,CAAC,KAAK;AACR,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU,IAAI;AAAA,MACd,QAAQ,IAAI;AAAA,MACZ,SAAS,IAAI;AAAA,MACb,YAAY,IAAI;AAAA,MAChB,aAAa,IAAI;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SACJ,gBACA,OACkC;AAClC,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAE5C,WAAO,IAAI,KAAK;AAAA,MACd,aAAa,UAAU,kBAAkB,cAAc;AAAA,MACvD;AAAA,QACE,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,QACtE,gBAAgB,MAAM;AAAA,QACtB,GAAI,MAAM,SAAS,EAAE,SAAS,MAAM,OAAO,IAAI,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,mBAAmB,IAAI,iBAAiB;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/ia-credits/services/ia-credits.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api } from '../../../infra/api/client';\nimport {\n ApiError,\n ApiPaginatedActionResult,\n PaginatedSuccessResult,\n SuccessResult,\n} from '../../../infra/api/types';\nimport { getUserContext } from '../../auth/utils/get-user-context';\nimport { subscriptionsService } from '../../subscriptions/services/subscriptions.service';\nimport {\n IaCreditAddBatch,\n IaCreditAddBatchSchema,\n IaCreditOperation,\n IaCreditOperationSchema,\n IaCreditsSummaryData,\n} from '../types';\nimport { AI_CREDITS_FIRST_PURCHASE_OFFER } from '../constants/ai-credits-offer.constants';\nimport type {\n AiCreditsOfferEligibility,\n PurchaseIaCreditsInput,\n PurchaseIaCreditsResult,\n} from '../types/ai-credits-offer.type';\n\n/** Shape da API pra elegibilidade — `price_cents`/`anchor_cents` viram camelCase ao sair do service. */\ninterface AiCreditsOfferEligibilityApiItem {\n eligible: boolean;\n reason: AiCreditsOfferEligibility['reason'];\n credits: number;\n price_cents: number | null;\n anchor_cents: number | null;\n}\n\nclass IaCreditsService {\n async getSummaryData(\n subscriptionId: number | string\n ): Promise<SuccessResult<IaCreditsSummaryData>> {\n const { id_account } = await getUserContext();\n\n const [availableCredits, addBatches] = await Promise.all([\n this.fetchCurrentBalance(id_account, subscriptionId),\n this.fetchAddBatches(id_account, subscriptionId),\n ]);\n\n return { success: true, data: { availableCredits, addBatches } };\n }\n\n /**\n * Extrato bruto (add/subtract) das operações de crédito da assinatura, usado pelo relatório de\n * uso. O summary agrega; aqui vão as operações uma a uma.\n */\n async listOperations(\n subscriptionId: string | number\n ): Promise<PaginatedSuccessResult<IaCreditOperation>> {\n const { id_account } = await getUserContext();\n const endpoint = `/accounts/${id_account}/subscriptions/${subscriptionId}/items/balance/list?page=1&limit=100&sort=id:DESC`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<IaCreditOperation>>(endpoint);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao listar créditos de IA',\n 'LIST_IA_CREDITS_OPERATIONS_FAILED',\n 400\n );\n }\n\n const data = (response.data ?? []).map((item) => IaCreditOperationSchema.parse(item));\n\n return { success: true, data, total: response.total ?? data.length };\n }\n\n // Saldo atual = balance_after_operation da última operação do extrato\n // (sort id:DESC, limit=1). Já é o saldo do usuário, não precisa recalcular.\n private async fetchCurrentBalance(\n idAccount: number | string,\n subscriptionId: number | string\n ): Promise<number> {\n const endpoint = `/accounts/${idAccount}/subscriptions/${subscriptionId}/items/balance/list?page=1&limit=1&sort=id:DESC`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<IaCreditOperation>>(endpoint);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao consultar saldo de créditos de IA',\n 'GET_IA_CREDITS_BALANCE_FAILED',\n 400\n );\n }\n\n const balance = (response.data ?? [])[0]?.balance_after_operation;\n return balance == null ? 0 : Number(balance);\n }\n\n // Lotes de adição com added/consumed/remaining já agregados pelo backend.\n // sort id:DESC garante que os lotes mais recentes (não expirados) entram\n // primeiro no limite; lotes expirados são filtrados no hook.\n private async fetchAddBatches(\n idAccount: number | string,\n subscriptionId: number | string\n ): Promise<IaCreditAddBatch[]> {\n const endpoint = `/accounts/${idAccount}/subscriptions/${subscriptionId}/items/balance/list/add?page=1&limit=100&sort=id:DESC`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<IaCreditAddBatch>>(endpoint);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao listar lotes de créditos de IA',\n 'LIST_IA_CREDITS_ADDS_FAILED',\n 400\n );\n }\n\n const raw = response.data ?? [];\n return raw.map((item) => IaCreditAddBatchSchema.parse(item));\n }\n\n /**\n * Elegibilidade da oferta de primeira compra, pra assinatura ATIVA da conta — resolvida aqui (e\n * não recebida por parâmetro) porque o consumidor (`createGetAiCreditsOfferEligibilityHandler`)\n * não tem id de assinatura: a rota é `/api/ai-credits-offer/eligibility`, sem `:id`.\n *\n * Sem assinatura ativa a resposta já sai inelegível — nem vale bater no backend, que exige\n * `id_subscription` na URL.\n */\n async offerEligibility(): Promise<AiCreditsOfferEligibility> {\n const { id_account } = await getUserContext();\n const { data: subscriptions } = await subscriptionsService.listSubscriptions({ limit: 1 });\n const subscription = subscriptions[0];\n\n if (!subscription) {\n return {\n eligible: false,\n reason: 'no_active_subscription',\n credits: AI_CREDITS_FIRST_PURCHASE_OFFER.credits,\n priceCents: null,\n anchorCents: null,\n };\n }\n\n const endpoint = `/accounts/${id_account}/subscriptions/${subscription.id}/items/balance/purchase-offer/${AI_CREDITS_FIRST_PURCHASE_OFFER.slug}`;\n const response = await api.apps.get<ApiPaginatedActionResult<AiCreditsOfferEligibilityApiItem>>(\n endpoint\n );\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao consultar elegibilidade da oferta de créditos de IA',\n 'GET_OFFER_ELIGIBILITY_FAILED',\n 400\n );\n }\n\n const raw = response.data[0];\n if (!raw) {\n throw new ApiError(\n 'Resposta vazia ao consultar elegibilidade da oferta de créditos de IA',\n 'GET_OFFER_ELIGIBILITY_EMPTY',\n 502\n );\n }\n\n return {\n eligible: raw.eligible,\n reason: raw.reason,\n credits: raw.credits,\n priceCents: raw.price_cents,\n anchorCents: raw.anchor_cents,\n };\n }\n\n /**\n * Compra de créditos de IA — avulsa comum (`offer` ausente) OU a oferta de primeira compra\n * (`offer: AI_CREDITS_FIRST_PURCHASE_OFFER.slug`). Devolve o envelope CRU do gapps-r3-api\n * (`status` 1/2/0), sem reembrulhar em `SuccessResult`: quem consome é sempre o hook de compra,\n * que já sabe interpretar esses três status (ver `usePurchaseIaCredits`).\n */\n async purchase(\n subscriptionId: number | string,\n input: PurchaseIaCreditsInput\n ): Promise<PurchaseIaCreditsResult> {\n const { id_account } = await getUserContext();\n\n return api.apps.post<PurchaseIaCreditsResult>(\n `/accounts/${id_account}/subscriptions/${subscriptionId}/items/balance/purchase`,\n {\n ...(input.offer ? { offer: input.offer } : { quantity: input.quantity }),\n payment_method: input.paymentMethod,\n ...(input.idCard ? { id_card: input.idCard } : {}),\n }\n );\n }\n}\n\nexport const iaCreditsService = new IaCreditsService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAW;AACpB;AAAA,EACE;AAAA,OAIK;AACP,SAAS,sBAAsB;AAC/B,SAAS,4BAA4B;AACrC;AAAA,EAEE;AAAA,EAEA;AAAA,OAEK;AACP,SAAS,uCAAuC;AAgBhD,MAAM,iBAAiB;AAAA,EACrB,MAAM,eACJ,gBAC8C;AAC9C,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAE5C,UAAM,CAAC,kBAAkB,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvD,KAAK,oBAAoB,YAAY,cAAc;AAAA,MACnD,KAAK,gBAAgB,YAAY,cAAc;AAAA,IACjD,CAAC;AAED,WAAO,EAAE,SAAS,MAAM,MAAM,EAAE,kBAAkB,WAAW,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eACJ,gBACoD;AACpD,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAC5C,UAAM,WAAW,aAAa,UAAU,kBAAkB,cAAc;AAExE,UAAM,WAAW,MAAM,IAAI,KAAK,IAAiD,QAAQ;AAEzF,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,wBAAwB,MAAM,IAAI,CAAC;AAEpF,WAAO,EAAE,SAAS,MAAM,MAAM,OAAO,SAAS,SAAS,KAAK,OAAO;AAAA,EACrE;AAAA;AAAA;AAAA,EAIA,MAAc,oBACZ,WACA,gBACiB;AACjB,UAAM,WAAW,aAAa,SAAS,kBAAkB,cAAc;AAEvE,UAAM,WAAW,MAAM,IAAI,KAAK,IAAiD,QAAQ;AAEzF,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,QAAQ,CAAC,GAAG,CAAC,GAAG;AAC1C,WAAO,WAAW,OAAO,IAAI,OAAO,OAAO;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,WACA,gBAC6B;AAC7B,UAAM,WAAW,aAAa,SAAS,kBAAkB,cAAc;AAEvE,UAAM,WAAW,MAAM,IAAI,KAAK,IAAgD,QAAQ;AAExF,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,SAAS,QAAQ,CAAC;AAC9B,WAAO,IAAI,IAAI,CAAC,SAAS,uBAAuB,MAAM,IAAI,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBAAuD;AAC3D,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAC5C,UAAM,EAAE,MAAM,cAAc,IAAI,MAAM,qBAAqB,kBAAkB,EAAE,OAAO,EAAE,CAAC;AACzF,UAAM,eAAe,cAAc,CAAC;AAEpC,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,gCAAgC;AAAA,QACzC,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,UAAU,kBAAkB,aAAa,EAAE,iCAAiC,gCAAgC,IAAI;AAC9I,UAAM,WAAW,MAAM,IAAI,KAAK;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,SAAS,KAAK,CAAC;AAC3B,QAAI,CAAC,KAAK;AACR,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU,IAAI;AAAA,MACd,QAAQ,IAAI;AAAA,MACZ,SAAS,IAAI;AAAA,MACb,YAAY,IAAI;AAAA,MAChB,aAAa,IAAI;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SACJ,gBACA,OACkC;AAClC,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAE5C,WAAO,IAAI,KAAK;AAAA,MACd,aAAa,UAAU,kBAAkB,cAAc;AAAA,MACvD;AAAA,QACE,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,QACtE,gBAAgB,MAAM;AAAA,QACtB,GAAI,MAAM,SAAS,EAAE,SAAS,MAAM,OAAO,IAAI,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,mBAAmB,IAAI,iBAAiB;","names":[]}
@@ -2,9 +2,11 @@ import "server-only";
2
2
  import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
3
  import { pagesService } from "../services/pages.service";
4
4
  function createCountPagesHandler() {
5
- return async function GET() {
5
+ return async function GET(request) {
6
6
  return safeRouteHandler(async () => ({
7
- total: await pagesService.countPages()
7
+ total: await pagesService.countPages({
8
+ published: request.nextUrl.searchParams.get("published") === "true"
9
+ })
8
10
  }));
9
11
  };
10
12
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/pages/handlers/count-pages.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { pagesService } from '../services/pages.service';\n\nexport function createCountPagesHandler() {\n return async function GET() {\n return safeRouteHandler(async () => ({\n total: await pagesService.countPages(),\n }));\n };\n}\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAEtB,SAAS,0BAA0B;AACxC,SAAO,eAAe,MAAM;AAC1B,WAAO,iBAAiB,aAAa;AAAA,MACnC,OAAO,MAAM,aAAa,WAAW;AAAA,IACvC,EAAE;AAAA,EACJ;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/pages/handlers/count-pages.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { pagesService } from '../services/pages.service';\n\nexport function createCountPagesHandler() {\n return async function GET(request: NextRequest) {\n return safeRouteHandler(async () => ({\n total: await pagesService.countPages({\n published: request.nextUrl.searchParams.get('published') === 'true',\n }),\n }));\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAEtB,SAAS,0BAA0B;AACxC,SAAO,eAAe,IAAI,SAAsB;AAC9C,WAAO,iBAAiB,aAAa;AAAA,MACnC,OAAO,MAAM,aAAa,WAAW;AAAA,QACnC,WAAW,QAAQ,QAAQ,aAAa,IAAI,WAAW,MAAM;AAAA,MAC/D,CAAC;AAAA,IACH,EAAE;AAAA,EACJ;AACF;","names":[]}
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
+ import { PAGES_QUERY_KEY } from "../constants/query-keys.constants";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ const COUNT_PUBLISHED_PAGES_QUERY_KEY = [...PAGES_QUERY_KEY, "count", "published"];
7
+ function useCountPublishedPages(options = {}) {
8
+ const queryKey = useAuthQueryKey([...COUNT_PUBLISHED_PAGES_QUERY_KEY]);
9
+ return useQuery({
10
+ queryKey,
11
+ queryFn: async ({ signal }) => {
12
+ const result = await apiFetch("/api/pages/count", {
13
+ params: { published: true },
14
+ signal
15
+ });
16
+ return result.total;
17
+ },
18
+ staleTime: 3e4,
19
+ enabled: options.enabled ?? true
20
+ });
21
+ }
22
+ export {
23
+ COUNT_PUBLISHED_PAGES_QUERY_KEY,
24
+ useCountPublishedPages
25
+ };
26
+ //# sourceMappingURL=count-published-pages.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/pages/hooks/count-published-pages.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport { PAGES_QUERY_KEY } from '../constants/query-keys.constants';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const COUNT_PUBLISHED_PAGES_QUERY_KEY = [...PAGES_QUERY_KEY, 'count', 'published'] as const;\n\n/** Páginas no ar: é o que o plano limita e o que o downgrade cobra. */\nexport function useCountPublishedPages(options: { enabled?: boolean } = {}) {\n const queryKey = useAuthQueryKey([...COUNT_PUBLISHED_PAGES_QUERY_KEY]);\n\n return useQuery({\n queryKey,\n queryFn: async ({ signal }) => {\n const result = await apiFetch<{ total: number }>('/api/pages/count', {\n params: { published: true },\n signal,\n });\n return result.total;\n },\n staleTime: 30_000,\n enabled: options.enabled ?? true,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAEzB,MAAM,kCAAkC,CAAC,GAAG,iBAAiB,SAAS,WAAW;AAGjF,SAAS,uBAAuB,UAAiC,CAAC,GAAG;AAC1E,QAAM,WAAW,gBAAgB,CAAC,GAAG,+BAA+B,CAAC;AAErE,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,SAAS,MAAM,SAA4B,oBAAoB;AAAA,QACnE,QAAQ,EAAE,WAAW,KAAK;AAAA,QAC1B;AAAA,MACF,CAAC;AACD,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,WAAW;AAAA,IACX,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;","names":[]}
@@ -3,9 +3,10 @@ import { api } from "../../../infra/api/client";
3
3
  import { ApiError } from "../../../infra/api/types";
4
4
  import { getUserContext } from "../../auth/utils/get-user-context";
5
5
  class PagesService {
6
- async countPages() {
6
+ /** `published` conta só as páginas no ar — é o limite que o downgrade de plano cobra. */
7
+ async countPages({ published } = {}) {
7
8
  const { id_account } = await getUserContext();
8
- const url = `/account/${id_account}/pages?limit=1`;
9
+ const url = `/account/${id_account}/pages?limit=1${published ? "&published=true" : ""}`;
9
10
  const response = await api.pages.get(url);
10
11
  if (response.status === 0) {
11
12
  throw new ApiError(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/pages/services/pages.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api } from '../../../infra/api/client';\nimport { ApiError, ApiPaginatedActionResult } from '../../../infra/api/types';\nimport { getUserContext } from '../../auth/utils/get-user-context';\n\nclass PagesService {\n async countPages(): Promise<number> {\n const { id_account } = await getUserContext();\n\n const url = `/account/${id_account}/pages?limit=1`;\n\n const response = await api.pages.get<ApiPaginatedActionResult<unknown>>(url);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao contar páginas',\n 'COUNT_PAGES_FAILED',\n 400,\n );\n }\n\n return response.total;\n }\n}\n\nexport const pagesService = new PagesService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAW;AACpB,SAAS,gBAA0C;AACnD,SAAS,sBAAsB;AAE/B,MAAM,aAAa;AAAA,EACjB,MAAM,aAA8B;AAClC,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAE5C,UAAM,MAAM,YAAY,UAAU;AAElC,UAAM,WAAW,MAAM,IAAI,MAAM,IAAuC,GAAG;AAE3E,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,SAAS;AAAA,EAClB;AACF;AAEO,MAAM,eAAe,IAAI,aAAa;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/pages/services/pages.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api } from '../../../infra/api/client';\nimport { ApiError, ApiPaginatedActionResult } from '../../../infra/api/types';\nimport { getUserContext } from '../../auth/utils/get-user-context';\n\nclass PagesService {\n /** `published` conta só as páginas no ar — é o limite que o downgrade de plano cobra. */\n async countPages({ published }: { published?: boolean } = {}): Promise<number> {\n const { id_account } = await getUserContext();\n\n const url = `/account/${id_account}/pages?limit=1${published ? '&published=true' : ''}`;\n\n const response = await api.pages.get<ApiPaginatedActionResult<unknown>>(url);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao contar páginas',\n 'COUNT_PAGES_FAILED',\n 400,\n );\n }\n\n return response.total;\n }\n}\n\nexport const pagesService = new PagesService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAW;AACpB,SAAS,gBAA0C;AACnD,SAAS,sBAAsB;AAE/B,MAAM,aAAa;AAAA;AAAA,EAEjB,MAAM,WAAW,EAAE,UAAU,IAA6B,CAAC,GAAoB;AAC7E,UAAM,EAAE,WAAW,IAAI,MAAM,eAAe;AAE5C,UAAM,MAAM,YAAY,UAAU,iBAAiB,YAAY,oBAAoB,EAAE;AAErF,UAAM,WAAW,MAAM,IAAI,MAAM,IAAuC,GAAG;AAE3E,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,SAAS;AAAA,EAClB;AACF;AAEO,MAAM,eAAe,IAAI,aAAa;","names":[]}
@@ -0,0 +1,14 @@
1
+ function getPlanTooltips(translate) {
2
+ return {
3
+ domains: translate("common.plans.tooltips.domains"),
4
+ users: translate("common.plans.tooltips.users"),
5
+ sharePages: translate("common.plans.tooltips.sharePages"),
6
+ projectManagement: translate("common.plans.tooltips.projectManagement")
7
+ };
8
+ }
9
+ const HIDDEN_PLAN_IDS = [411];
10
+ export {
11
+ HIDDEN_PLAN_IDS,
12
+ getPlanTooltips
13
+ };
14
+ //# sourceMappingURL=plan-tooltips.constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/plans/constants/plan-tooltips.constants.ts"],"sourcesContent":["import type { PlanTooltips } from '../types/plan.type';\n\ntype TranslateFn = (key: any, values?: Record<string, string | number>) => string;\n\n/** Tooltips dos recursos do card de plano — textos do catálogo, não do plano da conta. */\nexport function getPlanTooltips(translate: TranslateFn): PlanTooltips {\n return {\n domains: translate('common.plans.tooltips.domains'),\n users: translate('common.plans.tooltips.users'),\n sharePages: translate('common.plans.tooltips.sharePages'),\n projectManagement: translate('common.plans.tooltips.projectManagement'),\n };\n}\n\n/** Planos fora da vitrine (legado/contratos especiais). */\nexport const HIDDEN_PLAN_IDS = [411];\n"],"mappings":"AAKO,SAAS,gBAAgB,WAAsC;AACpE,SAAO;AAAA,IACL,SAAS,UAAU,+BAA+B;AAAA,IAClD,OAAO,UAAU,6BAA6B;AAAA,IAC9C,YAAY,UAAU,kCAAkC;AAAA,IACxD,mBAAmB,UAAU,yCAAyC;AAAA,EACxE;AACF;AAGO,MAAM,kBAAkB,CAAC,GAAG;","names":[]}
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { useUiPlans } from "./use-ui-plans.hook";
4
+ import { useCurrentSubscription } from "../../subscriptions/hooks/use-current-subscription.hook";
5
+ import { periodicityToBillingPeriod } from "../../subscriptions/utils/periodicity";
6
+ function useEnrichedPlans() {
7
+ const plansQuery = useUiPlans();
8
+ const { data: subscriptionData } = useCurrentSubscription();
9
+ const activeSubscription = subscriptionData?.data?.[0] ?? null;
10
+ const data = useMemo(() => {
11
+ const plans = plansQuery.data ?? [];
12
+ if (!activeSubscription) return plans;
13
+ const currentPeriodicity = periodicityToBillingPeriod(activeSubscription.periodicity);
14
+ return plans.map((plan) => {
15
+ const isCurrentPlan = !!activeSubscription.active && plan.planId === activeSubscription.id_plan;
16
+ return {
17
+ ...plan,
18
+ isCurrentPlan,
19
+ currentPeriodicity: isCurrentPlan ? currentPeriodicity : void 0
20
+ };
21
+ });
22
+ }, [plansQuery.data, activeSubscription]);
23
+ return { ...plansQuery, data, subscriptionId: activeSubscription?.id ?? null };
24
+ }
25
+ export {
26
+ useEnrichedPlans
27
+ };
28
+ //# sourceMappingURL=use-enriched-plans.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/plans/hooks/use-enriched-plans.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { useUiPlans } from './use-ui-plans.hook';\nimport { useCurrentSubscription } from '../../subscriptions/hooks/use-current-subscription.hook';\nimport { periodicityToBillingPeriod } from '../../subscriptions/utils/periodicity';\n\n/** Catálogo marcando qual plano é o corrente (e em qual periodicidade), para a vitrine. */\nexport function useEnrichedPlans() {\n const plansQuery = useUiPlans();\n const { data: subscriptionData } = useCurrentSubscription();\n const activeSubscription = subscriptionData?.data?.[0] ?? null;\n\n const data = useMemo(() => {\n const plans = plansQuery.data ?? [];\n if (!activeSubscription) return plans;\n\n const currentPeriodicity = periodicityToBillingPeriod(activeSubscription.periodicity);\n\n return plans.map((plan) => {\n const isCurrentPlan = !!activeSubscription.active && plan.planId === activeSubscription.id_plan;\n return {\n ...plan,\n isCurrentPlan,\n currentPeriodicity: isCurrentPlan ? currentPeriodicity : undefined,\n };\n });\n }, [plansQuery.data, activeSubscription]);\n\n return { ...plansQuery, data, subscriptionId: activeSubscription?.id ?? null };\n}\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,8BAA8B;AACvC,SAAS,kCAAkC;AAGpC,SAAS,mBAAmB;AACjC,QAAM,aAAa,WAAW;AAC9B,QAAM,EAAE,MAAM,iBAAiB,IAAI,uBAAuB;AAC1D,QAAM,qBAAqB,kBAAkB,OAAO,CAAC,KAAK;AAE1D,QAAM,OAAO,QAAQ,MAAM;AACzB,UAAM,QAAQ,WAAW,QAAQ,CAAC;AAClC,QAAI,CAAC,mBAAoB,QAAO;AAEhC,UAAM,qBAAqB,2BAA2B,mBAAmB,WAAW;AAEpF,WAAO,MAAM,IAAI,CAAC,SAAS;AACzB,YAAM,gBAAgB,CAAC,CAAC,mBAAmB,UAAU,KAAK,WAAW,mBAAmB;AACxF,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,oBAAoB,gBAAgB,qBAAqB;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,MAAM,kBAAkB,CAAC;AAExC,SAAO,EAAE,GAAG,YAAY,MAAM,gBAAgB,oBAAoB,MAAM,KAAK;AAC/E;","names":[]}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { useTranslations } from "next-intl";
4
+ import { usePlans } from "./list-plans.hook";
5
+ import { mapApiPlanToUiPlanForCurrency } from "../utils/map-api-plan-to-ui";
6
+ import { useCurrencyFormatter } from "../../accounts/hooks/use-currency-formatter.hook";
7
+ function useUiPlans() {
8
+ const plansQuery = usePlans();
9
+ const { currency } = useCurrencyFormatter();
10
+ const translate = useTranslations();
11
+ const data = useMemo(() => {
12
+ const plans = plansQuery.data ?? [];
13
+ return plans.map(mapApiPlanToUiPlanForCurrency(currency, translate));
14
+ }, [plansQuery.data, currency, translate]);
15
+ return { ...plansQuery, data };
16
+ }
17
+ export {
18
+ useUiPlans
19
+ };
20
+ //# sourceMappingURL=use-ui-plans.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/plans/hooks/use-ui-plans.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { useTranslations } from 'next-intl';\nimport { usePlans } from './list-plans.hook';\nimport { mapApiPlanToUiPlanForCurrency } from '../utils/map-api-plan-to-ui';\nimport { useCurrencyFormatter } from '../../accounts/hooks/use-currency-formatter.hook';\nimport type { UiPlan } from '../types/plan.type';\n\n/** Catálogo do /plans já traduzido e com preços na moeda da conta (stripe_usd → USD). */\nexport function useUiPlans() {\n const plansQuery = usePlans();\n const { currency } = useCurrencyFormatter();\n const translate = useTranslations();\n\n const data = useMemo<UiPlan[]>(() => {\n const plans = plansQuery.data ?? [];\n return plans.map(mapApiPlanToUiPlanForCurrency(currency, translate));\n }, [plansQuery.data, currency, translate]);\n\n return { ...plansQuery, data };\n}\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,SAAS,qCAAqC;AAC9C,SAAS,4BAA4B;AAI9B,SAAS,aAAa;AAC3B,QAAM,aAAa,SAAS;AAC5B,QAAM,EAAE,SAAS,IAAI,qBAAqB;AAC1C,QAAM,YAAY,gBAAgB;AAElC,QAAM,OAAO,QAAkB,MAAM;AACnC,UAAM,QAAQ,WAAW,QAAQ,CAAC;AAClC,WAAO,MAAM,IAAI,8BAA8B,UAAU,SAAS,CAAC;AAAA,EACrE,GAAG,CAAC,WAAW,MAAM,UAAU,SAAS,CAAC;AAEzC,SAAO,EAAE,GAAG,YAAY,KAAK;AAC/B;","names":[]}