@greatapps/common 1.1.374 → 1.1.376

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 (334) hide show
  1. package/dist/components/account/AccountModals.mjs.map +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  3. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  5. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  6. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  7. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  8. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  9. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  10. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  11. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  14. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  15. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  16. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  17. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  18. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  20. package/dist/components/handlers/SearchParamsHandler.mjs.map +1 -1
  21. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  22. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/CollapsibleSidebar.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/ModalManager.mjs.map +1 -1
  33. package/dist/components/modals/Modals.mjs.map +1 -1
  34. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  35. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  36. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  37. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  38. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  39. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  40. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  41. package/dist/components/pages/NotFoundPage.mjs +11 -1
  42. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  43. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  44. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  45. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  46. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  47. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  48. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  50. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  51. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  52. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  53. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  54. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  55. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  58. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  59. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  60. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  61. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  62. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  63. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  64. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  65. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  66. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  67. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  68. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  69. package/dist/components/ui/form/FormField.mjs.map +1 -1
  70. package/dist/components/ui/form/Input.mjs.map +1 -1
  71. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  72. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  73. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  74. package/dist/components/ui/form/Select.mjs +1 -1
  75. package/dist/components/ui/form/Select.mjs.map +1 -1
  76. package/dist/components/ui/form/Switch.mjs.map +1 -1
  77. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  78. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  79. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  80. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  83. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  84. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  85. package/dist/hooks/useDebounce.mjs.map +1 -1
  86. package/dist/hooks/useDebounceState.mjs.map +1 -1
  87. package/dist/hooks/useDebouncedEffect.mjs.map +1 -1
  88. package/dist/index.mjs.map +1 -1
  89. package/dist/infra/utils/clsx.mjs.map +1 -1
  90. package/dist/infra/utils/date.mjs.map +1 -1
  91. package/dist/infra/utils/parser.mjs.map +1 -1
  92. package/dist/infra/utils/percentage.mjs.map +1 -1
  93. package/dist/middleware.mjs.map +1 -1
  94. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  95. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  96. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  97. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  98. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  99. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  100. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  101. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  103. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  104. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  105. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  106. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  107. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  108. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  109. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  110. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  111. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  112. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  113. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  114. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  115. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  116. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  117. package/dist/modules/cards/types.mjs.map +1 -1
  118. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  119. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  120. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  121. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  122. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  123. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  124. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  125. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  126. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  127. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  128. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  129. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  130. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  131. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  132. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  133. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  134. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  135. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  136. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  137. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  138. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  139. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  140. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  141. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  142. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  143. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  144. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  145. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  146. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  147. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  148. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  149. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  150. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  151. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  152. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  153. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  154. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  155. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  156. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  157. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  158. package/dist/store/useAccountModals.mjs.map +1 -1
  159. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  160. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  161. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  162. package/dist/store/useModalManager.mjs.map +1 -1
  163. package/dist/utils/constants/br-states.mjs.map +1 -1
  164. package/dist/utils/countries.mjs.map +1 -1
  165. package/dist/utils/safeServerAction.mjs.map +1 -1
  166. package/dist/utils/withAction.mjs.map +1 -1
  167. package/package.json +89 -89
  168. package/src/components/account/AccountModals.tsx +17 -17
  169. package/src/components/account/ConfigurationsMyAccountModal.tsx +146 -146
  170. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  171. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  172. package/src/components/account/DeleteAccountModal.tsx +130 -130
  173. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  174. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  175. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  176. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  177. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  178. package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
  179. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  180. package/src/components/account/sections/ChangePhoneModal.tsx +245 -245
  181. package/src/components/account/sections/MyProfileSection.tsx +327 -327
  182. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  183. package/src/components/account/sections/SecuritySection.tsx +46 -46
  184. package/src/components/embeds/CrispEmbed.tsx +101 -101
  185. package/src/components/embeds/FrillEmbed.tsx +119 -119
  186. package/src/components/handlers/SearchParamsHandler.tsx +61 -61
  187. package/src/components/layouts/AppMobileNavBar.tsx +118 -118
  188. package/src/components/layouts/AppNavBar.tsx +46 -46
  189. package/src/components/layouts/CollapsibleSidebar.tsx +67 -67
  190. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  191. package/src/components/layouts/NavBar.tsx +172 -172
  192. package/src/components/layouts/NotificationsPopover.tsx +115 -115
  193. package/src/components/layouts/ProfilePopover.tsx +178 -178
  194. package/src/components/layouts/SideBarNavigation.tsx +62 -62
  195. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  196. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  197. package/src/components/modals/BuyCreditsModal.tsx +314 -314
  198. package/src/components/modals/ModalManager.tsx +29 -29
  199. package/src/components/modals/Modals.tsx +26 -26
  200. package/src/components/modals/cards/AddCardModal.tsx +260 -260
  201. package/src/components/modals/cards/CardFormFields.tsx +294 -294
  202. package/src/components/navigation/CancelledSubscriptionBanner.tsx +60 -60
  203. package/src/components/navigation/NavItemsContext.ts +20 -20
  204. package/src/components/navigation/ProjectSelectorPopover.tsx +160 -160
  205. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  206. package/src/components/navigation/subcomponents/ProjectSelector.tsx +160 -160
  207. package/src/components/pages/NotFoundPage.tsx +59 -50
  208. package/src/components/pages/notifications/Notifications.tsx +160 -160
  209. package/src/components/ui/buttons/Button.tsx +57 -57
  210. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  211. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  212. package/src/components/ui/data-display/Accordion.tsx +81 -81
  213. package/src/components/ui/data-display/Badge.tsx +47 -47
  214. package/src/components/ui/data-display/Card.tsx +93 -93
  215. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  216. package/src/components/ui/data-display/CardItem.tsx +75 -75
  217. package/src/components/ui/data-display/Pagination.tsx +126 -126
  218. package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
  219. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  220. package/src/components/ui/data-display/Separator.tsx +29 -29
  221. package/src/components/ui/data-display/Table.tsx +117 -117
  222. package/src/components/ui/data-display/Tabs.tsx +67 -67
  223. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  224. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  225. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  226. package/src/components/ui/feedback/Progress.tsx +40 -40
  227. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  228. package/src/components/ui/feedback/Toast.tsx +101 -101
  229. package/src/components/ui/form/Calendar.tsx +228 -228
  230. package/src/components/ui/form/Checkbox.tsx +31 -31
  231. package/src/components/ui/form/ComboboxField.tsx +154 -154
  232. package/src/components/ui/form/DatePicker.tsx +97 -97
  233. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  234. package/src/components/ui/form/FormField.tsx +131 -131
  235. package/src/components/ui/form/Input.tsx +20 -20
  236. package/src/components/ui/form/InputOtp.tsx +80 -80
  237. package/src/components/ui/form/PhoneInput.tsx +208 -208
  238. package/src/components/ui/form/RadioGroup.tsx +45 -45
  239. package/src/components/ui/form/Select.tsx +200 -200
  240. package/src/components/ui/form/Switch.tsx +32 -32
  241. package/src/components/ui/form/Textarea.tsx +19 -19
  242. package/src/components/ui/overlay/Command.tsx +185 -185
  243. package/src/components/ui/overlay/Dialog.tsx +151 -151
  244. package/src/components/ui/overlay/Popover.tsx +49 -49
  245. package/src/components/ui/overlay/Sheet.tsx +166 -166
  246. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  247. package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
  248. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  249. package/src/hooks/useDebounce.ts +26 -26
  250. package/src/hooks/useDebounceState.ts +11 -11
  251. package/src/hooks/useDebouncedEffect.ts +69 -69
  252. package/src/index.ts +391 -391
  253. package/src/infra/utils/clsx.ts +6 -6
  254. package/src/infra/utils/date.ts +7 -7
  255. package/src/infra/utils/parser.ts +52 -52
  256. package/src/infra/utils/percentage.ts +42 -42
  257. package/src/middleware.ts +4 -4
  258. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  259. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  260. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  261. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  262. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  263. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  264. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  265. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  266. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  267. package/src/modules/accounts/services/account.service.ts +239 -239
  268. package/src/modules/accounts/types.ts +225 -225
  269. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  270. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  271. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  272. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  273. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  274. package/src/modules/auth/types/management-permission.type.ts +7 -7
  275. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  276. package/src/modules/auth/utils/assert-management-subscription.ts +27 -27
  277. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  278. package/src/modules/cards/actions/create-card.action.ts +9 -9
  279. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  280. package/src/modules/cards/hooks/cards.hook.ts +14 -14
  281. package/src/modules/cards/hooks/create-card.hook.ts +18 -18
  282. package/src/modules/cards/services/cards.service.ts +51 -51
  283. package/src/modules/cards/types.ts +32 -32
  284. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  285. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  286. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +17 -17
  287. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
  288. package/src/modules/plans/services/plans.service.ts +36 -36
  289. package/src/modules/plans/types/plan.type.ts +21 -21
  290. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  291. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  292. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  293. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  294. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  295. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  296. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  297. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  298. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  299. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  300. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  301. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  302. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  303. package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
  304. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  305. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  306. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
  307. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
  308. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  309. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  310. package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
  311. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  312. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  313. package/src/modules/subscriptions/utils/periodicity.ts +52 -52
  314. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  315. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  316. package/src/modules/users/action/list-messages.action.ts +12 -12
  317. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  318. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  319. package/src/modules/users/hooks/messages.hook.ts +60 -60
  320. package/src/modules/users/services/messages.service.ts +48 -48
  321. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  322. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  323. package/src/modules/whitelabel/schema.ts +84 -84
  324. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  325. package/src/providers/whitelabel.provider.tsx +54 -54
  326. package/src/store/useAccountModals.ts +55 -55
  327. package/src/store/useBuyCreditsModal.ts +21 -21
  328. package/src/store/useDesktopSidebarStore.ts +47 -47
  329. package/src/store/useMdSidebarStore.ts +34 -34
  330. package/src/store/useModalManager.ts +104 -104
  331. package/src/utils/constants/br-states.ts +29 -29
  332. package/src/utils/countries.ts +224 -224
  333. package/src/utils/safeServerAction.ts +21 -21
  334. package/src/utils/withAction.ts +13 -13
@@ -1,29 +1,29 @@
1
- 'use client';
2
-
3
- import { ComponentType } from 'react';
4
- import { useModalManager } from '../../store/useModalManager';
5
-
6
- interface ModalManagerProps {
7
- registry: Record<string, ComponentType>;
8
- }
9
-
10
- export function ModalManager({ registry }: ModalManagerProps) {
11
- const { modalStack } = useModalManager();
12
-
13
- if (modalStack.length === 0) return null;
14
-
15
- return (
16
- <>
17
- {modalStack.map((modal) => {
18
- const ModalComponent = registry[modal.key];
19
-
20
- if (!ModalComponent) {
21
- console.warn(`Modal "${modal.key}" not found in registry`);
22
- return null;
23
- }
24
-
25
- return <ModalComponent key={modal.key} />;
26
- })}
27
- </>
28
- );
29
- }
1
+ 'use client';
2
+
3
+ import { ComponentType } from 'react';
4
+ import { useModalManager } from '../../store/useModalManager';
5
+
6
+ interface ModalManagerProps {
7
+ registry: Record<string, ComponentType>;
8
+ }
9
+
10
+ export function ModalManager({ registry }: ModalManagerProps) {
11
+ const { modalStack } = useModalManager();
12
+
13
+ if (modalStack.length === 0) return null;
14
+
15
+ return (
16
+ <>
17
+ {modalStack.map((modal) => {
18
+ const ModalComponent = registry[modal.key];
19
+
20
+ if (!ModalComponent) {
21
+ console.warn(`Modal "${modal.key}" not found in registry`);
22
+ return null;
23
+ }
24
+
25
+ return <ModalComponent key={modal.key} />;
26
+ })}
27
+ </>
28
+ );
29
+ }
@@ -1,26 +1,26 @@
1
- 'use client';
2
-
3
- import { ComponentType, useEffect } from 'react';
4
- import AccountModals from '../account/AccountModals';
5
- import { ModalManager } from './ModalManager';
6
- import { useAccountModals } from '../../store/useAccountModals';
7
- interface ModalsProps {
8
- registry: Record<string, ComponentType>;
9
- hasActiveSubscription?: boolean;
10
- onGoToSubscription?: () => void;
11
- }
12
-
13
- export function Modals({ registry, hasActiveSubscription, onGoToSubscription }: ModalsProps) {
14
- const { updateConfig } = useAccountModals();
15
-
16
- useEffect(() => {
17
- updateConfig({ hasActiveSubscription, onGoToSubscription });
18
- }, [hasActiveSubscription, onGoToSubscription, updateConfig]);
19
-
20
- return (
21
- <>
22
- <AccountModals />
23
- <ModalManager registry={registry} />
24
- </>
25
- );
26
- }
1
+ 'use client';
2
+
3
+ import { ComponentType, useEffect } from 'react';
4
+ import AccountModals from '../account/AccountModals';
5
+ import { ModalManager } from './ModalManager';
6
+ import { useAccountModals } from '../../store/useAccountModals';
7
+ interface ModalsProps {
8
+ registry: Record<string, ComponentType>;
9
+ hasActiveSubscription?: boolean;
10
+ onGoToSubscription?: () => void;
11
+ }
12
+
13
+ export function Modals({ registry, hasActiveSubscription, onGoToSubscription }: ModalsProps) {
14
+ const { updateConfig } = useAccountModals();
15
+
16
+ useEffect(() => {
17
+ updateConfig({ hasActiveSubscription, onGoToSubscription });
18
+ }, [hasActiveSubscription, onGoToSubscription, updateConfig]);
19
+
20
+ return (
21
+ <>
22
+ <AccountModals />
23
+ <ModalManager registry={registry} />
24
+ </>
25
+ );
26
+ }
@@ -1,260 +1,260 @@
1
- 'use client';
2
-
3
- import { useCallback, useState } from 'react';
4
- import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
5
- import { Button } from '../../ui/buttons/Button';
6
- import { Toast } from '../../ui/feedback/Toast';
7
- import { useModalManager } from '../../../store/useModalManager';
8
- import { useCreateCard } from '../../../modules/cards/hooks/create-card.hook';
9
- import { useUpdateAccount } from '../../../modules/accounts/hooks/useAccountManagement';
10
- import { CardFormFields, BillingFormFields, cardFormSchema } from './CardFormFields';
11
- import type { CardFormData, StripeElementsStatus } from './CardFormFields';
12
- import { IconX } from '@tabler/icons-react';
13
- import { useForm } from 'react-hook-form';
14
- import { zodResolver } from '@hookform/resolvers/zod';
15
- import { CardNumberElement, useElements, useStripe } from '@stripe/react-stripe-js';
16
- import { toast } from 'sonner';
17
-
18
- const INITIAL_STRIPE_STATUS: StripeElementsStatus = {
19
- cardNumber: false,
20
- cardExpiry: false,
21
- cardCvc: false,
22
- };
23
-
24
- export default function AddCardModal() {
25
- const { activeModal, modalData, closeModal } = useModalManager();
26
- const isOpen = activeModal === 'addCardModal';
27
- const [currentStep, setCurrentStep] = useState(1);
28
- const [stripeStatus, setStripeStatus] = useState<StripeElementsStatus>(INITIAL_STRIPE_STATUS);
29
- const [stripeErrors, setStripeErrors] = useState<Record<string, string | undefined>>({});
30
-
31
- const onCardAdded = modalData.onCardAdded as ((cardId: string) => void) | undefined;
32
-
33
- const createCardMutation = useCreateCard();
34
- const updateAccountMutation = useUpdateAccount();
35
- const elements = useElements();
36
- const stripe = useStripe();
37
-
38
- const form = useForm<CardFormData>({
39
- resolver: zodResolver(cardFormSchema),
40
- mode: 'onSubmit',
41
- reValidateMode: 'onChange',
42
- defaultValues: {
43
- country: 'BR',
44
- personType: 'pf',
45
- },
46
- });
47
-
48
- const handleClose = useCallback(() => {
49
- form.reset();
50
- setCurrentStep(1);
51
- setStripeStatus(INITIAL_STRIPE_STATUS);
52
- setStripeErrors({});
53
- closeModal();
54
- }, [form, closeModal]);
55
-
56
- const handleStripeChange = useCallback(
57
- (field: keyof StripeElementsStatus, complete: boolean) => {
58
- setStripeStatus((prev) => ({ ...prev, [field]: complete }));
59
- if (complete) {
60
- setStripeErrors((prev) => ({ ...prev, [field]: undefined }));
61
- }
62
- },
63
- []
64
- );
65
-
66
- const handleContinue = useCallback(async () => {
67
- const rhfValid = await form.trigger(['name', 'country', 'personType', 'cpf', 'cnpj']);
68
-
69
- const newStripeErrors: Record<string, string | undefined> = {};
70
- if (!stripeStatus.cardNumber) newStripeErrors.cardNumber = 'Número do cartão é obrigatório';
71
- if (!stripeStatus.cardExpiry) newStripeErrors.cardExpiry = 'Data de validade é obrigatória';
72
- if (!stripeStatus.cardCvc) newStripeErrors.cardCvc = 'Código de segurança é obrigatório';
73
- setStripeErrors(newStripeErrors);
74
-
75
- const stripeValid = stripeStatus.cardNumber && stripeStatus.cardExpiry && stripeStatus.cardCvc;
76
-
77
- if (rhfValid && stripeValid) {
78
- form.clearErrors(['fullName', 'cep', 'street', 'streetNumber', 'city', 'state']);
79
- setCurrentStep(2);
80
- }
81
- }, [form, stripeStatus]);
82
-
83
- const handleBack = useCallback(() => {
84
- setCurrentStep(1);
85
- }, []);
86
-
87
- async function handleSubmit(data: CardFormData) {
88
- if (!stripe || !elements) return;
89
-
90
- const cardElement = elements.getElement(CardNumberElement);
91
- if (!cardElement) return;
92
-
93
- const { error, paymentMethod } = await stripe.createPaymentMethod({
94
- type: 'card',
95
- card: cardElement,
96
- billing_details: {
97
- name: data.fullName,
98
- address: {
99
- country: data.country,
100
- postal_code: data.cep,
101
- line1: `${data.street}, ${data.streetNumber}`,
102
- line2: data.complement || undefined,
103
- city: data.city,
104
- state: data.state,
105
- },
106
- },
107
- });
108
-
109
- if (error) {
110
- toast.custom(
111
- (t) => (
112
- <Toast
113
- variant="error"
114
- message="Não foi possível adicionar o cartão na Stripe, tente novamente."
115
- toastId={t}
116
- />
117
- ),
118
- { duration: 5000 }
119
- );
120
- return;
121
- }
122
-
123
- try {
124
- const [cardResult] = await Promise.all([
125
- createCardMutation.mutateAsync({ payment_method_id: paymentMethod.id }),
126
- updateAccountMutation.mutateAsync({
127
- financial_document_type: data.personType === 'pf' ? 1 : 2,
128
- financial_document: data.personType === 'pf' ? data.cpf : data.cnpj,
129
- financial_name: data.fullName,
130
- zipcode: data.cep,
131
- address: data.street,
132
- address_number: data.streetNumber,
133
- address_complement: data.complement || '',
134
- city: data.city,
135
- state: data.state,
136
- }),
137
- ]);
138
-
139
- if (cardResult.success && cardResult.data?.id != null) {
140
- onCardAdded?.(cardResult.data.id.toString());
141
- }
142
-
143
- toast.custom(
144
- (t) => <Toast variant="success" message="Cartão adicionado com sucesso." toastId={t} />,
145
- { duration: 5000 }
146
- );
147
- handleClose();
148
- } catch {
149
- toast.custom(
150
- (t) => (
151
- <Toast
152
- variant="error"
153
- message="Não foi possível salvar o seu novo cartão, tente novamente."
154
- toastId={t}
155
- />
156
- ),
157
- { duration: 5000 }
158
- );
159
- }
160
- }
161
-
162
- const isSubmitting =
163
- createCardMutation.isPending ||
164
- updateAccountMutation.isPending ||
165
- form.formState.isSubmitting;
166
-
167
- const watchedValues = form.watch(['name', 'country', 'personType', 'cpf', 'cnpj', 'fullName', 'cep', 'street', 'streetNumber', 'city', 'state']);
168
- const [name, country, personType, cpf, cnpj, fullName, cep, street, streetNumber, city, state] = watchedValues;
169
- const isStep1Valid =
170
- !!name &&
171
- !!country &&
172
- !!personType &&
173
- (personType === 'pf' ? !!cpf && cpf.length >= 14 : !!cnpj && cnpj.length >= 18) &&
174
- stripeStatus.cardNumber &&
175
- stripeStatus.cardExpiry &&
176
- stripeStatus.cardCvc;
177
- const isStep2Valid =
178
- !!fullName &&
179
- !!cep && cep.length >= 9 &&
180
- !!street &&
181
- !!streetNumber &&
182
- !!city &&
183
- !!state;
184
-
185
- return (
186
- <Dialog open={isOpen} onOpenChange={handleClose}>
187
- <DialogContent
188
- showCloseButton={false}
189
- className="flex flex-col p-0 gap-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-[470px] lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-y-auto"
190
- >
191
- <DialogHeader className="p-0">
192
- <div className="flex items-center justify-center px-4 py-3 relative border-b border-zinc-200 lg:border-b-0">
193
- <DialogTitle className="paragraph-medium-semibold text-zinc-950 text-center">
194
- {currentStep === 1 ? 'Adicionar cartão' : 'Dados de cobrança'}
195
- </DialogTitle>
196
- <Button
197
- type="button"
198
- variant="ghost"
199
- className="size-8! p-0 absolute right-4"
200
- onClick={handleClose}
201
- >
202
- <IconX size={18} />
203
- </Button>
204
- </div>
205
- </DialogHeader>
206
-
207
- {/* Progress bar */}
208
- <div className="h-1 bg-zinc-100 w-full">
209
- <div
210
- className="h-full bg-cyan-400 transition-all duration-300 ease-in-out"
211
- style={{ width: currentStep === 1 ? '50%' : '100%' }}
212
- />
213
- </div>
214
-
215
- <form
216
- onSubmit={form.handleSubmit(handleSubmit)}
217
- className="flex flex-col flex-1 lg:flex-none"
218
- >
219
- <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 1 ? 'hidden' : ''}`}>
220
- <CardFormFields
221
- form={form}
222
- onStripeChange={handleStripeChange}
223
- stripeErrors={stripeErrors}
224
- />
225
- </div>
226
- <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 2 ? 'hidden' : ''}`}>
227
- <BillingFormFields form={form} />
228
- </div>
229
-
230
- <div className="flex justify-between items-center p-4 lg:p-5 border-t border-zinc-200 gap-2 mt-auto lg:mt-0">
231
- {currentStep === 1 ? (
232
- <>
233
- <Button variant="secondary" type="button" onClick={handleClose} className="h-10!">
234
- Cancelar
235
- </Button>
236
- <Button
237
- type="button"
238
- className="h-10!"
239
- onClick={handleContinue}
240
- disabled={!isStep1Valid}
241
- >
242
- Continuar
243
- </Button>
244
- </>
245
- ) : (
246
- <>
247
- <Button variant="secondary" type="button" onClick={handleBack} className="h-10!">
248
- Voltar
249
- </Button>
250
- <Button type="submit" className="h-10!" disabled={isSubmitting || !isStep2Valid}>
251
- {isSubmitting ? 'Adicionando cartão...' : 'Adicionar cartão'}
252
- </Button>
253
- </>
254
- )}
255
- </div>
256
- </form>
257
- </DialogContent>
258
- </Dialog>
259
- );
260
- }
1
+ 'use client';
2
+
3
+ import { useCallback, useState } from 'react';
4
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
5
+ import { Button } from '../../ui/buttons/Button';
6
+ import { Toast } from '../../ui/feedback/Toast';
7
+ import { useModalManager } from '../../../store/useModalManager';
8
+ import { useCreateCard } from '../../../modules/cards/hooks/create-card.hook';
9
+ import { useUpdateAccount } from '../../../modules/accounts/hooks/useAccountManagement';
10
+ import { CardFormFields, BillingFormFields, cardFormSchema } from './CardFormFields';
11
+ import type { CardFormData, StripeElementsStatus } from './CardFormFields';
12
+ import { IconX } from '@tabler/icons-react';
13
+ import { useForm } from 'react-hook-form';
14
+ import { zodResolver } from '@hookform/resolvers/zod';
15
+ import { CardNumberElement, useElements, useStripe } from '@stripe/react-stripe-js';
16
+ import { toast } from 'sonner';
17
+
18
+ const INITIAL_STRIPE_STATUS: StripeElementsStatus = {
19
+ cardNumber: false,
20
+ cardExpiry: false,
21
+ cardCvc: false,
22
+ };
23
+
24
+ export default function AddCardModal() {
25
+ const { activeModal, modalData, closeModal } = useModalManager();
26
+ const isOpen = activeModal === 'addCardModal';
27
+ const [currentStep, setCurrentStep] = useState(1);
28
+ const [stripeStatus, setStripeStatus] = useState<StripeElementsStatus>(INITIAL_STRIPE_STATUS);
29
+ const [stripeErrors, setStripeErrors] = useState<Record<string, string | undefined>>({});
30
+
31
+ const onCardAdded = modalData.onCardAdded as ((cardId: string) => void) | undefined;
32
+
33
+ const createCardMutation = useCreateCard();
34
+ const updateAccountMutation = useUpdateAccount();
35
+ const elements = useElements();
36
+ const stripe = useStripe();
37
+
38
+ const form = useForm<CardFormData>({
39
+ resolver: zodResolver(cardFormSchema),
40
+ mode: 'onSubmit',
41
+ reValidateMode: 'onChange',
42
+ defaultValues: {
43
+ country: 'BR',
44
+ personType: 'pf',
45
+ },
46
+ });
47
+
48
+ const handleClose = useCallback(() => {
49
+ form.reset();
50
+ setCurrentStep(1);
51
+ setStripeStatus(INITIAL_STRIPE_STATUS);
52
+ setStripeErrors({});
53
+ closeModal();
54
+ }, [form, closeModal]);
55
+
56
+ const handleStripeChange = useCallback(
57
+ (field: keyof StripeElementsStatus, complete: boolean) => {
58
+ setStripeStatus((prev) => ({ ...prev, [field]: complete }));
59
+ if (complete) {
60
+ setStripeErrors((prev) => ({ ...prev, [field]: undefined }));
61
+ }
62
+ },
63
+ []
64
+ );
65
+
66
+ const handleContinue = useCallback(async () => {
67
+ const rhfValid = await form.trigger(['name', 'country', 'personType', 'cpf', 'cnpj']);
68
+
69
+ const newStripeErrors: Record<string, string | undefined> = {};
70
+ if (!stripeStatus.cardNumber) newStripeErrors.cardNumber = 'Número do cartão é obrigatório';
71
+ if (!stripeStatus.cardExpiry) newStripeErrors.cardExpiry = 'Data de validade é obrigatória';
72
+ if (!stripeStatus.cardCvc) newStripeErrors.cardCvc = 'Código de segurança é obrigatório';
73
+ setStripeErrors(newStripeErrors);
74
+
75
+ const stripeValid = stripeStatus.cardNumber && stripeStatus.cardExpiry && stripeStatus.cardCvc;
76
+
77
+ if (rhfValid && stripeValid) {
78
+ form.clearErrors(['fullName', 'cep', 'street', 'streetNumber', 'city', 'state']);
79
+ setCurrentStep(2);
80
+ }
81
+ }, [form, stripeStatus]);
82
+
83
+ const handleBack = useCallback(() => {
84
+ setCurrentStep(1);
85
+ }, []);
86
+
87
+ async function handleSubmit(data: CardFormData) {
88
+ if (!stripe || !elements) return;
89
+
90
+ const cardElement = elements.getElement(CardNumberElement);
91
+ if (!cardElement) return;
92
+
93
+ const { error, paymentMethod } = await stripe.createPaymentMethod({
94
+ type: 'card',
95
+ card: cardElement,
96
+ billing_details: {
97
+ name: data.fullName,
98
+ address: {
99
+ country: data.country,
100
+ postal_code: data.cep,
101
+ line1: `${data.street}, ${data.streetNumber}`,
102
+ line2: data.complement || undefined,
103
+ city: data.city,
104
+ state: data.state,
105
+ },
106
+ },
107
+ });
108
+
109
+ if (error) {
110
+ toast.custom(
111
+ (t) => (
112
+ <Toast
113
+ variant="error"
114
+ message="Não foi possível adicionar o cartão na Stripe, tente novamente."
115
+ toastId={t}
116
+ />
117
+ ),
118
+ { duration: 5000 }
119
+ );
120
+ return;
121
+ }
122
+
123
+ try {
124
+ const [cardResult] = await Promise.all([
125
+ createCardMutation.mutateAsync({ payment_method_id: paymentMethod.id }),
126
+ updateAccountMutation.mutateAsync({
127
+ financial_document_type: data.personType === 'pf' ? 1 : 2,
128
+ financial_document: data.personType === 'pf' ? data.cpf : data.cnpj,
129
+ financial_name: data.fullName,
130
+ zipcode: data.cep,
131
+ address: data.street,
132
+ address_number: data.streetNumber,
133
+ address_complement: data.complement || '',
134
+ city: data.city,
135
+ state: data.state,
136
+ }),
137
+ ]);
138
+
139
+ if (cardResult.success && cardResult.data?.id != null) {
140
+ onCardAdded?.(cardResult.data.id.toString());
141
+ }
142
+
143
+ toast.custom(
144
+ (t) => <Toast variant="success" message="Cartão adicionado com sucesso." toastId={t} />,
145
+ { duration: 5000 }
146
+ );
147
+ handleClose();
148
+ } catch {
149
+ toast.custom(
150
+ (t) => (
151
+ <Toast
152
+ variant="error"
153
+ message="Não foi possível salvar o seu novo cartão, tente novamente."
154
+ toastId={t}
155
+ />
156
+ ),
157
+ { duration: 5000 }
158
+ );
159
+ }
160
+ }
161
+
162
+ const isSubmitting =
163
+ createCardMutation.isPending ||
164
+ updateAccountMutation.isPending ||
165
+ form.formState.isSubmitting;
166
+
167
+ const watchedValues = form.watch(['name', 'country', 'personType', 'cpf', 'cnpj', 'fullName', 'cep', 'street', 'streetNumber', 'city', 'state']);
168
+ const [name, country, personType, cpf, cnpj, fullName, cep, street, streetNumber, city, state] = watchedValues;
169
+ const isStep1Valid =
170
+ !!name &&
171
+ !!country &&
172
+ !!personType &&
173
+ (personType === 'pf' ? !!cpf && cpf.length >= 14 : !!cnpj && cnpj.length >= 18) &&
174
+ stripeStatus.cardNumber &&
175
+ stripeStatus.cardExpiry &&
176
+ stripeStatus.cardCvc;
177
+ const isStep2Valid =
178
+ !!fullName &&
179
+ !!cep && cep.length >= 9 &&
180
+ !!street &&
181
+ !!streetNumber &&
182
+ !!city &&
183
+ !!state;
184
+
185
+ return (
186
+ <Dialog open={isOpen} onOpenChange={handleClose}>
187
+ <DialogContent
188
+ showCloseButton={false}
189
+ className="flex flex-col p-0 gap-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-[470px] lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-y-auto"
190
+ >
191
+ <DialogHeader className="p-0">
192
+ <div className="flex items-center justify-center px-4 py-3 relative border-b border-zinc-200 lg:border-b-0">
193
+ <DialogTitle className="paragraph-medium-semibold text-zinc-950 text-center">
194
+ {currentStep === 1 ? 'Adicionar cartão' : 'Dados de cobrança'}
195
+ </DialogTitle>
196
+ <Button
197
+ type="button"
198
+ variant="ghost"
199
+ className="size-8! p-0 absolute right-4"
200
+ onClick={handleClose}
201
+ >
202
+ <IconX size={18} />
203
+ </Button>
204
+ </div>
205
+ </DialogHeader>
206
+
207
+ {/* Progress bar */}
208
+ <div className="h-1 bg-zinc-100 w-full">
209
+ <div
210
+ className="h-full bg-cyan-400 transition-all duration-300 ease-in-out"
211
+ style={{ width: currentStep === 1 ? '50%' : '100%' }}
212
+ />
213
+ </div>
214
+
215
+ <form
216
+ onSubmit={form.handleSubmit(handleSubmit)}
217
+ className="flex flex-col flex-1 lg:flex-none"
218
+ >
219
+ <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 1 ? 'hidden' : ''}`}>
220
+ <CardFormFields
221
+ form={form}
222
+ onStripeChange={handleStripeChange}
223
+ stripeErrors={stripeErrors}
224
+ />
225
+ </div>
226
+ <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 2 ? 'hidden' : ''}`}>
227
+ <BillingFormFields form={form} />
228
+ </div>
229
+
230
+ <div className="flex justify-between items-center p-4 lg:p-5 border-t border-zinc-200 gap-2 mt-auto lg:mt-0">
231
+ {currentStep === 1 ? (
232
+ <>
233
+ <Button variant="secondary" type="button" onClick={handleClose} className="h-10!">
234
+ Cancelar
235
+ </Button>
236
+ <Button
237
+ type="button"
238
+ className="h-10!"
239
+ onClick={handleContinue}
240
+ disabled={!isStep1Valid}
241
+ >
242
+ Continuar
243
+ </Button>
244
+ </>
245
+ ) : (
246
+ <>
247
+ <Button variant="secondary" type="button" onClick={handleBack} className="h-10!">
248
+ Voltar
249
+ </Button>
250
+ <Button type="submit" className="h-10!" disabled={isSubmitting || !isStep2Valid}>
251
+ {isSubmitting ? 'Adicionando cartão...' : 'Adicionar cartão'}
252
+ </Button>
253
+ </>
254
+ )}
255
+ </div>
256
+ </form>
257
+ </DialogContent>
258
+ </Dialog>
259
+ );
260
+ }