@greatapps/common 1.1.695 → 1.1.697

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 (555) 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/Modals.mjs.map +1 -1
  34. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  35. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  36. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  37. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  38. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  39. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  40. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  41. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  42. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  43. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  44. package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
  45. package/dist/components/navigation/TrialBanner.mjs.map +1 -1
  46. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  47. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  48. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  49. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  50. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  51. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  52. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  53. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  54. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  55. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  58. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  59. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  60. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  61. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  62. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  63. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  64. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  65. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  66. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  67. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  68. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  69. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  70. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  71. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  72. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  73. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  74. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  75. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  76. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  77. package/dist/components/ui/form/FormField.mjs.map +1 -1
  78. package/dist/components/ui/form/Input.mjs.map +1 -1
  79. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  80. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  81. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  82. package/dist/components/ui/form/Select.mjs +1 -1
  83. package/dist/components/ui/form/Select.mjs.map +1 -1
  84. package/dist/components/ui/form/Switch.mjs.map +1 -1
  85. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  86. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  87. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  88. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  89. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  90. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  91. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +10 -0
  92. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  93. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  94. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  95. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  96. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  97. package/dist/handlers.mjs.map +1 -1
  98. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  99. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  100. package/dist/hooks/useBrandLoadingIcon.mjs.map +1 -1
  101. package/dist/hooks/useRouter.mjs.map +1 -1
  102. package/dist/http.mjs.map +1 -1
  103. package/dist/i18n/config.mjs.map +1 -1
  104. package/dist/i18n/country-language.mjs.map +1 -1
  105. package/dist/i18n/messages/en-us.mjs.map +1 -1
  106. package/dist/i18n/messages/es-es.mjs.map +1 -1
  107. package/dist/i18n/messages/index.mjs.map +1 -1
  108. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  109. package/dist/i18n/normalize.mjs.map +1 -1
  110. package/dist/i18n/resolve-locale.mjs.map +1 -1
  111. package/dist/i18n.mjs.map +1 -1
  112. package/dist/index.mjs.map +1 -1
  113. package/dist/infra/http/api-fetch.mjs.map +1 -1
  114. package/dist/infra/route/parse-id.mjs.map +1 -1
  115. package/dist/infra/route/parse-numeric.mjs.map +1 -1
  116. package/dist/infra/route/safe-route-handler.mjs.map +1 -1
  117. package/dist/infra/route/search-params.mjs.map +1 -1
  118. package/dist/infra/utils/array.mjs.map +1 -1
  119. package/dist/infra/utils/date.mjs.map +1 -1
  120. package/dist/middleware.mjs.map +1 -1
  121. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  122. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  123. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  124. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  125. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  126. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  127. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  128. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -1
  129. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  130. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  131. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  132. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  133. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  134. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  135. package/dist/modules/auth/actions/social-google-login.action.mjs.map +1 -1
  136. package/dist/modules/auth/actions/social-google-onboarding.action.mjs.map +1 -1
  137. package/dist/modules/auth/actions/unlink-google.action.mjs.map +1 -1
  138. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  139. package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
  140. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  141. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  142. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  143. package/dist/modules/auth/hooks/social-google-login.hook.mjs.map +1 -1
  144. package/dist/modules/auth/hooks/social-google-onboarding.hook.mjs.map +1 -1
  145. package/dist/modules/auth/hooks/unlink-google.hook.mjs.map +1 -1
  146. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  147. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  148. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  149. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  150. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  151. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  152. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  153. package/dist/modules/auth/utils/require-token-not-expired.mjs.map +1 -1
  154. package/dist/modules/auth/utils/require-valid-session.mjs.map +1 -1
  155. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  156. package/dist/modules/cards/actions/create-setup-intent.action.mjs.map +1 -1
  157. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  158. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  159. package/dist/modules/cards/handlers/find-card-by-id.handler.mjs.map +1 -1
  160. package/dist/modules/cards/handlers/list-cards.handler.mjs.map +1 -1
  161. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  162. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  163. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  164. package/dist/modules/cards/hooks/create-setup-intent.hook.mjs.map +1 -1
  165. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  166. package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -1
  167. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  168. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  169. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  170. package/dist/modules/cards/types.mjs.map +1 -1
  171. package/dist/modules/charges/actions/charge-action.action.mjs.map +1 -1
  172. package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs.map +1 -1
  173. package/dist/modules/charges/handlers/list-charges.handler.mjs.map +1 -1
  174. package/dist/modules/charges/hooks/charge-action.hook.mjs.map +1 -1
  175. package/dist/modules/charges/hooks/charge-by-id.hook.mjs.map +1 -1
  176. package/dist/modules/charges/hooks/charges.hook.mjs.map +1 -1
  177. package/dist/modules/charges/services/charges.service.mjs.map +1 -1
  178. package/dist/modules/charges/types/charge.type.mjs.map +1 -1
  179. package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs.map +1 -1
  180. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  181. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  182. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  183. package/dist/modules/images/hooks/use-image-upload.hook.mjs +4 -1
  184. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  185. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  186. package/dist/modules/images/utils/base64.mjs.map +1 -1
  187. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  188. package/dist/modules/images/utils/crop-image.mjs +6 -2
  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/useMdSidebarStore.mjs.map +1 -1
  267. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  268. package/dist/utils/constants/br-states.mjs.map +1 -1
  269. package/dist/utils/countries.mjs.map +1 -1
  270. package/dist/utils/format/currency.mjs.map +1 -1
  271. package/dist/utils/intl/cookie-domain.mjs.map +1 -1
  272. package/dist/utils/intl/locale-cookie.mjs.map +1 -1
  273. package/dist/utils/next-navigation.mjs.map +1 -1
  274. package/dist/utils/redirect.mjs.map +1 -1
  275. package/dist/utils/safeMutationAction.mjs.map +1 -1
  276. package/dist/utils/safeServerAction.mjs.map +1 -1
  277. package/dist/utils/withAction.mjs.map +1 -1
  278. package/package.json +115 -115
  279. package/src/components/account/ConfigurationsMyAccountModal.tsx +179 -179
  280. package/src/components/account/ConfirmDeleteAccountModal.tsx +110 -110
  281. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +68 -68
  282. package/src/components/account/DeleteAccountModal.tsx +160 -160
  283. package/src/components/account/DisableTwoFactorAuthModal.tsx +92 -92
  284. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +51 -51
  285. package/src/components/account/TwoFactorAuthModal.tsx +220 -220
  286. package/src/components/account/hooks/useChangePhoneForm.tsx +113 -113
  287. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +116 -116
  288. package/src/components/account/sections/ChangeEmailModal.tsx +239 -239
  289. package/src/components/account/sections/ChangePasswordSection.tsx +68 -68
  290. package/src/components/account/sections/ChangePhoneModal.tsx +273 -273
  291. package/src/components/account/sections/MyProfileSection.tsx +276 -276
  292. package/src/components/account/sections/PreferencesSection.tsx +278 -278
  293. package/src/components/account/sections/SecuritySection.tsx +102 -102
  294. package/src/components/account/sections/TokenSection.tsx +85 -85
  295. package/src/components/embeds/ClarityEmbed.tsx +70 -70
  296. package/src/components/embeds/CrispEmbed.tsx +195 -195
  297. package/src/components/embeds/EmbedWidgets.tsx +62 -62
  298. package/src/components/embeds/FrillEmbed.tsx +146 -146
  299. package/src/components/layouts/AppMobileNavBar.tsx +214 -214
  300. package/src/components/layouts/AppNavBar.tsx +40 -40
  301. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  302. package/src/components/layouts/NavBar.tsx +228 -228
  303. package/src/components/layouts/NotificationsPopover.tsx +120 -120
  304. package/src/components/layouts/ProfilePopover.tsx +191 -191
  305. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  306. package/src/components/layouts/UsersSelectorPopover.tsx +236 -236
  307. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  308. package/src/components/modals/BuyCreditsModal.tsx +390 -390
  309. package/src/components/modals/CreditsDisabledModal.tsx +62 -62
  310. package/src/components/modals/Modals.tsx +25 -25
  311. package/src/components/modals/PaidPlanRequiredModal.tsx +60 -60
  312. package/src/components/modals/cards/AddCardModal.tsx +420 -420
  313. package/src/components/modals/cards/CannotDeleteCardModal.tsx +124 -124
  314. package/src/components/modals/cards/CardFormFields.tsx +363 -363
  315. package/src/components/modals/cards/DeleteCardModal.tsx +136 -136
  316. package/src/components/navigation/CancelledSubscriptionBanner.tsx +62 -62
  317. package/src/components/navigation/NavItemsContext.ts +20 -20
  318. package/src/components/navigation/OverdueInvoiceBanner.tsx +51 -51
  319. package/src/components/navigation/PendingCancellationBanner.tsx +60 -60
  320. package/src/components/navigation/ProjectSelectorPopover.tsx +180 -180
  321. package/src/components/navigation/SubscriptionBanner.tsx +94 -94
  322. package/src/components/navigation/TrialBanner.tsx +54 -54
  323. package/src/components/navigation/UpcomingInvoiceBanner.tsx +55 -55
  324. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  325. package/src/components/navigation/subcomponents/BottomLinks.tsx +85 -85
  326. package/src/components/navigation/subcomponents/ProjectSelector.tsx +184 -184
  327. package/src/components/pages/NotFoundPage.tsx +75 -75
  328. package/src/components/pages/notifications/Notifications.tsx +190 -190
  329. package/src/components/ui/buttons/Button.tsx +77 -77
  330. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  331. package/src/components/ui/buttons/CopyButton.tsx +59 -59
  332. package/src/components/ui/data-display/Accordion.tsx +81 -81
  333. package/src/components/ui/data-display/Badge.tsx +47 -47
  334. package/src/components/ui/data-display/Card.tsx +93 -93
  335. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  336. package/src/components/ui/data-display/CardItem.tsx +135 -135
  337. package/src/components/ui/data-display/Pagination.tsx +126 -126
  338. package/src/components/ui/data-display/PaymentInfoCard.tsx +193 -193
  339. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  340. package/src/components/ui/data-display/Separator.tsx +29 -29
  341. package/src/components/ui/data-display/Table.tsx +117 -117
  342. package/src/components/ui/data-display/Tabs.tsx +67 -67
  343. package/src/components/ui/feedback/CircularProgress.tsx +79 -79
  344. package/src/components/ui/feedback/DefaultCircularProgress.tsx +67 -67
  345. package/src/components/ui/feedback/LoadingOverlay.tsx +30 -30
  346. package/src/components/ui/feedback/Progress.tsx +40 -40
  347. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  348. package/src/components/ui/feedback/Toast.tsx +104 -104
  349. package/src/components/ui/form/Calendar.tsx +228 -228
  350. package/src/components/ui/form/Checkbox.tsx +31 -31
  351. package/src/components/ui/form/ComboboxField.tsx +159 -159
  352. package/src/components/ui/form/DatePicker.tsx +100 -100
  353. package/src/components/ui/form/DateRangePicker.tsx +111 -111
  354. package/src/components/ui/form/FormField.tsx +133 -133
  355. package/src/components/ui/form/Input.tsx +20 -20
  356. package/src/components/ui/form/InputOtp.tsx +80 -80
  357. package/src/components/ui/form/PhoneInput.tsx +210 -210
  358. package/src/components/ui/form/RadioGroup.tsx +45 -45
  359. package/src/components/ui/form/Select.tsx +200 -200
  360. package/src/components/ui/form/Switch.tsx +32 -32
  361. package/src/components/ui/form/Textarea.tsx +19 -19
  362. package/src/components/ui/overlay/Command.tsx +185 -185
  363. package/src/components/ui/overlay/Dialog.tsx +153 -153
  364. package/src/components/ui/overlay/Popover.tsx +49 -49
  365. package/src/components/ui/overlay/Sheet.tsx +170 -170
  366. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  367. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +392 -382
  368. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +62 -62
  369. package/src/components/widgets/ImageUpload/ImageUpload.tsx +131 -131
  370. package/src/components/widgets/ImageUpload/index.ts +3 -3
  371. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  372. package/src/handlers.ts +22 -22
  373. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  374. package/src/hooks/useAuthQueryKey.ts +32 -32
  375. package/src/hooks/useBrandLoadingIcon.tsx +18 -18
  376. package/src/hooks/useRouter.ts +38 -38
  377. package/src/http.ts +1 -1
  378. package/src/i18n/config.ts +17 -17
  379. package/src/i18n/country-language.ts +60 -60
  380. package/src/i18n/messages/en-us.ts +519 -519
  381. package/src/i18n/messages/es-es.ts +520 -520
  382. package/src/i18n/messages/index.ts +24 -24
  383. package/src/i18n/messages/pt-br.ts +543 -543
  384. package/src/i18n/normalize.ts +15 -15
  385. package/src/i18n/resolve-locale.ts +77 -77
  386. package/src/i18n.ts +10 -10
  387. package/src/index.ts +584 -584
  388. package/src/infra/http/api-fetch.ts +39 -39
  389. package/src/infra/route/parse-id.ts +9 -9
  390. package/src/infra/route/parse-numeric.ts +16 -16
  391. package/src/infra/route/safe-route-handler.ts +16 -16
  392. package/src/infra/route/search-params.ts +9 -9
  393. package/src/infra/utils/array.ts +167 -167
  394. package/src/infra/utils/date.ts +59 -59
  395. package/src/middleware.ts +4 -4
  396. package/src/modules/accounts/actions/account-management.action.ts +109 -109
  397. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  398. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  399. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  400. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  401. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  402. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  403. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -32
  404. package/src/modules/accounts/hooks/useAccountManagement.ts +95 -95
  405. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  406. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  407. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  408. package/src/modules/accounts/services/account-token.service.ts +52 -52
  409. package/src/modules/accounts/services/account.service.ts +243 -243
  410. package/src/modules/accounts/types.ts +230 -230
  411. package/src/modules/auth/actions/social-google-login.action.ts +12 -12
  412. package/src/modules/auth/actions/social-google-onboarding.action.ts +13 -13
  413. package/src/modules/auth/actions/unlink-google.action.ts +8 -8
  414. package/src/modules/auth/actions/validate-session.action.ts +70 -70
  415. package/src/modules/auth/actions/verify-two-factor.action.ts +19 -19
  416. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  417. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  418. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  419. package/src/modules/auth/hooks/social-google-login.hook.tsx +13 -13
  420. package/src/modules/auth/hooks/social-google-onboarding.hook.tsx +13 -13
  421. package/src/modules/auth/hooks/unlink-google.hook.tsx +13 -13
  422. package/src/modules/auth/hooks/useManagementPermissions.ts +52 -52
  423. package/src/modules/auth/hooks/useUserQuery.ts +103 -103
  424. package/src/modules/auth/types/management-permission.type.ts +14 -14
  425. package/src/modules/auth/utils/assert-management-permission.ts +56 -56
  426. package/src/modules/auth/utils/assert-management-subscription.ts +38 -38
  427. package/src/modules/auth/utils/assert-paid-subscription.ts +47 -47
  428. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  429. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  430. package/src/modules/auth/utils/require-token-not-expired.ts +53 -53
  431. package/src/modules/auth/utils/require-valid-session.ts +35 -35
  432. package/src/modules/cards/actions/create-card.action.ts +9 -9
  433. package/src/modules/cards/actions/create-setup-intent.action.ts +8 -8
  434. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  435. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  436. package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -15
  437. package/src/modules/cards/handlers/list-cards.handler.ts +10 -10
  438. package/src/modules/cards/hooks/card-by-id.hook.ts +17 -17
  439. package/src/modules/cards/hooks/cards.hook.ts +22 -22
  440. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  441. package/src/modules/cards/hooks/create-setup-intent.hook.ts +11 -11
  442. package/src/modules/cards/hooks/delete-card.hook.ts +52 -52
  443. package/src/modules/cards/hooks/delete-confirmation.hook.ts +40 -40
  444. package/src/modules/cards/hooks/handle-delete-card.hook.ts +47 -47
  445. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  446. package/src/modules/cards/services/cards.service.ts +136 -136
  447. package/src/modules/cards/types.ts +52 -52
  448. package/src/modules/charges/actions/charge-action.action.ts +13 -13
  449. package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -14
  450. package/src/modules/charges/handlers/list-charges.handler.ts +15 -15
  451. package/src/modules/charges/hooks/charge-action.hook.ts +24 -24
  452. package/src/modules/charges/hooks/charge-by-id.hook.ts +19 -19
  453. package/src/modules/charges/hooks/charges.hook.ts +19 -19
  454. package/src/modules/charges/services/charges.service.ts +63 -63
  455. package/src/modules/charges/types/charge.type.ts +68 -68
  456. package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -14
  457. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +103 -103
  458. package/src/modules/images/actions/process-image.action.ts +40 -40
  459. package/src/modules/images/constants/image.constants.ts +11 -11
  460. package/src/modules/images/hooks/use-image-upload.hook.ts +153 -145
  461. package/src/modules/images/services/image-processing.service.ts +75 -75
  462. package/src/modules/images/types/image.type.ts +54 -54
  463. package/src/modules/images/utils/base64.ts +26 -26
  464. package/src/modules/images/utils/compress-image.ts +20 -20
  465. package/src/modules/images/utils/crop-image.ts +68 -51
  466. package/src/modules/images/utils/validate-image.ts +86 -86
  467. package/src/modules/pages/constants/query-keys.constants.ts +1 -1
  468. package/src/modules/pages/handlers/count-pages.handler.ts +12 -12
  469. package/src/modules/pages/hooks/count-pages.hook.ts +21 -21
  470. package/src/modules/pages/services/pages.service.ts +27 -27
  471. package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -14
  472. package/src/modules/plans/handlers/list-plans.handler.ts +22 -22
  473. package/src/modules/plans/hooks/list-plans.hook.ts +23 -23
  474. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  475. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +39 -39
  476. package/src/modules/plans/services/plans.service.ts +135 -135
  477. package/src/modules/plans/types/plan.type.ts +75 -75
  478. package/src/modules/plans/utils/map-api-plan-to-ui.ts +167 -167
  479. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  480. package/src/modules/projects/actions/create-project.action.ts +9 -9
  481. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  482. package/src/modules/projects/actions/find-project.action.ts +8 -8
  483. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  484. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  485. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  486. package/src/modules/projects/actions/update-project.action.ts +9 -9
  487. package/src/modules/projects/handlers/find-project.handler.ts +15 -15
  488. package/src/modules/projects/handlers/list-all-account-users.handler.ts +23 -23
  489. package/src/modules/projects/handlers/list-available-users.handler.ts +26 -26
  490. package/src/modules/projects/handlers/list-project-users.handler.ts +26 -26
  491. package/src/modules/projects/handlers/list-projects.handler.ts +23 -23
  492. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  493. package/src/modules/projects/hooks/create-project.hook.ts +120 -120
  494. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  495. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  496. package/src/modules/projects/hooks/list-all-account-users.hook.ts +40 -40
  497. package/src/modules/projects/hooks/list-available-users.hook.ts +39 -39
  498. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +44 -44
  499. package/src/modules/projects/hooks/list-project-users.hook.ts +39 -39
  500. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  501. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  502. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  503. package/src/modules/projects/services/projects.service.ts +156 -156
  504. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  505. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  506. package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -13
  507. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  508. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  509. package/src/modules/subscriptions/constants/subscription.constants.ts +1 -1
  510. package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -17
  511. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  512. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +22 -22
  513. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +22 -22
  514. package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -25
  515. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  516. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +44 -44
  517. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  518. package/src/modules/subscriptions/types/calculate-subscription.type.ts +116 -116
  519. package/src/modules/subscriptions/types/pix-pending.type.ts +38 -38
  520. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  521. package/src/modules/subscriptions/utils/get-subscription-cancellation-state.ts +37 -37
  522. package/src/modules/subscriptions/utils/get-subscription-expiry-date.ts +33 -33
  523. package/src/modules/subscriptions/utils/has-subscription-expired.ts +11 -11
  524. package/src/modules/subscriptions/utils/periodicity.ts +79 -79
  525. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  526. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  527. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  528. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  529. package/src/modules/users/handlers/list-messages.handler.ts +39 -39
  530. package/src/modules/users/hooks/messages.hook.ts +69 -69
  531. package/src/modules/users/services/messages.service.ts +49 -49
  532. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  533. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  534. package/src/modules/whitelabel/schema.ts +84 -84
  535. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  536. package/src/providers/auth.provider.tsx +264 -264
  537. package/src/providers/navigation.provider.tsx +99 -99
  538. package/src/providers/whitelabel.provider.tsx +90 -90
  539. package/src/route.ts +4 -4
  540. package/src/store/useAccountModals.ts +85 -85
  541. package/src/store/useBuyCreditsModal.ts +21 -21
  542. package/src/store/useCreditsDisabledModal.ts +11 -11
  543. package/src/store/useDesktopSidebarStore.ts +47 -47
  544. package/src/store/useMdSidebarStore.ts +34 -34
  545. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  546. package/src/utils/constants/br-states.ts +29 -29
  547. package/src/utils/countries.ts +224 -224
  548. package/src/utils/format/currency.ts +70 -70
  549. package/src/utils/intl/cookie-domain.ts +29 -29
  550. package/src/utils/intl/locale-cookie.ts +18 -18
  551. package/src/utils/next-navigation.ts +7 -7
  552. package/src/utils/redirect.ts +78 -78
  553. package/src/utils/safeMutationAction.ts +24 -24
  554. package/src/utils/safeServerAction.ts +21 -21
  555. 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
+ }