@greatapps/common 1.1.430 → 1.1.432

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 (316) 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/embeds/CrispEmbed.mjs.map +1 -1
  18. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  19. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  20. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  21. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  22. package/dist/components/layouts/NavBar.mjs.map +1 -1
  23. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  24. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  25. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  26. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  27. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  28. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  29. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  30. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  31. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  32. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  33. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  34. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  35. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  36. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  37. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  38. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  39. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  40. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  41. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  42. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  43. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  44. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  45. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  46. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  47. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  48. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  49. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  50. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  51. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  52. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  53. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  54. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  55. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  56. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  57. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  58. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  59. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  60. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  61. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  62. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  63. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  64. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  65. package/dist/components/ui/form/FormField.mjs.map +1 -1
  66. package/dist/components/ui/form/Input.mjs.map +1 -1
  67. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  68. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  69. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  70. package/dist/components/ui/form/Select.mjs +1 -1
  71. package/dist/components/ui/form/Select.mjs.map +1 -1
  72. package/dist/components/ui/form/Switch.mjs.map +1 -1
  73. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  74. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  75. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  76. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  77. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  78. package/dist/components/ui/overlay/Tooltip.mjs +1 -1
  79. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  80. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  81. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  82. package/dist/index.mjs.map +1 -1
  83. package/dist/infra/utils/date.mjs.map +1 -1
  84. package/dist/middleware.mjs.map +1 -1
  85. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  86. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  87. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  88. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  89. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  90. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  91. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  92. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  93. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  94. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  95. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  96. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  97. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  98. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  99. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  100. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  101. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  102. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  103. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  104. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  105. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  106. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  107. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  108. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  109. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  110. package/dist/modules/cards/types.mjs.map +1 -1
  111. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  112. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  113. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  114. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  115. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  116. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  117. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  118. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  119. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  120. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  121. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  122. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  123. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  124. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  125. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  126. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  127. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  128. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  129. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  130. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  131. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  132. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  133. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  134. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  135. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  136. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  137. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  138. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  139. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  140. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  141. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  142. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  143. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  144. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  145. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  146. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  147. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  148. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  149. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  150. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  151. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  152. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  153. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  154. package/dist/utils/constants/br-states.mjs.map +1 -1
  155. package/dist/utils/countries.mjs.map +1 -1
  156. package/dist/utils/safeServerAction.mjs.map +1 -1
  157. package/dist/utils/withAction.mjs.map +1 -1
  158. package/package.json +89 -89
  159. package/src/components/account/ConfigurationsMyAccountModal.tsx +146 -146
  160. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  161. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  162. package/src/components/account/DeleteAccountModal.tsx +130 -130
  163. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  164. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  165. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  166. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  167. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  168. package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
  169. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  170. package/src/components/account/sections/ChangePhoneModal.tsx +245 -245
  171. package/src/components/account/sections/MyProfileSection.tsx +327 -327
  172. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  173. package/src/components/account/sections/SecuritySection.tsx +46 -46
  174. package/src/components/embeds/CrispEmbed.tsx +101 -101
  175. package/src/components/embeds/FrillEmbed.tsx +119 -119
  176. package/src/components/layouts/AppMobileNavBar.tsx +76 -76
  177. package/src/components/layouts/AppNavBar.tsx +46 -46
  178. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  179. package/src/components/layouts/NavBar.tsx +172 -172
  180. package/src/components/layouts/NotificationsPopover.tsx +115 -115
  181. package/src/components/layouts/ProfilePopover.tsx +174 -174
  182. package/src/components/layouts/SideBarNavigation.tsx +62 -62
  183. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  184. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  185. package/src/components/modals/BuyCreditsModal.tsx +314 -314
  186. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  187. package/src/components/modals/cards/AddCardModal.tsx +260 -260
  188. package/src/components/modals/cards/CardFormFields.tsx +294 -294
  189. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  190. package/src/components/navigation/NavItemsContext.ts +20 -20
  191. package/src/components/navigation/ProjectSelectorPopover.tsx +177 -177
  192. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  193. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  194. package/src/components/navigation/subcomponents/ProjectSelector.tsx +169 -169
  195. package/src/components/pages/NotFoundPage.tsx +67 -67
  196. package/src/components/pages/notifications/Notifications.tsx +170 -170
  197. package/src/components/ui/buttons/Button.tsx +57 -57
  198. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  199. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  200. package/src/components/ui/data-display/Accordion.tsx +81 -81
  201. package/src/components/ui/data-display/Badge.tsx +47 -47
  202. package/src/components/ui/data-display/Card.tsx +93 -93
  203. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  204. package/src/components/ui/data-display/CardItem.tsx +75 -75
  205. package/src/components/ui/data-display/Pagination.tsx +126 -126
  206. package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
  207. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  208. package/src/components/ui/data-display/Separator.tsx +29 -29
  209. package/src/components/ui/data-display/Table.tsx +117 -117
  210. package/src/components/ui/data-display/Tabs.tsx +67 -67
  211. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  212. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  213. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  214. package/src/components/ui/feedback/Progress.tsx +40 -40
  215. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  216. package/src/components/ui/feedback/Toast.tsx +101 -101
  217. package/src/components/ui/form/Calendar.tsx +228 -228
  218. package/src/components/ui/form/Checkbox.tsx +31 -31
  219. package/src/components/ui/form/ComboboxField.tsx +154 -154
  220. package/src/components/ui/form/DatePicker.tsx +97 -97
  221. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  222. package/src/components/ui/form/FormField.tsx +131 -131
  223. package/src/components/ui/form/Input.tsx +20 -20
  224. package/src/components/ui/form/InputOtp.tsx +80 -80
  225. package/src/components/ui/form/PhoneInput.tsx +208 -208
  226. package/src/components/ui/form/RadioGroup.tsx +45 -45
  227. package/src/components/ui/form/Select.tsx +200 -200
  228. package/src/components/ui/form/Switch.tsx +32 -32
  229. package/src/components/ui/form/Textarea.tsx +19 -19
  230. package/src/components/ui/overlay/Command.tsx +185 -185
  231. package/src/components/ui/overlay/Dialog.tsx +151 -151
  232. package/src/components/ui/overlay/Popover.tsx +49 -49
  233. package/src/components/ui/overlay/Sheet.tsx +166 -166
  234. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  235. package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
  236. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  237. package/src/index.ts +393 -393
  238. package/src/infra/utils/date.ts +7 -7
  239. package/src/middleware.ts +4 -4
  240. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  241. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  242. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  243. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  244. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  245. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  246. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  247. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  248. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  249. package/src/modules/accounts/services/account.service.ts +239 -239
  250. package/src/modules/accounts/types.ts +225 -225
  251. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  252. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  253. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  254. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  255. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  256. package/src/modules/auth/types/management-permission.type.ts +7 -7
  257. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  258. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  259. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  260. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  261. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  262. package/src/modules/cards/actions/create-card.action.ts +9 -9
  263. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  264. package/src/modules/cards/hooks/cards.hook.ts +14 -14
  265. package/src/modules/cards/hooks/create-card.hook.ts +18 -18
  266. package/src/modules/cards/services/cards.service.ts +51 -51
  267. package/src/modules/cards/types.ts +32 -32
  268. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  269. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  270. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  271. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
  272. package/src/modules/plans/services/plans.service.ts +36 -36
  273. package/src/modules/plans/types/plan.type.ts +21 -21
  274. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  275. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  276. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  277. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  278. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  279. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  280. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  281. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  282. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  283. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  284. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  285. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  286. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  287. package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
  288. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  289. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +15 -15
  290. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
  291. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
  292. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  293. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  294. package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
  295. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  296. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  297. package/src/modules/subscriptions/utils/periodicity.ts +52 -52
  298. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  299. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  300. package/src/modules/users/action/list-messages.action.ts +12 -12
  301. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  302. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  303. package/src/modules/users/hooks/messages.hook.ts +60 -60
  304. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  305. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  306. package/src/modules/whitelabel/schema.ts +84 -84
  307. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  308. package/src/providers/whitelabel.provider.tsx +54 -54
  309. package/src/store/useBuyCreditsModal.ts +21 -21
  310. package/src/store/useDesktopSidebarStore.ts +47 -47
  311. package/src/store/useMdSidebarStore.ts +34 -34
  312. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  313. package/src/utils/constants/br-states.ts +29 -29
  314. package/src/utils/countries.ts +224 -224
  315. package/src/utils/safeServerAction.ts +21 -21
  316. package/src/utils/withAction.ts +13 -13
@@ -1,57 +1,57 @@
1
- "use client";
2
-
3
- import { IconLock } from '@tabler/icons-react';
4
- import { Button } from '../ui/buttons/Button';
5
- import {
6
- Dialog,
7
- DialogContent,
8
- DialogDescription,
9
- DialogHeader,
10
- DialogTitle,
11
- } from '../ui/overlay/Dialog';
12
- import { useWhitelabelUrls } from '../../providers/whitelabel.provider';
13
- import { useModalManager } from '../../store/useModalManager';
14
- import type { ModalData } from '../../store/useModalManager';
15
-
16
- export default function PaidPlanRequiredModal() {
17
- const { activeModal, modalData, closeModal } = useModalManager();
18
- const isOpen = activeModal === 'paidPlanRequiredModal';
19
- const data = modalData as ModalData & { title?: string; description?: string };
20
- const { accountsUrl } = useWhitelabelUrls();
21
-
22
- const title = (data.title as string) ?? "Recurso disponível em planos pagos";
23
- const description = (data.description as string) ?? "Para acessar este recurso, faça upgrade para um plano pago";
24
-
25
- const handleKnowPlans = () => {
26
- closeModal();
27
- window.open(`${accountsUrl}/subscriptions?tab=plans`, '_blank');
28
- };
29
-
30
- return (
31
- <Dialog open={isOpen} onOpenChange={() => closeModal()}>
32
- <DialogContent className="flex flex-col p-0 gap-0 w-full md:w-[410px] lg:w-[410px]">
33
- <DialogHeader className="gap-3 text-left p-5">
34
- <div className="flex items-center justify-center w-10 h-10 bg-zinc-50 rounded-lg">
35
- <IconLock size={24} className="text-zinc-950" />
36
- </div>
37
- <div className="flex flex-col gap-2">
38
- <DialogTitle className="paragraph-medium-semibold text-zinc-950">
39
- {title}
40
- </DialogTitle>
41
- <DialogDescription className="paragraph-small-regular text-zinc-600">
42
- {description}
43
- </DialogDescription>
44
- </div>
45
- </DialogHeader>
46
- <div className="flex items-center gap-2 p-5 border-t border-zinc-200">
47
- <Button
48
- className="w-fit h-10!"
49
- onClick={handleKnowPlans}
50
- >
51
- Conhecer planos
52
- </Button>
53
- </div>
54
- </DialogContent>
55
- </Dialog>
56
- );
57
- }
1
+ "use client";
2
+
3
+ import { IconLock } from '@tabler/icons-react';
4
+ import { Button } from '../ui/buttons/Button';
5
+ import {
6
+ Dialog,
7
+ DialogContent,
8
+ DialogDescription,
9
+ DialogHeader,
10
+ DialogTitle,
11
+ } from '../ui/overlay/Dialog';
12
+ import { useWhitelabelUrls } from '../../providers/whitelabel.provider';
13
+ import { useModalManager } from '../../store/useModalManager';
14
+ import type { ModalData } from '../../store/useModalManager';
15
+
16
+ export default function PaidPlanRequiredModal() {
17
+ const { activeModal, modalData, closeModal } = useModalManager();
18
+ const isOpen = activeModal === 'paidPlanRequiredModal';
19
+ const data = modalData as ModalData & { title?: string; description?: string };
20
+ const { accountsUrl } = useWhitelabelUrls();
21
+
22
+ const title = (data.title as string) ?? "Recurso disponível em planos pagos";
23
+ const description = (data.description as string) ?? "Para acessar este recurso, faça upgrade para um plano pago";
24
+
25
+ const handleKnowPlans = () => {
26
+ closeModal();
27
+ window.open(`${accountsUrl}/subscriptions?tab=plans`, '_blank');
28
+ };
29
+
30
+ return (
31
+ <Dialog open={isOpen} onOpenChange={() => closeModal()}>
32
+ <DialogContent className="flex flex-col p-0 gap-0 w-full md:w-[410px] lg:w-[410px]">
33
+ <DialogHeader className="gap-3 text-left p-5">
34
+ <div className="flex items-center justify-center w-10 h-10 bg-zinc-50 rounded-lg">
35
+ <IconLock size={24} className="text-zinc-950" />
36
+ </div>
37
+ <div className="flex flex-col gap-2">
38
+ <DialogTitle className="paragraph-medium-semibold text-zinc-950">
39
+ {title}
40
+ </DialogTitle>
41
+ <DialogDescription className="paragraph-small-regular text-zinc-600">
42
+ {description}
43
+ </DialogDescription>
44
+ </div>
45
+ </DialogHeader>
46
+ <div className="flex items-center gap-2 p-5 border-t border-zinc-200">
47
+ <Button
48
+ className="w-fit h-10!"
49
+ onClick={handleKnowPlans}
50
+ >
51
+ Conhecer planos
52
+ </Button>
53
+ </div>
54
+ </DialogContent>
55
+ </Dialog>
56
+ );
57
+ }
@@ -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
+ }