@greatapps/common 1.1.700 → 1.1.701

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 (561) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  18. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  20. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  21. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  22. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  24. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  25. package/dist/components/layouts/NavBar.mjs.map +1 -1
  26. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  27. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  28. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  29. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  30. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  31. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  32. package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
  33. package/dist/components/modals/HexaPromoModal.mjs +2 -2
  34. package/dist/components/modals/HexaPromoModal.mjs.map +1 -1
  35. package/dist/components/modals/HexaPromoModalGate.mjs.map +1 -1
  36. package/dist/components/modals/Modals.mjs.map +1 -1
  37. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  38. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  39. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  40. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  41. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  42. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  43. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  44. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  45. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  46. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  47. package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
  48. package/dist/components/navigation/TrialBanner.mjs.map +1 -1
  49. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  50. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  51. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  52. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  53. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  54. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  55. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  56. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  57. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  60. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  61. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  62. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  63. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  64. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  65. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  66. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  67. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  68. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  69. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  70. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  71. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  72. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  73. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  74. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  75. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  76. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  77. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  78. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  79. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  80. package/dist/components/ui/form/FormField.mjs.map +1 -1
  81. package/dist/components/ui/form/Input.mjs.map +1 -1
  82. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  83. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  84. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  85. package/dist/components/ui/form/Select.mjs +1 -1
  86. package/dist/components/ui/form/Select.mjs.map +1 -1
  87. package/dist/components/ui/form/Switch.mjs.map +1 -1
  88. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  89. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  90. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  91. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  92. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  93. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  94. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  95. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  96. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  97. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  98. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  99. package/dist/handlers.mjs.map +1 -1
  100. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  101. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  102. package/dist/hooks/useBrandLoadingIcon.mjs.map +1 -1
  103. package/dist/hooks/useRouter.mjs.map +1 -1
  104. package/dist/http.mjs.map +1 -1
  105. package/dist/i18n/config.mjs.map +1 -1
  106. package/dist/i18n/country-language.mjs.map +1 -1
  107. package/dist/i18n/messages/en-us.mjs.map +1 -1
  108. package/dist/i18n/messages/es-es.mjs.map +1 -1
  109. package/dist/i18n/messages/index.mjs.map +1 -1
  110. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  111. package/dist/i18n/normalize.mjs.map +1 -1
  112. package/dist/i18n/resolve-locale.mjs.map +1 -1
  113. package/dist/i18n.mjs.map +1 -1
  114. package/dist/index.mjs.map +1 -1
  115. package/dist/infra/http/api-fetch.mjs.map +1 -1
  116. package/dist/infra/route/parse-id.mjs.map +1 -1
  117. package/dist/infra/route/parse-numeric.mjs.map +1 -1
  118. package/dist/infra/route/safe-route-handler.mjs.map +1 -1
  119. package/dist/infra/route/search-params.mjs.map +1 -1
  120. package/dist/infra/utils/array.mjs.map +1 -1
  121. package/dist/infra/utils/date.mjs.map +1 -1
  122. package/dist/middleware.mjs.map +1 -1
  123. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  124. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  125. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  126. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  127. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  128. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  129. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  130. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -1
  131. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  132. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  133. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  134. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  135. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  136. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  137. package/dist/modules/auth/actions/social-google-login.action.mjs.map +1 -1
  138. package/dist/modules/auth/actions/social-google-onboarding.action.mjs.map +1 -1
  139. package/dist/modules/auth/actions/unlink-google.action.mjs.map +1 -1
  140. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  141. package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
  142. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  143. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  144. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  145. package/dist/modules/auth/hooks/social-google-login.hook.mjs.map +1 -1
  146. package/dist/modules/auth/hooks/social-google-onboarding.hook.mjs.map +1 -1
  147. package/dist/modules/auth/hooks/unlink-google.hook.mjs.map +1 -1
  148. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  149. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  150. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  151. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  152. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  153. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  154. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  155. package/dist/modules/auth/utils/require-token-not-expired.mjs.map +1 -1
  156. package/dist/modules/auth/utils/require-valid-session.mjs.map +1 -1
  157. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  158. package/dist/modules/cards/actions/create-setup-intent.action.mjs.map +1 -1
  159. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  160. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  161. package/dist/modules/cards/handlers/find-card-by-id.handler.mjs.map +1 -1
  162. package/dist/modules/cards/handlers/list-cards.handler.mjs.map +1 -1
  163. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  164. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  165. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  166. package/dist/modules/cards/hooks/create-setup-intent.hook.mjs.map +1 -1
  167. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  168. package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -1
  169. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  170. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  171. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  172. package/dist/modules/cards/types.mjs.map +1 -1
  173. package/dist/modules/charges/actions/charge-action.action.mjs.map +1 -1
  174. package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs.map +1 -1
  175. package/dist/modules/charges/handlers/list-charges.handler.mjs.map +1 -1
  176. package/dist/modules/charges/hooks/charge-action.hook.mjs.map +1 -1
  177. package/dist/modules/charges/hooks/charge-by-id.hook.mjs.map +1 -1
  178. package/dist/modules/charges/hooks/charges.hook.mjs.map +1 -1
  179. package/dist/modules/charges/services/charges.service.mjs.map +1 -1
  180. package/dist/modules/charges/types/charge.type.mjs.map +1 -1
  181. package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs.map +1 -1
  182. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  183. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  184. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  185. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  186. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  187. package/dist/modules/images/utils/base64.mjs.map +1 -1
  188. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  189. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  190. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  191. package/dist/modules/pages/constants/query-keys.constants.mjs.map +1 -1
  192. package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -1
  193. package/dist/modules/pages/hooks/count-pages.hook.mjs.map +1 -1
  194. package/dist/modules/pages/services/pages.service.mjs.map +1 -1
  195. package/dist/modules/plans/handlers/find-plan-by-id.handler.mjs.map +1 -1
  196. package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -1
  197. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  198. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  199. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  200. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  201. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  202. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  203. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  204. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  205. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  206. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  207. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  208. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  209. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  210. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  211. package/dist/modules/projects/handlers/find-project.handler.mjs.map +1 -1
  212. package/dist/modules/projects/handlers/list-all-account-users.handler.mjs.map +1 -1
  213. package/dist/modules/projects/handlers/list-available-users.handler.mjs.map +1 -1
  214. package/dist/modules/projects/handlers/list-project-users.handler.mjs.map +1 -1
  215. package/dist/modules/projects/handlers/list-projects.handler.mjs.map +1 -1
  216. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  217. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  218. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  219. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  220. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  221. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  222. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  223. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  224. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  225. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  226. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  227. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  228. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  229. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  230. package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -1
  231. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  232. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  233. package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
  234. package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs.map +1 -1
  235. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  236. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  237. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  238. package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -1
  239. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  240. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  241. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  242. package/dist/modules/subscriptions/types/pix-pending.type.mjs.map +1 -1
  243. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  244. package/dist/modules/subscriptions/utils/get-subscription-cancellation-state.mjs.map +1 -1
  245. package/dist/modules/subscriptions/utils/get-subscription-expiry-date.mjs.map +1 -1
  246. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  247. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  248. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  249. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  250. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  251. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  252. package/dist/modules/users/handlers/list-messages.handler.mjs.map +1 -1
  253. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  254. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  255. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  256. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  257. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  258. package/dist/providers/auth.provider.mjs.map +1 -1
  259. package/dist/providers/navigation.provider.mjs.map +1 -1
  260. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  261. package/dist/route.mjs.map +1 -1
  262. package/dist/store/useAccountModals.mjs.map +1 -1
  263. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  264. package/dist/store/useCreditsDisabledModal.mjs.map +1 -1
  265. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  266. package/dist/store/useHexaPromoModal.mjs.map +1 -1
  267. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  268. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  269. package/dist/utils/constants/br-states.mjs.map +1 -1
  270. package/dist/utils/cookies/hexa-promo.mjs.map +1 -1
  271. package/dist/utils/countries.mjs.map +1 -1
  272. package/dist/utils/format/currency.mjs.map +1 -1
  273. package/dist/utils/intl/cookie-domain.mjs.map +1 -1
  274. package/dist/utils/intl/locale-cookie.mjs.map +1 -1
  275. package/dist/utils/next-navigation.mjs.map +1 -1
  276. package/dist/utils/redirect.mjs.map +1 -1
  277. package/dist/utils/safeMutationAction.mjs.map +1 -1
  278. package/dist/utils/safeServerAction.mjs.map +1 -1
  279. package/dist/utils/withAction.mjs.map +1 -1
  280. package/package.json +115 -115
  281. package/src/components/account/ConfigurationsMyAccountModal.tsx +179 -179
  282. package/src/components/account/ConfirmDeleteAccountModal.tsx +110 -110
  283. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +68 -68
  284. package/src/components/account/DeleteAccountModal.tsx +160 -160
  285. package/src/components/account/DisableTwoFactorAuthModal.tsx +92 -92
  286. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +51 -51
  287. package/src/components/account/TwoFactorAuthModal.tsx +220 -220
  288. package/src/components/account/hooks/useChangePhoneForm.tsx +113 -113
  289. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +116 -116
  290. package/src/components/account/sections/ChangeEmailModal.tsx +239 -239
  291. package/src/components/account/sections/ChangePasswordSection.tsx +68 -68
  292. package/src/components/account/sections/ChangePhoneModal.tsx +273 -273
  293. package/src/components/account/sections/MyProfileSection.tsx +276 -276
  294. package/src/components/account/sections/PreferencesSection.tsx +278 -278
  295. package/src/components/account/sections/SecuritySection.tsx +102 -102
  296. package/src/components/account/sections/TokenSection.tsx +85 -85
  297. package/src/components/embeds/ClarityEmbed.tsx +70 -70
  298. package/src/components/embeds/CrispEmbed.tsx +195 -195
  299. package/src/components/embeds/EmbedWidgets.tsx +62 -62
  300. package/src/components/embeds/FrillEmbed.tsx +146 -146
  301. package/src/components/layouts/AppMobileNavBar.tsx +214 -214
  302. package/src/components/layouts/AppNavBar.tsx +40 -40
  303. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  304. package/src/components/layouts/NavBar.tsx +228 -228
  305. package/src/components/layouts/NotificationsPopover.tsx +120 -120
  306. package/src/components/layouts/ProfilePopover.tsx +191 -191
  307. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  308. package/src/components/layouts/UsersSelectorPopover.tsx +236 -236
  309. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  310. package/src/components/modals/BuyCreditsModal.tsx +390 -390
  311. package/src/components/modals/CreditsDisabledModal.tsx +62 -62
  312. package/src/components/modals/HexaPromoModal.tsx +212 -212
  313. package/src/components/modals/HexaPromoModalGate.tsx +80 -80
  314. package/src/components/modals/Modals.tsx +25 -25
  315. package/src/components/modals/PaidPlanRequiredModal.tsx +60 -60
  316. package/src/components/modals/cards/AddCardModal.tsx +420 -420
  317. package/src/components/modals/cards/CannotDeleteCardModal.tsx +124 -124
  318. package/src/components/modals/cards/CardFormFields.tsx +363 -363
  319. package/src/components/modals/cards/DeleteCardModal.tsx +136 -136
  320. package/src/components/navigation/CancelledSubscriptionBanner.tsx +62 -62
  321. package/src/components/navigation/NavItemsContext.ts +20 -20
  322. package/src/components/navigation/OverdueInvoiceBanner.tsx +51 -51
  323. package/src/components/navigation/PendingCancellationBanner.tsx +60 -60
  324. package/src/components/navigation/ProjectSelectorPopover.tsx +180 -180
  325. package/src/components/navigation/SubscriptionBanner.tsx +94 -94
  326. package/src/components/navigation/TrialBanner.tsx +54 -54
  327. package/src/components/navigation/UpcomingInvoiceBanner.tsx +55 -55
  328. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  329. package/src/components/navigation/subcomponents/BottomLinks.tsx +85 -85
  330. package/src/components/navigation/subcomponents/ProjectSelector.tsx +184 -184
  331. package/src/components/pages/NotFoundPage.tsx +75 -75
  332. package/src/components/pages/notifications/Notifications.tsx +190 -190
  333. package/src/components/ui/buttons/Button.tsx +77 -77
  334. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  335. package/src/components/ui/buttons/CopyButton.tsx +59 -59
  336. package/src/components/ui/data-display/Accordion.tsx +81 -81
  337. package/src/components/ui/data-display/Badge.tsx +47 -47
  338. package/src/components/ui/data-display/Card.tsx +93 -93
  339. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  340. package/src/components/ui/data-display/CardItem.tsx +135 -135
  341. package/src/components/ui/data-display/Pagination.tsx +126 -126
  342. package/src/components/ui/data-display/PaymentInfoCard.tsx +193 -193
  343. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  344. package/src/components/ui/data-display/Separator.tsx +29 -29
  345. package/src/components/ui/data-display/Table.tsx +117 -117
  346. package/src/components/ui/data-display/Tabs.tsx +67 -67
  347. package/src/components/ui/feedback/CircularProgress.tsx +79 -79
  348. package/src/components/ui/feedback/DefaultCircularProgress.tsx +67 -67
  349. package/src/components/ui/feedback/LoadingOverlay.tsx +30 -30
  350. package/src/components/ui/feedback/Progress.tsx +40 -40
  351. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  352. package/src/components/ui/feedback/Toast.tsx +104 -104
  353. package/src/components/ui/form/Calendar.tsx +228 -228
  354. package/src/components/ui/form/Checkbox.tsx +31 -31
  355. package/src/components/ui/form/ComboboxField.tsx +159 -159
  356. package/src/components/ui/form/DatePicker.tsx +100 -100
  357. package/src/components/ui/form/DateRangePicker.tsx +111 -111
  358. package/src/components/ui/form/FormField.tsx +133 -133
  359. package/src/components/ui/form/Input.tsx +20 -20
  360. package/src/components/ui/form/InputOtp.tsx +80 -80
  361. package/src/components/ui/form/PhoneInput.tsx +210 -210
  362. package/src/components/ui/form/RadioGroup.tsx +45 -45
  363. package/src/components/ui/form/Select.tsx +200 -200
  364. package/src/components/ui/form/Switch.tsx +32 -32
  365. package/src/components/ui/form/Textarea.tsx +19 -19
  366. package/src/components/ui/overlay/Command.tsx +185 -185
  367. package/src/components/ui/overlay/Dialog.tsx +153 -153
  368. package/src/components/ui/overlay/Popover.tsx +49 -49
  369. package/src/components/ui/overlay/Sheet.tsx +170 -170
  370. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  371. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +392 -392
  372. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +62 -62
  373. package/src/components/widgets/ImageUpload/ImageUpload.tsx +131 -131
  374. package/src/components/widgets/ImageUpload/index.ts +3 -3
  375. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  376. package/src/handlers.ts +22 -22
  377. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  378. package/src/hooks/useAuthQueryKey.ts +32 -32
  379. package/src/hooks/useBrandLoadingIcon.tsx +18 -18
  380. package/src/hooks/useRouter.ts +38 -38
  381. package/src/http.ts +1 -1
  382. package/src/i18n/config.ts +17 -17
  383. package/src/i18n/country-language.ts +60 -60
  384. package/src/i18n/messages/en-us.ts +519 -519
  385. package/src/i18n/messages/es-es.ts +520 -520
  386. package/src/i18n/messages/index.ts +24 -24
  387. package/src/i18n/messages/pt-br.ts +543 -543
  388. package/src/i18n/normalize.ts +15 -15
  389. package/src/i18n/resolve-locale.ts +77 -77
  390. package/src/i18n.ts +10 -10
  391. package/src/index.ts +587 -587
  392. package/src/infra/http/api-fetch.ts +39 -39
  393. package/src/infra/route/parse-id.ts +9 -9
  394. package/src/infra/route/parse-numeric.ts +16 -16
  395. package/src/infra/route/safe-route-handler.ts +16 -16
  396. package/src/infra/route/search-params.ts +9 -9
  397. package/src/infra/utils/array.ts +167 -167
  398. package/src/infra/utils/date.ts +59 -59
  399. package/src/middleware.ts +4 -4
  400. package/src/modules/accounts/actions/account-management.action.ts +109 -109
  401. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  402. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  403. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  404. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  405. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  406. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  407. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -32
  408. package/src/modules/accounts/hooks/useAccountManagement.ts +95 -95
  409. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  410. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  411. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  412. package/src/modules/accounts/services/account-token.service.ts +52 -52
  413. package/src/modules/accounts/services/account.service.ts +243 -243
  414. package/src/modules/accounts/types.ts +230 -230
  415. package/src/modules/auth/actions/social-google-login.action.ts +12 -12
  416. package/src/modules/auth/actions/social-google-onboarding.action.ts +13 -13
  417. package/src/modules/auth/actions/unlink-google.action.ts +8 -8
  418. package/src/modules/auth/actions/validate-session.action.ts +70 -70
  419. package/src/modules/auth/actions/verify-two-factor.action.ts +19 -19
  420. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  421. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  422. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  423. package/src/modules/auth/hooks/social-google-login.hook.tsx +13 -13
  424. package/src/modules/auth/hooks/social-google-onboarding.hook.tsx +13 -13
  425. package/src/modules/auth/hooks/unlink-google.hook.tsx +13 -13
  426. package/src/modules/auth/hooks/useManagementPermissions.ts +52 -52
  427. package/src/modules/auth/hooks/useUserQuery.ts +103 -103
  428. package/src/modules/auth/types/management-permission.type.ts +14 -14
  429. package/src/modules/auth/utils/assert-management-permission.ts +56 -56
  430. package/src/modules/auth/utils/assert-management-subscription.ts +38 -38
  431. package/src/modules/auth/utils/assert-paid-subscription.ts +47 -47
  432. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  433. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  434. package/src/modules/auth/utils/require-token-not-expired.ts +53 -53
  435. package/src/modules/auth/utils/require-valid-session.ts +35 -35
  436. package/src/modules/cards/actions/create-card.action.ts +9 -9
  437. package/src/modules/cards/actions/create-setup-intent.action.ts +8 -8
  438. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  439. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  440. package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -15
  441. package/src/modules/cards/handlers/list-cards.handler.ts +10 -10
  442. package/src/modules/cards/hooks/card-by-id.hook.ts +17 -17
  443. package/src/modules/cards/hooks/cards.hook.ts +22 -22
  444. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  445. package/src/modules/cards/hooks/create-setup-intent.hook.ts +11 -11
  446. package/src/modules/cards/hooks/delete-card.hook.ts +52 -52
  447. package/src/modules/cards/hooks/delete-confirmation.hook.ts +40 -40
  448. package/src/modules/cards/hooks/handle-delete-card.hook.ts +47 -47
  449. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  450. package/src/modules/cards/services/cards.service.ts +136 -136
  451. package/src/modules/cards/types.ts +52 -52
  452. package/src/modules/charges/actions/charge-action.action.ts +13 -13
  453. package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -14
  454. package/src/modules/charges/handlers/list-charges.handler.ts +15 -15
  455. package/src/modules/charges/hooks/charge-action.hook.ts +24 -24
  456. package/src/modules/charges/hooks/charge-by-id.hook.ts +19 -19
  457. package/src/modules/charges/hooks/charges.hook.ts +19 -19
  458. package/src/modules/charges/services/charges.service.ts +63 -63
  459. package/src/modules/charges/types/charge.type.ts +68 -68
  460. package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -14
  461. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +103 -103
  462. package/src/modules/images/actions/process-image.action.ts +40 -40
  463. package/src/modules/images/constants/image.constants.ts +11 -11
  464. package/src/modules/images/hooks/use-image-upload.hook.ts +153 -153
  465. package/src/modules/images/services/image-processing.service.ts +75 -75
  466. package/src/modules/images/types/image.type.ts +54 -54
  467. package/src/modules/images/utils/base64.ts +26 -26
  468. package/src/modules/images/utils/compress-image.ts +20 -20
  469. package/src/modules/images/utils/crop-image.ts +68 -68
  470. package/src/modules/images/utils/validate-image.ts +86 -86
  471. package/src/modules/pages/constants/query-keys.constants.ts +1 -1
  472. package/src/modules/pages/handlers/count-pages.handler.ts +12 -12
  473. package/src/modules/pages/hooks/count-pages.hook.ts +21 -21
  474. package/src/modules/pages/services/pages.service.ts +27 -27
  475. package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -14
  476. package/src/modules/plans/handlers/list-plans.handler.ts +22 -22
  477. package/src/modules/plans/hooks/list-plans.hook.ts +23 -23
  478. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  479. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +39 -39
  480. package/src/modules/plans/services/plans.service.ts +136 -136
  481. package/src/modules/plans/types/plan.type.ts +79 -79
  482. package/src/modules/plans/utils/map-api-plan-to-ui.ts +167 -167
  483. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  484. package/src/modules/projects/actions/create-project.action.ts +9 -9
  485. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  486. package/src/modules/projects/actions/find-project.action.ts +8 -8
  487. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  488. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  489. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  490. package/src/modules/projects/actions/update-project.action.ts +9 -9
  491. package/src/modules/projects/handlers/find-project.handler.ts +15 -15
  492. package/src/modules/projects/handlers/list-all-account-users.handler.ts +23 -23
  493. package/src/modules/projects/handlers/list-available-users.handler.ts +26 -26
  494. package/src/modules/projects/handlers/list-project-users.handler.ts +26 -26
  495. package/src/modules/projects/handlers/list-projects.handler.ts +23 -23
  496. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  497. package/src/modules/projects/hooks/create-project.hook.ts +120 -120
  498. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  499. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  500. package/src/modules/projects/hooks/list-all-account-users.hook.ts +40 -40
  501. package/src/modules/projects/hooks/list-available-users.hook.ts +39 -39
  502. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +44 -44
  503. package/src/modules/projects/hooks/list-project-users.hook.ts +39 -39
  504. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  505. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  506. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  507. package/src/modules/projects/services/projects.service.ts +156 -156
  508. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  509. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  510. package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -13
  511. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  512. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  513. package/src/modules/subscriptions/constants/subscription.constants.ts +1 -1
  514. package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -17
  515. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  516. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +22 -22
  517. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +22 -22
  518. package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -25
  519. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  520. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +44 -44
  521. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  522. package/src/modules/subscriptions/types/calculate-subscription.type.ts +116 -116
  523. package/src/modules/subscriptions/types/pix-pending.type.ts +38 -38
  524. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  525. package/src/modules/subscriptions/utils/get-subscription-cancellation-state.ts +37 -37
  526. package/src/modules/subscriptions/utils/get-subscription-expiry-date.ts +33 -33
  527. package/src/modules/subscriptions/utils/has-subscription-expired.ts +11 -11
  528. package/src/modules/subscriptions/utils/periodicity.ts +79 -79
  529. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  530. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  531. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  532. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  533. package/src/modules/users/handlers/list-messages.handler.ts +39 -39
  534. package/src/modules/users/hooks/messages.hook.ts +69 -69
  535. package/src/modules/users/services/messages.service.ts +49 -49
  536. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  537. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  538. package/src/modules/whitelabel/schema.ts +84 -84
  539. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  540. package/src/providers/auth.provider.tsx +267 -267
  541. package/src/providers/navigation.provider.tsx +99 -99
  542. package/src/providers/whitelabel.provider.tsx +90 -90
  543. package/src/route.ts +4 -4
  544. package/src/store/useAccountModals.ts +85 -85
  545. package/src/store/useBuyCreditsModal.ts +21 -21
  546. package/src/store/useCreditsDisabledModal.ts +11 -11
  547. package/src/store/useDesktopSidebarStore.ts +47 -47
  548. package/src/store/useHexaPromoModal.ts +13 -13
  549. package/src/store/useMdSidebarStore.ts +34 -34
  550. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  551. package/src/utils/constants/br-states.ts +29 -29
  552. package/src/utils/cookies/hexa-promo.ts +114 -114
  553. package/src/utils/countries.ts +224 -224
  554. package/src/utils/format/currency.ts +70 -70
  555. package/src/utils/intl/cookie-domain.ts +29 -29
  556. package/src/utils/intl/locale-cookie.ts +18 -18
  557. package/src/utils/next-navigation.ts +7 -7
  558. package/src/utils/redirect.ts +78 -78
  559. package/src/utils/safeMutationAction.ts +24 -24
  560. package/src/utils/safeServerAction.ts +21 -21
  561. package/src/utils/withAction.ts +13 -13
@@ -1,94 +1,94 @@
1
- "use client";
2
-
3
- import { useActiveSubscription } from "../../modules/subscriptions/hooks/find-active-subscription.hook";
4
- import { useCharges } from "../../modules/charges/hooks/charges.hook";
5
- import { SUBSCRIPTION_GRACE_PERIOD_DAYS } from "../../modules/subscriptions/constants/subscription.constants";
6
- import { getSubscriptionExpiryDate } from "../../modules/subscriptions/utils/get-subscription-expiry-date";
7
- import { getSubscriptionCancellationState } from "../../modules/subscriptions/utils/get-subscription-cancellation-state";
8
- import { toCalendarDate, daysBetween } from "../../infra/utils/date";
9
- import { OverdueInvoiceBanner } from "./OverdueInvoiceBanner";
10
- import { UpcomingInvoiceBanner } from "./UpcomingInvoiceBanner";
11
- import { CancelledSubscriptionBanner } from "./CancelledSubscriptionBanner";
12
- import { PendingCancellationBanner } from "./PendingCancellationBanner";
13
- import { TrialBanner } from "./TrialBanner";
14
-
15
- const UPCOMING_WINDOW_DAYS = 7;
16
- const PAYMENT_METHOD_BOLETO = 2;
17
-
18
- interface SubscriptionBannerProps {
19
- onReactivate?: () => void;
20
- onDetails?: () => void;
21
- }
22
-
23
- export function SubscriptionBanner({
24
- onReactivate,
25
- onDetails,
26
- }: SubscriptionBannerProps) {
27
- const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();
28
- const { data: pendingChargesData, isLoading: isLoadingCharges } = useCharges({
29
- page: 1,
30
- limit: 1,
31
- status: [0],
32
- });
33
-
34
- if (!subscription?.date_due) return null;
35
- if (subscription.type === "free") return null;
36
-
37
- const dueDate = toCalendarDate(subscription.date_due);
38
- const today = toCalendarDate(new Date());
39
- if (!dueDate || !today) return null;
40
-
41
- const daysSinceDue = daysBetween(dueDate, today);
42
- const daysToDue = daysBetween(today, dueDate);
43
- const hasPendingCharge = !!pendingChargesData?.data?.[0];
44
- const isBoleto = subscription.payment_method === PAYMENT_METHOD_BOLETO;
45
-
46
- // Estado de cancelamento (fonte da verdade única, compartilhada com o
47
- // CancelledSubscriptionBanner). `active === false` tem prioridade e cai em
48
- // "cancelled" mesmo com date_due no futuro — é o caso da baixa por falha de
49
- // pagamento, onde date_due aponta pra uma fatura não paga.
50
- const expiryDate = getSubscriptionExpiryDate(subscription);
51
- const cancellationState = getSubscriptionCancellationState(subscription);
52
-
53
- // Trial: `date_due` guarda o fim do período de teste (ver auth.service).
54
- // Mostra a contagem regressiva enquanto o teste está vigente: `active` e não
55
- // vencido (`daysToDue >= 0`). NÃO usar `cancellationState` aqui — num trial o
56
- // `date_cancellation` é o agendamento padrão de não-renovação (o Stripe seta
57
- // = `date_due`), então cairia sempre em "pending" e o banner nunca apareceria.
58
- // Um trial encerrado de verdade vem com `active === false` (date_due placeholder).
59
- if (subscription.type === "trial") {
60
- if (!subscription.active || daysToDue < 0) return null;
61
- return <TrialBanner daysRemaining={daysToDue} onReactivate={onReactivate} />;
62
- }
63
-
64
- if (cancellationState === "cancelled") {
65
- return <CancelledSubscriptionBanner onReactivate={onReactivate} />;
66
- }
67
-
68
- if (cancellationState === "pending") {
69
- return (
70
- <PendingCancellationBanner
71
- limitDate={expiryDate}
72
- onReactivate={onReactivate}
73
- />
74
- );
75
- }
76
-
77
- if (subscription.type === "whitelabel") return null;
78
-
79
- if (daysSinceDue > 0 && daysSinceDue <= SUBSCRIPTION_GRACE_PERIOD_DAYS) {
80
- return <OverdueInvoiceBanner onDetails={onDetails} />;
81
- }
82
-
83
- if (
84
- isBoleto &&
85
- !isLoadingCharges &&
86
- hasPendingCharge &&
87
- daysToDue >= 0 &&
88
- daysToDue <= UPCOMING_WINDOW_DAYS
89
- ) {
90
- return <UpcomingInvoiceBanner dueDate={dueDate} onDetails={onDetails} />;
91
- }
92
-
93
- return null;
94
- }
1
+ "use client";
2
+
3
+ import { useActiveSubscription } from "../../modules/subscriptions/hooks/find-active-subscription.hook";
4
+ import { useCharges } from "../../modules/charges/hooks/charges.hook";
5
+ import { SUBSCRIPTION_GRACE_PERIOD_DAYS } from "../../modules/subscriptions/constants/subscription.constants";
6
+ import { getSubscriptionExpiryDate } from "../../modules/subscriptions/utils/get-subscription-expiry-date";
7
+ import { getSubscriptionCancellationState } from "../../modules/subscriptions/utils/get-subscription-cancellation-state";
8
+ import { toCalendarDate, daysBetween } from "../../infra/utils/date";
9
+ import { OverdueInvoiceBanner } from "./OverdueInvoiceBanner";
10
+ import { UpcomingInvoiceBanner } from "./UpcomingInvoiceBanner";
11
+ import { CancelledSubscriptionBanner } from "./CancelledSubscriptionBanner";
12
+ import { PendingCancellationBanner } from "./PendingCancellationBanner";
13
+ import { TrialBanner } from "./TrialBanner";
14
+
15
+ const UPCOMING_WINDOW_DAYS = 7;
16
+ const PAYMENT_METHOD_BOLETO = 2;
17
+
18
+ interface SubscriptionBannerProps {
19
+ onReactivate?: () => void;
20
+ onDetails?: () => void;
21
+ }
22
+
23
+ export function SubscriptionBanner({
24
+ onReactivate,
25
+ onDetails,
26
+ }: SubscriptionBannerProps) {
27
+ const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();
28
+ const { data: pendingChargesData, isLoading: isLoadingCharges } = useCharges({
29
+ page: 1,
30
+ limit: 1,
31
+ status: [0],
32
+ });
33
+
34
+ if (!subscription?.date_due) return null;
35
+ if (subscription.type === "free") return null;
36
+
37
+ const dueDate = toCalendarDate(subscription.date_due);
38
+ const today = toCalendarDate(new Date());
39
+ if (!dueDate || !today) return null;
40
+
41
+ const daysSinceDue = daysBetween(dueDate, today);
42
+ const daysToDue = daysBetween(today, dueDate);
43
+ const hasPendingCharge = !!pendingChargesData?.data?.[0];
44
+ const isBoleto = subscription.payment_method === PAYMENT_METHOD_BOLETO;
45
+
46
+ // Estado de cancelamento (fonte da verdade única, compartilhada com o
47
+ // CancelledSubscriptionBanner). `active === false` tem prioridade e cai em
48
+ // "cancelled" mesmo com date_due no futuro — é o caso da baixa por falha de
49
+ // pagamento, onde date_due aponta pra uma fatura não paga.
50
+ const expiryDate = getSubscriptionExpiryDate(subscription);
51
+ const cancellationState = getSubscriptionCancellationState(subscription);
52
+
53
+ // Trial: `date_due` guarda o fim do período de teste (ver auth.service).
54
+ // Mostra a contagem regressiva enquanto o teste está vigente: `active` e não
55
+ // vencido (`daysToDue >= 0`). NÃO usar `cancellationState` aqui — num trial o
56
+ // `date_cancellation` é o agendamento padrão de não-renovação (o Stripe seta
57
+ // = `date_due`), então cairia sempre em "pending" e o banner nunca apareceria.
58
+ // Um trial encerrado de verdade vem com `active === false` (date_due placeholder).
59
+ if (subscription.type === "trial") {
60
+ if (!subscription.active || daysToDue < 0) return null;
61
+ return <TrialBanner daysRemaining={daysToDue} onReactivate={onReactivate} />;
62
+ }
63
+
64
+ if (cancellationState === "cancelled") {
65
+ return <CancelledSubscriptionBanner onReactivate={onReactivate} />;
66
+ }
67
+
68
+ if (cancellationState === "pending") {
69
+ return (
70
+ <PendingCancellationBanner
71
+ limitDate={expiryDate}
72
+ onReactivate={onReactivate}
73
+ />
74
+ );
75
+ }
76
+
77
+ if (subscription.type === "whitelabel") return null;
78
+
79
+ if (daysSinceDue > 0 && daysSinceDue <= SUBSCRIPTION_GRACE_PERIOD_DAYS) {
80
+ return <OverdueInvoiceBanner onDetails={onDetails} />;
81
+ }
82
+
83
+ if (
84
+ isBoleto &&
85
+ !isLoadingCharges &&
86
+ hasPendingCharge &&
87
+ daysToDue >= 0 &&
88
+ daysToDue <= UPCOMING_WINDOW_DAYS
89
+ ) {
90
+ return <UpcomingInvoiceBanner dueDate={dueDate} onDetails={onDetails} />;
91
+ }
92
+
93
+ return null;
94
+ }
@@ -1,54 +1,54 @@
1
- 'use client';
2
-
3
- import { useState, useEffect, useCallback } from 'react';
4
- import { IconClock, IconX } from '@tabler/icons-react';
5
- import { useTranslations } from 'next-intl';
6
-
7
- interface TrialBannerProps {
8
- daysRemaining: number;
9
- onReactivate?: () => void;
10
- }
11
-
12
- export function TrialBanner({ daysRemaining, onReactivate }: TrialBannerProps) {
13
- const translate = useTranslations();
14
- const [visible, setVisible] = useState(true);
15
- const [animated, setAnimated] = useState(false);
16
-
17
- useEffect(() => {
18
- const timer = setTimeout(() => setAnimated(true), 50);
19
- return () => clearTimeout(timer);
20
- }, []);
21
-
22
- const dismiss = useCallback(() => setVisible(false), []);
23
-
24
- if (!visible) return null;
25
-
26
- return (
27
- <div className="fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0">
28
- <div
29
- className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-cyan-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}
30
- >
31
- <div className="flex items-center gap-2 flex-1 w-full sm:w-auto">
32
- <IconClock size={16} className="text-white shrink-0" />
33
- <span className="paragraph-xsmall-semibold text-white">
34
- {translate('common.navigation.banners.trial.message', { days: daysRemaining })}
35
- </span>
36
- </div>
37
- <div className="flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start">
38
- <button
39
- type="button"
40
- className="flex items-center justify-center p-1.5 cursor-pointer"
41
- onClick={onReactivate}
42
- >
43
- <span className="paragraph-xsmall-semibold text-white underline">
44
- {translate('common.navigation.banners.trial.choosePlan')}
45
- </span>
46
- </button>
47
- <button type="button" className="cursor-pointer shrink-0" onClick={dismiss}>
48
- <IconX size={18} className="text-cyan-100" />
49
- </button>
50
- </div>
51
- </div>
52
- </div>
53
- );
54
- }
1
+ 'use client';
2
+
3
+ import { useState, useEffect, useCallback } from 'react';
4
+ import { IconClock, IconX } from '@tabler/icons-react';
5
+ import { useTranslations } from 'next-intl';
6
+
7
+ interface TrialBannerProps {
8
+ daysRemaining: number;
9
+ onReactivate?: () => void;
10
+ }
11
+
12
+ export function TrialBanner({ daysRemaining, onReactivate }: TrialBannerProps) {
13
+ const translate = useTranslations();
14
+ const [visible, setVisible] = useState(true);
15
+ const [animated, setAnimated] = useState(false);
16
+
17
+ useEffect(() => {
18
+ const timer = setTimeout(() => setAnimated(true), 50);
19
+ return () => clearTimeout(timer);
20
+ }, []);
21
+
22
+ const dismiss = useCallback(() => setVisible(false), []);
23
+
24
+ if (!visible) return null;
25
+
26
+ return (
27
+ <div className="fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0">
28
+ <div
29
+ className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-cyan-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}
30
+ >
31
+ <div className="flex items-center gap-2 flex-1 w-full sm:w-auto">
32
+ <IconClock size={16} className="text-white shrink-0" />
33
+ <span className="paragraph-xsmall-semibold text-white">
34
+ {translate('common.navigation.banners.trial.message', { days: daysRemaining })}
35
+ </span>
36
+ </div>
37
+ <div className="flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start">
38
+ <button
39
+ type="button"
40
+ className="flex items-center justify-center p-1.5 cursor-pointer"
41
+ onClick={onReactivate}
42
+ >
43
+ <span className="paragraph-xsmall-semibold text-white underline">
44
+ {translate('common.navigation.banners.trial.choosePlan')}
45
+ </span>
46
+ </button>
47
+ <button type="button" className="cursor-pointer shrink-0" onClick={dismiss}>
48
+ <IconX size={18} className="text-cyan-100" />
49
+ </button>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ );
54
+ }
@@ -1,55 +1,55 @@
1
- 'use client';
2
-
3
- import { useState, useEffect, useCallback } from 'react';
4
- import { IconAlertTriangle, IconX } from '@tabler/icons-react';
5
- import { formatShortDate } from '../../infra/utils/date';
6
- import { useTranslations } from 'next-intl';
7
-
8
- interface UpcomingInvoiceBannerProps {
9
- dueDate?: Date | null;
10
- onDetails?: () => void;
11
- }
12
-
13
- export function UpcomingInvoiceBanner({ dueDate, onDetails }: UpcomingInvoiceBannerProps) {
14
- const translate = useTranslations();
15
- const [visible, setVisible] = useState(true);
16
- const [animated, setAnimated] = useState(false);
17
-
18
- useEffect(() => {
19
- const timer = setTimeout(() => setAnimated(true), 50);
20
- return () => clearTimeout(timer);
21
- }, []);
22
-
23
- const dismiss = useCallback(() => setVisible(false), []);
24
-
25
- if (!visible) return null;
26
-
27
- const formattedDueDate = formatShortDate(dueDate);
28
-
29
- return (
30
- <div className="fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0">
31
- <div
32
- className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-yellow-400 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}
33
- >
34
- <div className="flex items-center gap-2 flex-1 w-full sm:w-auto">
35
- <IconAlertTriangle size={16} className="text-zinc-950 shrink-0" />
36
- <span className="paragraph-xsmall-semibold text-zinc-950">
37
- {translate('common.navigation.banners.upcoming.message', { dueDate: formattedDueDate ?? '' })}
38
- </span>
39
- </div>
40
- <div className="flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start">
41
- <button
42
- type="button"
43
- className="flex items-center justify-center p-1.5 cursor-pointer"
44
- onClick={onDetails}
45
- >
46
- <span className="paragraph-xsmall-semibold text-zinc-950 underline">{translate('common.navigation.banners.upcoming.details')}</span>
47
- </button>
48
- <button type="button" className="cursor-pointer shrink-0" onClick={dismiss}>
49
- <IconX size={18} className="text-zinc-700" />
50
- </button>
51
- </div>
52
- </div>
53
- </div>
54
- );
55
- }
1
+ 'use client';
2
+
3
+ import { useState, useEffect, useCallback } from 'react';
4
+ import { IconAlertTriangle, IconX } from '@tabler/icons-react';
5
+ import { formatShortDate } from '../../infra/utils/date';
6
+ import { useTranslations } from 'next-intl';
7
+
8
+ interface UpcomingInvoiceBannerProps {
9
+ dueDate?: Date | null;
10
+ onDetails?: () => void;
11
+ }
12
+
13
+ export function UpcomingInvoiceBanner({ dueDate, onDetails }: UpcomingInvoiceBannerProps) {
14
+ const translate = useTranslations();
15
+ const [visible, setVisible] = useState(true);
16
+ const [animated, setAnimated] = useState(false);
17
+
18
+ useEffect(() => {
19
+ const timer = setTimeout(() => setAnimated(true), 50);
20
+ return () => clearTimeout(timer);
21
+ }, []);
22
+
23
+ const dismiss = useCallback(() => setVisible(false), []);
24
+
25
+ if (!visible) return null;
26
+
27
+ const formattedDueDate = formatShortDate(dueDate);
28
+
29
+ return (
30
+ <div className="fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0">
31
+ <div
32
+ className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-yellow-400 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}
33
+ >
34
+ <div className="flex items-center gap-2 flex-1 w-full sm:w-auto">
35
+ <IconAlertTriangle size={16} className="text-zinc-950 shrink-0" />
36
+ <span className="paragraph-xsmall-semibold text-zinc-950">
37
+ {translate('common.navigation.banners.upcoming.message', { dueDate: formattedDueDate ?? '' })}
38
+ </span>
39
+ </div>
40
+ <div className="flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start">
41
+ <button
42
+ type="button"
43
+ className="flex items-center justify-center p-1.5 cursor-pointer"
44
+ onClick={onDetails}
45
+ >
46
+ <span className="paragraph-xsmall-semibold text-zinc-950 underline">{translate('common.navigation.banners.upcoming.details')}</span>
47
+ </button>
48
+ <button type="button" className="cursor-pointer shrink-0" onClick={dismiss}>
49
+ <IconX size={18} className="text-zinc-700" />
50
+ </button>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ );
55
+ }
@@ -1,74 +1,74 @@
1
- 'use client';
2
-
3
- import { ReactNode, useRef, useEffect } from 'react';
4
- import Link from 'next/link';
5
- import { AppNavigationContext } from '../AppNavigationContext';
6
- import { useNavItemsContext } from '../NavItemsContext';
7
-
8
- function InternalTabsBar({ topOffset = '72px' }: { topOffset?: string }) {
9
- const { navItems } = useNavItemsContext();
10
- const tabsListRef = useRef<HTMLDivElement>(null);
11
- const activeTabRef = useRef<HTMLAnchorElement>(null);
12
-
13
- const activeLabel = navItems.find((i) => i.isActive)?.label;
14
-
15
- // Scroll active tab into center when active item changes
16
- useEffect(() => {
17
- if (activeTabRef.current && tabsListRef.current) {
18
- const tabsList = tabsListRef.current;
19
- const activeTabElement = activeTabRef.current;
20
- const tabsListRect = tabsList.getBoundingClientRect();
21
- const activeTabRect = activeTabElement.getBoundingClientRect();
22
- const scrollLeft =
23
- activeTabElement.offsetLeft - tabsListRect.width / 2 + activeTabRect.width / 2;
24
- tabsList.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });
25
- }
26
- }, [activeLabel]);
27
-
28
- if (!navItems.length) return null;
29
-
30
- return (
31
- <div
32
- ref={tabsListRef}
33
- className="md:hidden fixed left-0 right-0 z-40 bg-white border-b border-gray-200 flex overflow-x-auto scrollbar-hide"
34
- style={{ top: topOffset }}
35
- >
36
- {navItems.map((item) => (
37
- <Link
38
- key={item.label}
39
- ref={item.isActive ? activeTabRef : undefined}
40
- href={item.href}
41
- prefetch
42
- className={`flex items-center gap-2 px-4 py-3 shrink-0 border-b-2 transition-colors ${
43
- item.isActive
44
- ? 'border-gray-950 text-gray-950'
45
- : 'border-transparent text-gray-500 hover:text-gray-900'
46
- }`}
47
- >
48
- {item.icon && <item.icon size={16} className="shrink-0" />}
49
- <span
50
- className={
51
- item.isActive ? 'paragraph-small-semibold' : 'paragraph-small-medium'
52
- }
53
- >
54
- {item.label}
55
- </span>
56
- </Link>
57
- ))}
58
- </div>
59
- );
60
- }
61
-
62
- export function TabsMobileShell({ children, topOffset }: { children: ReactNode; topOffset?: string }) {
63
- return (
64
- <AppNavigationContext.Provider value={{ breakpoint: 'mobile' }}>
65
- {/*
66
- Children are hidden visually, but NavItems' useEffect still fires inside
67
- display:none — React effects are tied to commit phase, not layout visibility.
68
- This registers navItems in NavItemsContext so InternalTabsBar can read them.
69
- */}
70
- <div className="hidden">{children}</div>
71
- <InternalTabsBar topOffset={topOffset} />
72
- </AppNavigationContext.Provider>
73
- );
74
- }
1
+ 'use client';
2
+
3
+ import { ReactNode, useRef, useEffect } from 'react';
4
+ import Link from 'next/link';
5
+ import { AppNavigationContext } from '../AppNavigationContext';
6
+ import { useNavItemsContext } from '../NavItemsContext';
7
+
8
+ function InternalTabsBar({ topOffset = '72px' }: { topOffset?: string }) {
9
+ const { navItems } = useNavItemsContext();
10
+ const tabsListRef = useRef<HTMLDivElement>(null);
11
+ const activeTabRef = useRef<HTMLAnchorElement>(null);
12
+
13
+ const activeLabel = navItems.find((i) => i.isActive)?.label;
14
+
15
+ // Scroll active tab into center when active item changes
16
+ useEffect(() => {
17
+ if (activeTabRef.current && tabsListRef.current) {
18
+ const tabsList = tabsListRef.current;
19
+ const activeTabElement = activeTabRef.current;
20
+ const tabsListRect = tabsList.getBoundingClientRect();
21
+ const activeTabRect = activeTabElement.getBoundingClientRect();
22
+ const scrollLeft =
23
+ activeTabElement.offsetLeft - tabsListRect.width / 2 + activeTabRect.width / 2;
24
+ tabsList.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });
25
+ }
26
+ }, [activeLabel]);
27
+
28
+ if (!navItems.length) return null;
29
+
30
+ return (
31
+ <div
32
+ ref={tabsListRef}
33
+ className="md:hidden fixed left-0 right-0 z-40 bg-white border-b border-gray-200 flex overflow-x-auto scrollbar-hide"
34
+ style={{ top: topOffset }}
35
+ >
36
+ {navItems.map((item) => (
37
+ <Link
38
+ key={item.label}
39
+ ref={item.isActive ? activeTabRef : undefined}
40
+ href={item.href}
41
+ prefetch
42
+ className={`flex items-center gap-2 px-4 py-3 shrink-0 border-b-2 transition-colors ${
43
+ item.isActive
44
+ ? 'border-gray-950 text-gray-950'
45
+ : 'border-transparent text-gray-500 hover:text-gray-900'
46
+ }`}
47
+ >
48
+ {item.icon && <item.icon size={16} className="shrink-0" />}
49
+ <span
50
+ className={
51
+ item.isActive ? 'paragraph-small-semibold' : 'paragraph-small-medium'
52
+ }
53
+ >
54
+ {item.label}
55
+ </span>
56
+ </Link>
57
+ ))}
58
+ </div>
59
+ );
60
+ }
61
+
62
+ export function TabsMobileShell({ children, topOffset }: { children: ReactNode; topOffset?: string }) {
63
+ return (
64
+ <AppNavigationContext.Provider value={{ breakpoint: 'mobile' }}>
65
+ {/*
66
+ Children are hidden visually, but NavItems' useEffect still fires inside
67
+ display:none — React effects are tied to commit phase, not layout visibility.
68
+ This registers navItems in NavItemsContext so InternalTabsBar can read them.
69
+ */}
70
+ <div className="hidden">{children}</div>
71
+ <InternalTabsBar topOffset={topOffset} />
72
+ </AppNavigationContext.Provider>
73
+ );
74
+ }