@greatapps/common 1.1.515 → 1.1.517

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 (408) 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/CrispEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  20. package/dist/components/embeds/FrillEmbed.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/MdSideBarNavigation.mjs.map +1 -1
  24. package/dist/components/layouts/NavBar.mjs.map +1 -1
  25. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  26. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  27. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  28. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  29. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  30. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  31. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  32. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  33. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  34. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  35. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  36. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  37. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  38. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  39. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  40. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  41. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  42. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  43. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  44. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  45. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  46. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  47. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  48. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  49. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  51. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  52. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  53. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  54. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  55. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  56. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  57. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  58. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  59. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  60. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  61. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  62. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  63. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  64. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  65. package/dist/components/ui/form/DatePicker.mjs +2 -2
  66. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  67. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  68. package/dist/components/ui/form/FormField.mjs +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/ImageUpload/ImageCropModal.mjs.map +1 -1
  84. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  85. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  86. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  87. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  88. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  89. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/infra/utils/array.mjs.map +1 -1
  92. package/dist/infra/utils/date.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/get-account-token.action.mjs.map +1 -1
  97. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  98. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  99. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  100. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  101. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  104. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  105. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  106. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  107. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  108. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  109. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  110. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  111. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  112. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  113. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  114. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  115. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  116. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  117. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  118. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  119. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  120. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  121. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  122. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  123. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  124. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  125. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  126. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  127. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  128. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  129. package/dist/modules/cards/types.mjs.map +1 -1
  130. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  131. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  132. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  133. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  134. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  135. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  136. package/dist/modules/images/utils/base64.mjs.map +1 -1
  137. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  138. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  139. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  140. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  141. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  142. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  143. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  144. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  145. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  146. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  147. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  148. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  149. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  150. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  151. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  152. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  157. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  158. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  159. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  160. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  161. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  168. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  169. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  170. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  171. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  172. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  173. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  174. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  175. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  176. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  177. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  178. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  179. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  180. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  181. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  182. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  183. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  184. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  185. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  186. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  187. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  188. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  189. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  190. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  191. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  192. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  193. package/dist/providers/auth.provider.mjs.map +1 -1
  194. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  195. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  196. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  197. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  198. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  199. package/dist/utils/constants/br-states.mjs.map +1 -1
  200. package/dist/utils/countries.mjs.map +1 -1
  201. package/dist/utils/format/currency.mjs.map +1 -1
  202. package/dist/utils/safeServerAction.mjs.map +1 -1
  203. package/dist/utils/withAction.mjs.map +1 -1
  204. package/package.json +92 -92
  205. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  206. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  207. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  208. package/src/components/account/DeleteAccountModal.tsx +130 -130
  209. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  210. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  211. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  212. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  213. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  214. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  215. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  216. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  217. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  218. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  219. package/src/components/account/sections/SecuritySection.tsx +46 -46
  220. package/src/components/account/sections/TokenSection.tsx +64 -64
  221. package/src/components/embeds/CrispEmbed.tsx +156 -156
  222. package/src/components/embeds/EmbedWidgets.tsx +50 -50
  223. package/src/components/embeds/FrillEmbed.tsx +129 -129
  224. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  225. package/src/components/layouts/AppNavBar.tsx +40 -40
  226. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  227. package/src/components/layouts/NavBar.tsx +175 -175
  228. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  229. package/src/components/layouts/ProfilePopover.tsx +176 -176
  230. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  231. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  232. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  233. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  234. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  235. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  236. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  237. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  238. package/src/components/navigation/NavItemsContext.ts +20 -20
  239. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  240. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  241. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  242. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  243. package/src/components/pages/NotFoundPage.tsx +67 -67
  244. package/src/components/pages/notifications/Notifications.tsx +187 -187
  245. package/src/components/ui/buttons/Button.tsx +62 -62
  246. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  247. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  248. package/src/components/ui/data-display/Accordion.tsx +81 -81
  249. package/src/components/ui/data-display/Badge.tsx +47 -47
  250. package/src/components/ui/data-display/Card.tsx +93 -93
  251. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  252. package/src/components/ui/data-display/CardItem.tsx +75 -75
  253. package/src/components/ui/data-display/Pagination.tsx +126 -126
  254. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  255. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  256. package/src/components/ui/data-display/Separator.tsx +29 -29
  257. package/src/components/ui/data-display/Table.tsx +117 -117
  258. package/src/components/ui/data-display/Tabs.tsx +67 -67
  259. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  260. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  261. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  262. package/src/components/ui/feedback/Progress.tsx +40 -40
  263. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  264. package/src/components/ui/feedback/Toast.tsx +104 -104
  265. package/src/components/ui/form/Calendar.tsx +228 -228
  266. package/src/components/ui/form/Checkbox.tsx +31 -31
  267. package/src/components/ui/form/ComboboxField.tsx +154 -154
  268. package/src/components/ui/form/DatePicker.tsx +98 -97
  269. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  270. package/src/components/ui/form/FormField.tsx +133 -131
  271. package/src/components/ui/form/Input.tsx +20 -20
  272. package/src/components/ui/form/InputOtp.tsx +80 -80
  273. package/src/components/ui/form/PhoneInput.tsx +208 -208
  274. package/src/components/ui/form/RadioGroup.tsx +45 -45
  275. package/src/components/ui/form/Select.tsx +200 -200
  276. package/src/components/ui/form/Switch.tsx +32 -32
  277. package/src/components/ui/form/Textarea.tsx +19 -19
  278. package/src/components/ui/overlay/Command.tsx +185 -185
  279. package/src/components/ui/overlay/Dialog.tsx +153 -153
  280. package/src/components/ui/overlay/Popover.tsx +49 -49
  281. package/src/components/ui/overlay/Sheet.tsx +170 -170
  282. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  283. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  284. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  285. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  286. package/src/components/widgets/ImageUpload/index.ts +3 -3
  287. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  288. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  289. package/src/hooks/useAuthQueryKey.ts +32 -32
  290. package/src/index.ts +506 -506
  291. package/src/infra/utils/array.ts +54 -54
  292. package/src/infra/utils/date.ts +18 -18
  293. package/src/middleware.ts +4 -4
  294. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  295. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  296. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  297. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  298. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  299. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  300. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  301. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  302. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  303. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  304. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  305. package/src/modules/accounts/services/account-token.service.ts +52 -52
  306. package/src/modules/accounts/services/account.service.ts +239 -239
  307. package/src/modules/accounts/types.ts +225 -225
  308. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  309. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  310. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  311. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  312. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  313. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  314. package/src/modules/auth/types/management-permission.type.ts +7 -7
  315. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  316. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  317. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  318. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  319. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  320. package/src/modules/cards/actions/create-card.action.ts +9 -9
  321. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  322. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  323. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  324. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  325. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  326. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  327. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  328. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  329. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  330. package/src/modules/cards/services/cards.service.ts +108 -108
  331. package/src/modules/cards/types.ts +42 -42
  332. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  333. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  334. package/src/modules/images/actions/process-image.action.ts +40 -40
  335. package/src/modules/images/constants/image.constants.ts +11 -11
  336. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  337. package/src/modules/images/services/image-processing.service.ts +75 -75
  338. package/src/modules/images/types/image.type.ts +54 -54
  339. package/src/modules/images/utils/base64.ts +26 -26
  340. package/src/modules/images/utils/compress-image.ts +20 -20
  341. package/src/modules/images/utils/crop-image.ts +51 -51
  342. package/src/modules/images/utils/validate-image.ts +71 -71
  343. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  344. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  345. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  346. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  347. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  348. package/src/modules/plans/services/plans.service.ts +133 -133
  349. package/src/modules/plans/types/plan.type.ts +67 -67
  350. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  351. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  352. package/src/modules/projects/actions/create-project.action.ts +9 -9
  353. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  354. package/src/modules/projects/actions/find-project.action.ts +8 -8
  355. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  356. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  357. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  358. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  359. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  360. package/src/modules/projects/actions/update-project.action.ts +9 -9
  361. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  362. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  363. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  364. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  365. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  366. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  367. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  368. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  369. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  370. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  371. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  372. package/src/modules/projects/services/projects.service.ts +144 -144
  373. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  374. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  375. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  376. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  377. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  378. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  379. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  380. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  381. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  382. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  383. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  384. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  385. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  386. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  387. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  388. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  389. package/src/modules/users/action/list-messages.action.ts +26 -26
  390. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  391. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  392. package/src/modules/users/hooks/messages.hook.ts +67 -67
  393. package/src/modules/users/services/messages.service.ts +49 -49
  394. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  395. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  396. package/src/modules/whitelabel/schema.ts +84 -84
  397. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  398. package/src/providers/auth.provider.tsx +162 -162
  399. package/src/providers/whitelabel.provider.tsx +59 -59
  400. package/src/store/useBuyCreditsModal.ts +21 -21
  401. package/src/store/useDesktopSidebarStore.ts +47 -47
  402. package/src/store/useMdSidebarStore.ts +34 -34
  403. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  404. package/src/utils/constants/br-states.ts +29 -29
  405. package/src/utils/countries.ts +224 -224
  406. package/src/utils/format/currency.ts +15 -15
  407. package/src/utils/safeServerAction.ts +21 -21
  408. package/src/utils/withAction.ts +13 -13
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/UsersSelectorPopover.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { IconPlus, IconUser, IconUsers } from '@tabler/icons-react';\nimport { UserAvatar } from \"../ui/data-display/UserAvatar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/overlay/Popover\";\nimport { Button } from \"../ui/buttons/Button\";\nimport {\n Command,\n CommandEmpty,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/overlay/Command\";\nimport { Checkbox } from \"../ui/form/Checkbox\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/overlay/Tooltip\";\nimport { cn } from \"../../infra/utils/clsx\";\nimport { useListProjectUsers } from \"../../modules/projects/hooks/list-project-users.hook\";\nimport { useListAllAccountUsers } from \"../../modules/projects/hooks/list-all-account-users.hook\";\nimport { useAddProjectUser } from \"../../modules/projects/hooks/add-project-user.hook\";\nimport { useRemoveProjectUser } from \"../../modules/projects/hooks/remove-project-user.hook\";\nimport { useWhitelabelUrls } from \"../../providers/whitelabel.provider\";\n\nexport interface UsersSelectorPopoverProps {\n projectId?: number;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n contentClassName?: string;\n}\n\nfunction UserItemSkeleton() {\n return (\n <div className=\"flex items-center justify-between px-2 py-1.5 gap-2\">\n <div className=\"flex items-center gap-2 flex-1\">\n <div className=\"skeleton size-8 rounded-full shrink-0\" />\n <div className=\"skeleton h-3.5 w-28 rounded\" />\n </div>\n <div className=\"skeleton size-4 rounded shrink-0\" />\n </div>\n );\n}\n\nexport function UsersSelectorPopover({\n projectId,\n side,\n align,\n contentClassName,\n}: UsersSelectorPopoverProps) {\n const { accountsUrl } = useWhitelabelUrls();\n const [open, setOpen] = useState(false);\n const [hoveredId, setHoveredId] = useState<number | null>(null);\n const [searchInput, setSearchInput] = useState(\"\");\n const [search, setSearch] = useState(\"\");\n\n const id = projectId ?? 0;\n\n useEffect(() => {\n const timer = setTimeout(() => setSearch(searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput]);\n\n const accountUsers = useListAllAccountUsers(search, id || undefined);\n const projectUsers = useListProjectUsers(id, \"\");\n const addMutation = useAddProjectUser(id);\n const removeMutation = useRemoveProjectUser(id);\n\n const allUsers = accountUsers.data?.pages.flatMap((p) => p.data) ?? [];\n const isLoading = accountUsers.isLoading;\n const isFetchingMore = accountUsers.isFetchingNextPage;\n const totalInProject = projectUsers.data?.pages[0]?.total ?? 0;\n\n const toggleUser = (userId: number, inProject: boolean, removable: boolean) => {\n if (inProject) {\n if (!removable) return;\n removeMutation.mutate(userId);\n } else {\n addMutation.mutate(userId);\n }\n };\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n const target = e.currentTarget;\n const nearBottom =\n target.scrollTop + target.clientHeight >= target.scrollHeight - 50;\n if (!nearBottom) return;\n if (accountUsers.hasNextPage && !accountUsers.isFetchingNextPage) {\n accountUsers.fetchNextPage();\n }\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger className=\"cursor-pointer\">\n <div className=\"flex items-center gap-2 text-gray-950 px-3 py-2 border border-gray-200 rounded-full hover:border-gray-950\">\n <span className=\"paragraph-small-semibold\">{totalInProject}</span>\n <IconUser size={16} />\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className={cn(\n \"absolute right-0 md:right-[-88px] w-[296px] p-0 bg-white rounded-2xl shadow-md border border-gray-200\",\n contentClassName,\n )}\n side={side}\n align={align}\n sideOffset={8}\n >\n <div className=\"flex flex-col p-3 gap-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-small-semibold\">Usuários</span>\n <div className=\"flex items-center gap-1.5\">\n <Button\n variant=\"secondary\"\n className=\"h-8 paragraph-small-semibold text-gray-950\"\n onClick={() => {\n window.location.href = `${accountsUrl}/my-teams?createNew=true`;\n }}\n >\n <IconPlus size={16} />\n Adicionar\n </Button>\n </div>\n </div>\n\n <Command shouldFilter={false} className=\"gap-2\" value=\"\">\n <CommandInput\n placeholder=\"Busque aqui\"\n value={searchInput}\n onValueChange={setSearchInput}\n />\n <CommandList\n className=\"custom-scrollbar paragraph-small-medium text-gray-600 h-[162px]\"\n onScroll={handleScroll}\n >\n {isLoading ? (\n <>\n <UserItemSkeleton />\n <UserItemSkeleton />\n <UserItemSkeleton />\n </>\n ) : allUsers.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4\">\n <IconUsers size={28} className=\"text-gray-300\" />\n <span className=\"paragraph-small-medium text-center text-gray-500\">\n Nenhum usuário encontrado.\n </span>\n </div>\n ) : (\n <>\n <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>\n {allUsers.map((user) => {\n const inProject = user.in_project ?? false;\n const removable =\n inProject &&\n user.profile !== \"owner\" &&\n user.profile !== \"admin\";\n const interactive = !inProject || removable;\n\n return (\n <CommandItem\n key={user.id}\n value={user.name || String(user.id)}\n autoFocus={false}\n onPointerEnter={() => setHoveredId(user.id)}\n onPointerLeave={() => setHoveredId(null)}\n onFocus={() => setHoveredId(user.id)}\n onBlur={() => setHoveredId(null)}\n onSelect={() => toggleUser(user.id, inProject, removable)}\n className={interactive ? \"cursor-pointer\" : \"cursor-default\"}\n >\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <UserAvatar\n photo={user.photo}\n name={user.name ?? undefined}\n size={32}\n />\n <span className=\"truncate\">{user.name}</span>\n </div>\n <Tooltip open={interactive && hoveredId === user.id}>\n <TooltipTrigger asChild>\n <div\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={inProject}\n disabled={!interactive}\n onCheckedChange={() =>\n toggleUser(user.id, inProject, removable)\n }\n className={cn(\n interactive && hoveredId === user.id\n ? \"border-gray-950\"\n : \"\",\n \"disabled:opacity-10\",\n )}\n />\n </div>\n </TooltipTrigger>\n <TooltipContent className=\"z-[1002]\">\n {inProject ? \"Remover do projeto\" : \"Adicionar ao projeto\"}\n </TooltipContent>\n </Tooltip>\n </div>\n </CommandItem>\n );\n })}\n {isFetchingMore && (\n <>\n <UserItemSkeleton />\n <UserItemSkeleton />\n </>\n )}\n </>\n )}\n </CommandList>\n </Command>\n <div className=\"border-t border-gray-200\" />\n <Button\n variant=\"ghost\"\n className=\"h-10! paragraph-small-medium text-gray-600 hover:text-gray-950 hover:bg-zinc-50 w-full justify-center\"\n onClick={() => {\n window.location.href = `${accountsUrl}/my-teams`;\n }}\n >\n Gerenciar equipe\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layouts/UsersSelectorPopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport { IconPlus, IconUser, IconUsers } from '@tabler/icons-react';\r\nimport { UserAvatar } from \"../ui/data-display/UserAvatar\";\r\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/overlay/Popover\";\r\nimport { Button } from \"../ui/buttons/Button\";\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n} from \"../ui/overlay/Command\";\r\nimport { Checkbox } from \"../ui/form/Checkbox\";\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/overlay/Tooltip\";\r\nimport { cn } from \"../../infra/utils/clsx\";\r\nimport { useListProjectUsers } from \"../../modules/projects/hooks/list-project-users.hook\";\r\nimport { useListAllAccountUsers } from \"../../modules/projects/hooks/list-all-account-users.hook\";\r\nimport { useAddProjectUser } from \"../../modules/projects/hooks/add-project-user.hook\";\r\nimport { useRemoveProjectUser } from \"../../modules/projects/hooks/remove-project-user.hook\";\r\nimport { useWhitelabelUrls } from \"../../providers/whitelabel.provider\";\r\n\r\nexport interface UsersSelectorPopoverProps {\r\n projectId?: number;\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n}\r\n\r\nfunction UserItemSkeleton() {\r\n return (\r\n <div className=\"flex items-center justify-between px-2 py-1.5 gap-2\">\r\n <div className=\"flex items-center gap-2 flex-1\">\r\n <div className=\"skeleton size-8 rounded-full shrink-0\" />\r\n <div className=\"skeleton h-3.5 w-28 rounded\" />\r\n </div>\r\n <div className=\"skeleton size-4 rounded shrink-0\" />\r\n </div>\r\n );\r\n}\r\n\r\nexport function UsersSelectorPopover({\r\n projectId,\r\n side,\r\n align,\r\n contentClassName,\r\n}: UsersSelectorPopoverProps) {\r\n const { accountsUrl } = useWhitelabelUrls();\r\n const [open, setOpen] = useState(false);\r\n const [hoveredId, setHoveredId] = useState<number | null>(null);\r\n const [searchInput, setSearchInput] = useState(\"\");\r\n const [search, setSearch] = useState(\"\");\r\n\r\n const id = projectId ?? 0;\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => setSearch(searchInput), 300);\r\n return () => clearTimeout(timer);\r\n }, [searchInput]);\r\n\r\n const accountUsers = useListAllAccountUsers(search, id || undefined);\r\n const projectUsers = useListProjectUsers(id, \"\");\r\n const addMutation = useAddProjectUser(id);\r\n const removeMutation = useRemoveProjectUser(id);\r\n\r\n const allUsers = accountUsers.data?.pages.flatMap((p) => p.data) ?? [];\r\n const isLoading = accountUsers.isLoading;\r\n const isFetchingMore = accountUsers.isFetchingNextPage;\r\n const totalInProject = projectUsers.data?.pages[0]?.total ?? 0;\r\n\r\n const toggleUser = (userId: number, inProject: boolean, removable: boolean) => {\r\n if (inProject) {\r\n if (!removable) return;\r\n removeMutation.mutate(userId);\r\n } else {\r\n addMutation.mutate(userId);\r\n }\r\n };\r\n\r\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\r\n const target = e.currentTarget;\r\n const nearBottom =\r\n target.scrollTop + target.clientHeight >= target.scrollHeight - 50;\r\n if (!nearBottom) return;\r\n if (accountUsers.hasNextPage && !accountUsers.isFetchingNextPage) {\r\n accountUsers.fetchNextPage();\r\n }\r\n };\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger className=\"cursor-pointer\">\r\n <div className=\"flex items-center gap-2 text-gray-950 px-3 py-2 border border-gray-200 rounded-full hover:border-gray-950\">\r\n <span className=\"paragraph-small-semibold\">{totalInProject}</span>\r\n <IconUser size={16} />\r\n </div>\r\n </PopoverTrigger>\r\n\r\n <PopoverContent\r\n className={cn(\r\n \"absolute right-0 md:right-[-88px] w-[296px] p-0 bg-white rounded-2xl shadow-md border border-gray-200\",\r\n contentClassName,\r\n )}\r\n side={side}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <div className=\"flex flex-col p-3 gap-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"paragraph-small-semibold\">Usuários</span>\r\n <div className=\"flex items-center gap-1.5\">\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-8 paragraph-small-semibold text-gray-950\"\r\n onClick={() => {\r\n window.location.href = `${accountsUrl}/my-teams?createNew=true`;\r\n }}\r\n >\r\n <IconPlus size={16} />\r\n Adicionar\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n <Command shouldFilter={false} className=\"gap-2\" value=\"\">\r\n <CommandInput\r\n placeholder=\"Busque aqui\"\r\n value={searchInput}\r\n onValueChange={setSearchInput}\r\n />\r\n <CommandList\r\n className=\"custom-scrollbar paragraph-small-medium text-gray-600 h-[162px]\"\r\n onScroll={handleScroll}\r\n >\r\n {isLoading ? (\r\n <>\r\n <UserItemSkeleton />\r\n <UserItemSkeleton />\r\n <UserItemSkeleton />\r\n </>\r\n ) : allUsers.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4\">\r\n <IconUsers size={28} className=\"text-gray-300\" />\r\n <span className=\"paragraph-small-medium text-center text-gray-500\">\r\n Nenhum usuário encontrado.\r\n </span>\r\n </div>\r\n ) : (\r\n <>\r\n <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>\r\n {allUsers.map((user) => {\r\n const inProject = user.in_project ?? false;\r\n const removable =\r\n inProject &&\r\n user.profile !== \"owner\" &&\r\n user.profile !== \"admin\";\r\n const interactive = !inProject || removable;\r\n\r\n return (\r\n <CommandItem\r\n key={user.id}\r\n value={user.name || String(user.id)}\r\n autoFocus={false}\r\n onPointerEnter={() => setHoveredId(user.id)}\r\n onPointerLeave={() => setHoveredId(null)}\r\n onFocus={() => setHoveredId(user.id)}\r\n onBlur={() => setHoveredId(null)}\r\n onSelect={() => toggleUser(user.id, inProject, removable)}\r\n className={interactive ? \"cursor-pointer\" : \"cursor-default\"}\r\n >\r\n <div className=\"flex items-center justify-between w-full\">\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n <UserAvatar\r\n photo={user.photo}\r\n name={user.name ?? undefined}\r\n size={32}\r\n />\r\n <span className=\"truncate\">{user.name}</span>\r\n </div>\r\n <Tooltip open={interactive && hoveredId === user.id}>\r\n <TooltipTrigger asChild>\r\n <div\r\n onClick={(e) => e.stopPropagation()}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n >\r\n <Checkbox\r\n checked={inProject}\r\n disabled={!interactive}\r\n onCheckedChange={() =>\r\n toggleUser(user.id, inProject, removable)\r\n }\r\n className={cn(\r\n interactive && hoveredId === user.id\r\n ? \"border-gray-950\"\r\n : \"\",\r\n \"disabled:opacity-10\",\r\n )}\r\n />\r\n </div>\r\n </TooltipTrigger>\r\n <TooltipContent className=\"z-[1002]\">\r\n {inProject ? \"Remover do projeto\" : \"Adicionar ao projeto\"}\r\n </TooltipContent>\r\n </Tooltip>\r\n </div>\r\n </CommandItem>\r\n );\r\n })}\r\n {isFetchingMore && (\r\n <>\r\n <UserItemSkeleton />\r\n <UserItemSkeleton />\r\n </>\r\n )}\r\n </>\r\n )}\r\n </CommandList>\r\n </Command>\r\n <div className=\"border-t border-gray-200\" />\r\n <Button\r\n variant=\"ghost\"\r\n className=\"h-10! paragraph-small-medium text-gray-600 hover:text-gray-950 hover:bg-zinc-50 w-full justify-center\"\r\n onClick={() => {\r\n window.location.href = `${accountsUrl}/my-teams`;\r\n }}\r\n >\r\n Gerenciar equipe\r\n </Button>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/WhitelabelCodes.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useWhitelabel } from \"../../providers/whitelabel.provider\";\n\nfunction copyAttributes(source: Element, target: HTMLElement) {\n Array.from(source.attributes).forEach((attribute) => {\n target.setAttribute(attribute.name, attribute.value);\n });\n}\n\nexport default function WhitelabelCodes() {\n const { whitelabel } = useWhitelabel();\n\n useEffect(() => {\n const codes = whitelabel?.codes;\n const rawCodes = codes ? codes.trim() : \"\";\n\n if (!rawCodes) {\n return;\n }\n\n const template = document.createElement(\"template\");\n template.innerHTML = rawCodes;\n\n const appendedNodes: HTMLElement[] = [];\n\n Array.from(template.content.children).forEach((node) => {\n const tagName = node.tagName.toLowerCase();\n\n if (tagName !== \"style\" && tagName !== \"script\") {\n return;\n }\n\n if (tagName === \"style\") {\n const style = document.createElement(\"style\");\n copyAttributes(node, style);\n style.textContent = node.textContent;\n style.dataset.whitelabelCodes = \"true\";\n document.head.appendChild(style);\n appendedNodes.push(style);\n return;\n }\n\n const script = document.createElement(\"script\");\n copyAttributes(node, script);\n script.textContent = node.textContent;\n script.dataset.whitelabelCodes = \"true\";\n document.head.appendChild(script);\n appendedNodes.push(script);\n });\n\n return () => {\n appendedNodes.forEach((node) => node.remove());\n };\n }, [whitelabel?.codes]);\n\n return null;\n}\n"],"mappings":";AAEA,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAE9B,SAAS,eAAe,QAAiB,QAAqB;AAC5D,QAAM,KAAK,OAAO,UAAU,EAAE,QAAQ,CAAC,cAAc;AACnD,WAAO,aAAa,UAAU,MAAM,UAAU,KAAK;AAAA,EACrD,CAAC;AACH;AAEe,SAAR,kBAAmC;AACxC,QAAM,EAAE,WAAW,IAAI,cAAc;AAErC,YAAU,MAAM;AACd,UAAM,QAAQ,YAAY;AAC1B,UAAM,WAAW,QAAQ,MAAM,KAAK,IAAI;AAExC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY;AAErB,UAAM,gBAA+B,CAAC;AAEtC,UAAM,KAAK,SAAS,QAAQ,QAAQ,EAAE,QAAQ,CAAC,SAAS;AACtD,YAAM,UAAU,KAAK,QAAQ,YAAY;AAEzC,UAAI,YAAY,WAAW,YAAY,UAAU;AAC/C;AAAA,MACF;AAEA,UAAI,YAAY,SAAS;AACvB,cAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,uBAAe,MAAM,KAAK;AAC1B,cAAM,cAAc,KAAK;AACzB,cAAM,QAAQ,kBAAkB;AAChC,iBAAS,KAAK,YAAY,KAAK;AAC/B,sBAAc,KAAK,KAAK;AACxB;AAAA,MACF;AAEA,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,qBAAe,MAAM,MAAM;AAC3B,aAAO,cAAc,KAAK;AAC1B,aAAO,QAAQ,kBAAkB;AACjC,eAAS,KAAK,YAAY,MAAM;AAChC,oBAAc,KAAK,MAAM;AAAA,IAC3B,CAAC;AAED,WAAO,MAAM;AACX,oBAAc,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,CAAC;AAEtB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layouts/WhitelabelCodes.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useEffect } from \"react\";\r\nimport { useWhitelabel } from \"../../providers/whitelabel.provider\";\r\n\r\nfunction copyAttributes(source: Element, target: HTMLElement) {\r\n Array.from(source.attributes).forEach((attribute) => {\r\n target.setAttribute(attribute.name, attribute.value);\r\n });\r\n}\r\n\r\nexport default function WhitelabelCodes() {\r\n const { whitelabel } = useWhitelabel();\r\n\r\n useEffect(() => {\r\n const codes = whitelabel?.codes;\r\n const rawCodes = codes ? codes.trim() : \"\";\r\n\r\n if (!rawCodes) {\r\n return;\r\n }\r\n\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = rawCodes;\r\n\r\n const appendedNodes: HTMLElement[] = [];\r\n\r\n Array.from(template.content.children).forEach((node) => {\r\n const tagName = node.tagName.toLowerCase();\r\n\r\n if (tagName !== \"style\" && tagName !== \"script\") {\r\n return;\r\n }\r\n\r\n if (tagName === \"style\") {\r\n const style = document.createElement(\"style\");\r\n copyAttributes(node, style);\r\n style.textContent = node.textContent;\r\n style.dataset.whitelabelCodes = \"true\";\r\n document.head.appendChild(style);\r\n appendedNodes.push(style);\r\n return;\r\n }\r\n\r\n const script = document.createElement(\"script\");\r\n copyAttributes(node, script);\r\n script.textContent = node.textContent;\r\n script.dataset.whitelabelCodes = \"true\";\r\n document.head.appendChild(script);\r\n appendedNodes.push(script);\r\n });\r\n\r\n return () => {\r\n appendedNodes.forEach((node) => node.remove());\r\n };\r\n }, [whitelabel?.codes]);\r\n\r\n return null;\r\n}\r\n"],"mappings":";AAEA,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAE9B,SAAS,eAAe,QAAiB,QAAqB;AAC5D,QAAM,KAAK,OAAO,UAAU,EAAE,QAAQ,CAAC,cAAc;AACnD,WAAO,aAAa,UAAU,MAAM,UAAU,KAAK;AAAA,EACrD,CAAC;AACH;AAEe,SAAR,kBAAmC;AACxC,QAAM,EAAE,WAAW,IAAI,cAAc;AAErC,YAAU,MAAM;AACd,UAAM,QAAQ,YAAY;AAC1B,UAAM,WAAW,QAAQ,MAAM,KAAK,IAAI;AAExC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY;AAErB,UAAM,gBAA+B,CAAC;AAEtC,UAAM,KAAK,SAAS,QAAQ,QAAQ,EAAE,QAAQ,CAAC,SAAS;AACtD,YAAM,UAAU,KAAK,QAAQ,YAAY;AAEzC,UAAI,YAAY,WAAW,YAAY,UAAU;AAC/C;AAAA,MACF;AAEA,UAAI,YAAY,SAAS;AACvB,cAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,uBAAe,MAAM,KAAK;AAC1B,cAAM,cAAc,KAAK;AACzB,cAAM,QAAQ,kBAAkB;AAChC,iBAAS,KAAK,YAAY,KAAK;AAC/B,sBAAc,KAAK,KAAK;AACxB;AAAA,MACF;AAEA,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,qBAAe,MAAM,MAAM;AAC3B,aAAO,cAAc,KAAK;AAC1B,aAAO,QAAQ,kBAAkB;AACjC,eAAS,KAAK,YAAY,MAAM;AAChC,oBAAc,KAAK,MAAM;AAAA,IAC3B,CAAC;AAED,WAAO,MAAM;AACX,oBAAc,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,CAAC;AAEtB,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modals/BuyCreditsModal.tsx"],"sourcesContent":["'use client';\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '../ui/overlay/Dialog';\nimport { Button } from '../ui/buttons/Button';\nimport { Separator } from '../ui/data-display/Separator';\nimport { Toast } from '../ui/feedback/Toast';\nimport { SelectField } from '../ui/form/SelectField';\nimport { Skeleton } from '../ui/feedback/Skeleton';\nimport { PaymentInfoCard } from '../ui/data-display/PaymentInfoCard';\nimport { ADDON_IDS } from '../../modules/subscriptions/constants/addons.constants';\nimport {\n AI_CREDIT_OPTIONS,\n AI_CREDIT_VALUES,\n} from '../../modules/subscriptions/constants/addons.constants';\nimport { useBuyCreditsModal } from '../../store/useBuyCreditsModal';\nimport { useModalManager } from '../../store/useModalManager';\nimport { useCards } from '../../modules/cards/hooks/cards.hook';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useCalculateSubscription } from '../../modules/subscriptions/hooks/calculate-subscription.hook';\nimport { useUpdateSubscriptionPlan } from '../../modules/subscriptions/hooks/update-subscription-plan.hook';\nimport { getPriceFromCalculatedData } from '../../modules/subscriptions/utils/periodicity';\nimport { useIsDefaultWhitelabel } from '../../providers/whitelabel.provider';\nimport { IconInfoCircle, IconX, IconLoader2 } from '@tabler/icons-react';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport z from 'zod';\nimport { toast } from 'sonner';\n\nconst buyCreditSchema = z.object({\n creditOption: z.number().refine((val) => AI_CREDIT_VALUES.has(val), {\n message: 'Selecione uma opção de créditos',\n }),\n selectedCardId: z.string().min(1, 'Selecione um cartão'),\n});\n\ntype BuyCreditFormData = z.infer<typeof buyCreditSchema>;\n\nexport default function BuyCreditsModal() {\n const { open, closeModal } = useBuyCreditsModal();\n const { openModal } = useModalManager();\n const isDefaultWl = useIsDefaultWhitelabel();\n const { data: cardsData } = useCards();\n const { data: subscriptionData } = useActiveSubscription();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const defaultCardId =\n cardsData?.data?.find((card) => card.is_default)?.id?.toString() ??\n cardsData?.data?.[0]?.id?.toString() ??\n '';\n\n const {\n mutate: calculate,\n isPending: isCalculatePending,\n data: calculateData,\n } = useCalculateSubscription();\n const updatePlanMutation = useUpdateSubscriptionPlan();\n\n const aiItem = useMemo(\n () => subscription?.items?.find((item) => item.id_addon === ADDON_IDS.AI),\n [subscription]\n );\n\n const currentCredits = aiItem?.quantity ?? 0;\n const subscriptionId = subscription?.id;\n const planId = subscription?.id_plan;\n\n const form = useForm<BuyCreditFormData>({\n resolver: zodResolver(buyCreditSchema),\n mode: 'onChange',\n defaultValues: {\n creditOption: currentCredits,\n selectedCardId: defaultCardId,\n },\n });\n\n const hasInitialized = useRef(false);\n\n useEffect(() => {\n if (!open) {\n hasInitialized.current = false;\n return;\n }\n\n if (hasInitialized.current || !subscription) return;\n hasInitialized.current = true;\n\n form.reset({\n creditOption: currentCredits,\n selectedCardId: defaultCardId,\n });\n\n calculate({\n id_product: 1,\n ...(planId != null && { id_plan: planId }),\n ...(subscriptionId != null && { id_subscription: subscriptionId }),\n plan_extras: [\n { id_addon: ADDON_IDS.AI, quantity: currentCredits },\n ],\n });\n }, [\n open,\n subscription,\n currentCredits,\n defaultCardId,\n form,\n calculate,\n planId,\n subscriptionId,\n ]);\n\n // Sync selectedCardId when cards load after modal opened\n useEffect(() => {\n if (open && defaultCardId && !form.getValues('selectedCardId')) {\n form.setValue('selectedCardId', defaultCardId, { shouldValidate: true });\n }\n }, [open, defaultCardId, form]);\n\n const creditOption = form.watch('creditOption');\n const selectedCardId = form.watch('selectedCardId');\n const { isDirty, isSubmitting, isValid } = form.formState;\n\n\n const handleCreditOptionChange = useCallback(\n (value: string | number | boolean) => {\n const credits = Number(value);\n\n form.setValue('creditOption', credits, {\n shouldValidate: true,\n shouldDirty: true,\n });\n\n const option = AI_CREDIT_OPTIONS.find((opt) => opt.credits === credits);\n if (!option) return;\n\n calculate({\n id_product: 1,\n ...(planId != null && { id_plan: planId }),\n ...(subscriptionId != null && { id_subscription: subscriptionId }),\n plan_extras: [\n { id_addon: ADDON_IDS.AI, quantity: option.credits, currency: 'BRL' },\n ],\n });\n },\n [form, subscriptionId, planId, calculate]\n );\n\n const calculatedData = calculateData?.data ?? null;\n\n const isIncreasingCredits = creditOption > currentCredits;\n const hasChanged = creditOption !== currentCredits;\n\n const immediateChargeTotal = calculatedData?.target?.immediate_charge?.total ?? null;\n\n const totalPrice = useMemo(() => {\n if (!calculatedData) return null;\n return getPriceFromCalculatedData(calculatedData, subscription?.periodicity);\n }, [calculatedData, subscription]);\n\n const formatPrice = useCallback((price: number) => {\n return price.toLocaleString('pt-BR', {\n style: 'currency',\n currency: 'BRL',\n });\n }, []);\n\n const isConfirmDisabled = !isDirty || !isValid || isCalculatePending || isSubmitting;\n\n const handleClose = useCallback(() => {\n form.reset();\n closeModal();\n }, [form, closeModal]);\n\n const handleOpenAddCardModal = useCallback(() => {\n openModal('addCardModal');\n }, [openModal]);\n\n const selectOptions = useMemo(() => {\n return AI_CREDIT_OPTIONS.map((opt) => ({\n value: opt.credits,\n label: (\n <div className=\"flex items-center justify-between gap-2 w-full\">\n <span className=\"paragraph-small-medium text-zinc-950 flex-1\">\n {opt.credits.toLocaleString('pt-BR')} créditos de IA\n </span>\n <span className=\"paragraph-small-medium text-zinc-500 opacity-70\">{opt.priceLabel}</span>\n </div>\n ),\n displayValue: `${opt.credits.toLocaleString('pt-BR')} créditos de IA`,\n }));\n }, []);\n\n const onSubmit = useCallback(\n async (data: BuyCreditFormData) => {\n if (!subscriptionId) return;\n\n const option = AI_CREDIT_OPTIONS.find((opt) => opt.credits === data.creditOption);\n if (!option) return;\n\n await updatePlanMutation.mutateAsync({\n subscriptionId,\n data: {\n plan_extras: [\n {\n id_addon: ADDON_IDS.AI,\n quantity: option.credits,\n },\n ],\n },\n });\n\n toast.custom((t) => (\n <Toast\n variant=\"success\"\n message={`Créditos de IA alterados para ${data.creditOption.toLocaleString('pt-BR')}`}\n toastId={t}\n />\n ));\n form.reset();\n closeModal();\n },\n [subscriptionId, updatePlanMutation, form, closeModal]\n );\n\n const renderPriceDisplay = useCallback(() => {\n if (isCalculatePending) {\n return <Skeleton className=\"h-7 w-24\" />;\n }\n if (totalPrice !== null) {\n return (\n <span className=\"paragraph-xlarge-semibold text-zinc-950\">\n {totalPrice === 0 ? 'Incluso' : formatPrice(totalPrice)}\n </span>\n );\n }\n return <span className=\"paragraph-xlarge-semibold text-zinc-400\">--</span>;\n }, [isCalculatePending, totalPrice, formatPrice]);\n\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent\n showCloseButton={false}\n 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-[433px] 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-hidden lg:overflow-y-auto\"\n >\n <DialogHeader className=\"px-4 py-3 border-b border-zinc-200 shrink-0 relative\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950 text-center\">\n Comprar créditos de IA\n </DialogTitle>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 size-8 flex items-center justify-center rounded-lg cursor-pointer hover:bg-zinc-100 transition-colors\"\n >\n <IconX size={18} className=\"text-zinc-400\" />\n </button>\n </DialogHeader>\n\n <form\n onSubmit={form.handleSubmit(onSubmit)}\n className=\"flex flex-col flex-1 lg:flex-none overflow-hidden\"\n >\n <div className=\"flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none overflow-y-auto\">\n <div className=\"flex flex-col gap-4\">\n <SelectField\n options={selectOptions}\n value={creditOption}\n onChange={handleCreditOptionChange}\n className=\"h-12!\"\n />\n\n <PaymentInfoCard\n selectedCardId={selectedCardId}\n onCardSelect={(cardId) =>\n form.setValue('selectedCardId', cardId, { shouldValidate: true })\n }\n onOpenAddCard={handleOpenAddCardModal}\n />\n\n {hasChanged && (\n <div className={`flex items-center gap-3 p-4 rounded-lg ${isDefaultWl ? 'bg-cyan-50' : 'bg-zinc-50'}`}>\n <IconInfoCircle className=\"size-4 text-zinc-950 shrink-0\" />\n <span className=\"paragraph-small-regular text-zinc-950\">\n {isIncreasingCredits\n ? 'O pagamento será processado no momento da confirmação.'\n : 'As alterações entrarão em vigor a partir da sua próxima fatura.'}\n </span>\n </div>\n )}\n </div>\n\n <Separator className=\"bg-zinc-200 hidden lg:block\" />\n\n <div className=\"hidden lg:flex flex-col gap-2\">\n {immediateChargeTotal !== null && immediateChargeTotal > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-xsmall-medium text-zinc-500\">Cobrança imediata</span>\n {isCalculatePending ? (\n <Skeleton className=\"h-5 w-20\" />\n ) : (\n <span className=\"paragraph-small-semibold text-zinc-950\">\n {formatPrice(immediateChargeTotal)}\n </span>\n )}\n </div>\n )}\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-small-medium text-zinc-500\">Valor total do plano</span>\n {renderPriceDisplay()}\n </div>\n </div>\n\n <Button\n type=\"submit\"\n disabled={isConfirmDisabled}\n className=\"w-full hidden lg:inline-flex\"\n >\n {isSubmitting && <IconLoader2 className=\"size-4 animate-spin\" />}\n Confirmar e pagar\n </Button>\n </div>\n\n <div className=\"flex flex-col gap-4 p-4 border-t border-zinc-200 shrink-0 lg:hidden\">\n <div className=\"flex flex-col gap-2\">\n {immediateChargeTotal !== null && immediateChargeTotal > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-xsmall-medium text-zinc-500\">Cobrança imediata</span>\n {isCalculatePending ? (\n <Skeleton className=\"h-5 w-20\" />\n ) : (\n <span className=\"paragraph-small-semibold text-zinc-950\">\n {formatPrice(immediateChargeTotal)}\n </span>\n )}\n </div>\n )}\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-small-medium text-zinc-500\">Valor total do plano</span>\n {renderPriceDisplay()}\n </div>\n </div>\n <Button type=\"submit\" disabled={isConfirmDisabled} className=\"w-full\">\n {isSubmitting && <IconLoader2 className=\"size-4 animate-spin\" />}\n Confirmar e pagar\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modals/BuyCreditsModal.tsx"],"sourcesContent":["'use client';\r\n\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../ui/overlay/Dialog';\r\nimport { Button } from '../ui/buttons/Button';\r\nimport { Separator } from '../ui/data-display/Separator';\r\nimport { Toast } from '../ui/feedback/Toast';\r\nimport { SelectField } from '../ui/form/SelectField';\r\nimport { Skeleton } from '../ui/feedback/Skeleton';\r\nimport { PaymentInfoCard } from '../ui/data-display/PaymentInfoCard';\r\nimport { ADDON_IDS } from '../../modules/subscriptions/constants/addons.constants';\r\nimport {\r\n AI_CREDIT_OPTIONS,\r\n AI_CREDIT_VALUES,\r\n} from '../../modules/subscriptions/constants/addons.constants';\r\nimport { useBuyCreditsModal } from '../../store/useBuyCreditsModal';\r\nimport { useModalManager } from '../../store/useModalManager';\r\nimport { useCards } from '../../modules/cards/hooks/cards.hook';\r\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\r\nimport { useCalculateSubscription } from '../../modules/subscriptions/hooks/calculate-subscription.hook';\r\nimport { useUpdateSubscriptionPlan } from '../../modules/subscriptions/hooks/update-subscription-plan.hook';\r\nimport { getPriceFromCalculatedData } from '../../modules/subscriptions/utils/periodicity';\r\nimport { useIsDefaultWhitelabel } from '../../providers/whitelabel.provider';\r\nimport { IconInfoCircle, IconX, IconLoader2 } from '@tabler/icons-react';\r\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport z from 'zod';\r\nimport { toast } from 'sonner';\r\n\r\nconst buyCreditSchema = z.object({\r\n creditOption: z.number().refine((val) => AI_CREDIT_VALUES.has(val), {\r\n message: 'Selecione uma opção de créditos',\r\n }),\r\n selectedCardId: z.string().min(1, 'Selecione um cartão'),\r\n});\r\n\r\ntype BuyCreditFormData = z.infer<typeof buyCreditSchema>;\r\n\r\nexport default function BuyCreditsModal() {\r\n const { open, closeModal } = useBuyCreditsModal();\r\n const { openModal } = useModalManager();\r\n const isDefaultWl = useIsDefaultWhitelabel();\r\n const { data: cardsData } = useCards();\r\n const { data: subscriptionData } = useActiveSubscription();\r\n const subscription = subscriptionData?.data?.[0] ?? null;\r\n const defaultCardId =\r\n cardsData?.data?.find((card) => card.is_default)?.id?.toString() ??\r\n cardsData?.data?.[0]?.id?.toString() ??\r\n '';\r\n\r\n const {\r\n mutate: calculate,\r\n isPending: isCalculatePending,\r\n data: calculateData,\r\n } = useCalculateSubscription();\r\n const updatePlanMutation = useUpdateSubscriptionPlan();\r\n\r\n const aiItem = useMemo(\r\n () => subscription?.items?.find((item) => item.id_addon === ADDON_IDS.AI),\r\n [subscription]\r\n );\r\n\r\n const currentCredits = aiItem?.quantity ?? 0;\r\n const subscriptionId = subscription?.id;\r\n const planId = subscription?.id_plan;\r\n\r\n const form = useForm<BuyCreditFormData>({\r\n resolver: zodResolver(buyCreditSchema),\r\n mode: 'onChange',\r\n defaultValues: {\r\n creditOption: currentCredits,\r\n selectedCardId: defaultCardId,\r\n },\r\n });\r\n\r\n const hasInitialized = useRef(false);\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n hasInitialized.current = false;\r\n return;\r\n }\r\n\r\n if (hasInitialized.current || !subscription) return;\r\n hasInitialized.current = true;\r\n\r\n form.reset({\r\n creditOption: currentCredits,\r\n selectedCardId: defaultCardId,\r\n });\r\n\r\n calculate({\r\n id_product: 1,\r\n ...(planId != null && { id_plan: planId }),\r\n ...(subscriptionId != null && { id_subscription: subscriptionId }),\r\n plan_extras: [\r\n { id_addon: ADDON_IDS.AI, quantity: currentCredits },\r\n ],\r\n });\r\n }, [\r\n open,\r\n subscription,\r\n currentCredits,\r\n defaultCardId,\r\n form,\r\n calculate,\r\n planId,\r\n subscriptionId,\r\n ]);\r\n\r\n // Sync selectedCardId when cards load after modal opened\r\n useEffect(() => {\r\n if (open && defaultCardId && !form.getValues('selectedCardId')) {\r\n form.setValue('selectedCardId', defaultCardId, { shouldValidate: true });\r\n }\r\n }, [open, defaultCardId, form]);\r\n\r\n const creditOption = form.watch('creditOption');\r\n const selectedCardId = form.watch('selectedCardId');\r\n const { isDirty, isSubmitting, isValid } = form.formState;\r\n\r\n\r\n const handleCreditOptionChange = useCallback(\r\n (value: string | number | boolean) => {\r\n const credits = Number(value);\r\n\r\n form.setValue('creditOption', credits, {\r\n shouldValidate: true,\r\n shouldDirty: true,\r\n });\r\n\r\n const option = AI_CREDIT_OPTIONS.find((opt) => opt.credits === credits);\r\n if (!option) return;\r\n\r\n calculate({\r\n id_product: 1,\r\n ...(planId != null && { id_plan: planId }),\r\n ...(subscriptionId != null && { id_subscription: subscriptionId }),\r\n plan_extras: [\r\n { id_addon: ADDON_IDS.AI, quantity: option.credits, currency: 'BRL' },\r\n ],\r\n });\r\n },\r\n [form, subscriptionId, planId, calculate]\r\n );\r\n\r\n const calculatedData = calculateData?.data ?? null;\r\n\r\n const isIncreasingCredits = creditOption > currentCredits;\r\n const hasChanged = creditOption !== currentCredits;\r\n\r\n const immediateChargeTotal = calculatedData?.target?.immediate_charge?.total ?? null;\r\n\r\n const totalPrice = useMemo(() => {\r\n if (!calculatedData) return null;\r\n return getPriceFromCalculatedData(calculatedData, subscription?.periodicity);\r\n }, [calculatedData, subscription]);\r\n\r\n const formatPrice = useCallback((price: number) => {\r\n return price.toLocaleString('pt-BR', {\r\n style: 'currency',\r\n currency: 'BRL',\r\n });\r\n }, []);\r\n\r\n const isConfirmDisabled = !isDirty || !isValid || isCalculatePending || isSubmitting;\r\n\r\n const handleClose = useCallback(() => {\r\n form.reset();\r\n closeModal();\r\n }, [form, closeModal]);\r\n\r\n const handleOpenAddCardModal = useCallback(() => {\r\n openModal('addCardModal');\r\n }, [openModal]);\r\n\r\n const selectOptions = useMemo(() => {\r\n return AI_CREDIT_OPTIONS.map((opt) => ({\r\n value: opt.credits,\r\n label: (\r\n <div className=\"flex items-center justify-between gap-2 w-full\">\r\n <span className=\"paragraph-small-medium text-zinc-950 flex-1\">\r\n {opt.credits.toLocaleString('pt-BR')} créditos de IA\r\n </span>\r\n <span className=\"paragraph-small-medium text-zinc-500 opacity-70\">{opt.priceLabel}</span>\r\n </div>\r\n ),\r\n displayValue: `${opt.credits.toLocaleString('pt-BR')} créditos de IA`,\r\n }));\r\n }, []);\r\n\r\n const onSubmit = useCallback(\r\n async (data: BuyCreditFormData) => {\r\n if (!subscriptionId) return;\r\n\r\n const option = AI_CREDIT_OPTIONS.find((opt) => opt.credits === data.creditOption);\r\n if (!option) return;\r\n\r\n await updatePlanMutation.mutateAsync({\r\n subscriptionId,\r\n data: {\r\n plan_extras: [\r\n {\r\n id_addon: ADDON_IDS.AI,\r\n quantity: option.credits,\r\n },\r\n ],\r\n },\r\n });\r\n\r\n toast.custom((t) => (\r\n <Toast\r\n variant=\"success\"\r\n message={`Créditos de IA alterados para ${data.creditOption.toLocaleString('pt-BR')}`}\r\n toastId={t}\r\n />\r\n ));\r\n form.reset();\r\n closeModal();\r\n },\r\n [subscriptionId, updatePlanMutation, form, closeModal]\r\n );\r\n\r\n const renderPriceDisplay = useCallback(() => {\r\n if (isCalculatePending) {\r\n return <Skeleton className=\"h-7 w-24\" />;\r\n }\r\n if (totalPrice !== null) {\r\n return (\r\n <span className=\"paragraph-xlarge-semibold text-zinc-950\">\r\n {totalPrice === 0 ? 'Incluso' : formatPrice(totalPrice)}\r\n </span>\r\n );\r\n }\r\n return <span className=\"paragraph-xlarge-semibold text-zinc-400\">--</span>;\r\n }, [isCalculatePending, totalPrice, formatPrice]);\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={handleClose}>\r\n <DialogContent\r\n showCloseButton={false}\r\n 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-[433px] 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-hidden lg:overflow-y-auto\"\r\n >\r\n <DialogHeader className=\"px-4 py-3 border-b border-zinc-200 shrink-0 relative\">\r\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950 text-center\">\r\n Comprar créditos de IA\r\n </DialogTitle>\r\n <button\r\n type=\"button\"\r\n onClick={handleClose}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 size-8 flex items-center justify-center rounded-lg cursor-pointer hover:bg-zinc-100 transition-colors\"\r\n >\r\n <IconX size={18} className=\"text-zinc-400\" />\r\n </button>\r\n </DialogHeader>\r\n\r\n <form\r\n onSubmit={form.handleSubmit(onSubmit)}\r\n className=\"flex flex-col flex-1 lg:flex-none overflow-hidden\"\r\n >\r\n <div className=\"flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none overflow-y-auto\">\r\n <div className=\"flex flex-col gap-4\">\r\n <SelectField\r\n options={selectOptions}\r\n value={creditOption}\r\n onChange={handleCreditOptionChange}\r\n className=\"h-12!\"\r\n />\r\n\r\n <PaymentInfoCard\r\n selectedCardId={selectedCardId}\r\n onCardSelect={(cardId) =>\r\n form.setValue('selectedCardId', cardId, { shouldValidate: true })\r\n }\r\n onOpenAddCard={handleOpenAddCardModal}\r\n />\r\n\r\n {hasChanged && (\r\n <div className={`flex items-center gap-3 p-4 rounded-lg ${isDefaultWl ? 'bg-cyan-50' : 'bg-zinc-50'}`}>\r\n <IconInfoCircle className=\"size-4 text-zinc-950 shrink-0\" />\r\n <span className=\"paragraph-small-regular text-zinc-950\">\r\n {isIncreasingCredits\r\n ? 'O pagamento será processado no momento da confirmação.'\r\n : 'As alterações entrarão em vigor a partir da sua próxima fatura.'}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <Separator className=\"bg-zinc-200 hidden lg:block\" />\r\n\r\n <div className=\"hidden lg:flex flex-col gap-2\">\r\n {immediateChargeTotal !== null && immediateChargeTotal > 0 && (\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"paragraph-xsmall-medium text-zinc-500\">Cobrança imediata</span>\r\n {isCalculatePending ? (\r\n <Skeleton className=\"h-5 w-20\" />\r\n ) : (\r\n <span className=\"paragraph-small-semibold text-zinc-950\">\r\n {formatPrice(immediateChargeTotal)}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"paragraph-small-medium text-zinc-500\">Valor total do plano</span>\r\n {renderPriceDisplay()}\r\n </div>\r\n </div>\r\n\r\n <Button\r\n type=\"submit\"\r\n disabled={isConfirmDisabled}\r\n className=\"w-full hidden lg:inline-flex\"\r\n >\r\n {isSubmitting && <IconLoader2 className=\"size-4 animate-spin\" />}\r\n Confirmar e pagar\r\n </Button>\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-4 p-4 border-t border-zinc-200 shrink-0 lg:hidden\">\r\n <div className=\"flex flex-col gap-2\">\r\n {immediateChargeTotal !== null && immediateChargeTotal > 0 && (\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"paragraph-xsmall-medium text-zinc-500\">Cobrança imediata</span>\r\n {isCalculatePending ? (\r\n <Skeleton className=\"h-5 w-20\" />\r\n ) : (\r\n <span className=\"paragraph-small-semibold text-zinc-950\">\r\n {formatPrice(immediateChargeTotal)}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"paragraph-small-medium text-zinc-500\">Valor total do plano</span>\r\n {renderPriceDisplay()}\r\n </div>\r\n </div>\r\n <Button type=\"submit\" disabled={isConfirmDisabled} className=\"w-full\">\r\n {isSubmitting && <IconLoader2 className=\"size-4 animate-spin\" />}\r\n Confirmar e pagar\r\n </Button>\r\n </div>\r\n </form>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modals/PaidPlanRequiredModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { IconLock } from '@tabler/icons-react';\nimport { Button } from '../ui/buttons/Button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../ui/overlay/Dialog';\nimport { useWhitelabelUrls } from '../../providers/whitelabel.provider';\nimport { useModalManager } from '../../store/useModalManager';\nimport type { ModalData } from '../../store/useModalManager';\n\nexport default function PaidPlanRequiredModal() {\n const { activeModal, modalData, closeModal } = useModalManager();\n const isOpen = activeModal === 'paidPlanRequiredModal';\n const data = modalData as ModalData & { title?: string; description?: string };\n const { accountsUrl } = useWhitelabelUrls();\n\n const title = (data.title as string) ?? \"Recurso disponível em planos pagos\";\n const description = (data.description as string) ?? \"Para acessar este recurso, faça upgrade para um plano pago\";\n\n const handleKnowPlans = () => {\n closeModal();\n window.open(`${accountsUrl}/subscriptions?tab=plans`, '_blank');\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={() => closeModal()}>\n <DialogContent className=\"flex flex-col p-0 gap-0 w-full md:w-[410px] lg:w-[410px]\">\n <DialogHeader className=\"gap-3 text-left p-5\">\n <div className=\"flex items-center justify-center w-10 h-10 bg-zinc-50 rounded-lg\">\n <IconLock size={24} className=\"text-zinc-950\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\n {title}\n </DialogTitle>\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\">\n {description}\n </DialogDescription>\n </div>\n </DialogHeader>\n <div className=\"flex items-center gap-2 p-5 border-t border-zinc-200\">\n <Button\n className=\"w-fit h-10!\"\n onClick={handleKnowPlans}\n >\n Conhecer planos\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AAkCwB,cAEJ,YAFI;AAhCxB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAGjB,SAAR,wBAAyC;AAC5C,QAAM,EAAE,aAAa,WAAW,WAAW,IAAI,gBAAgB;AAC/D,QAAM,SAAS,gBAAgB;AAC/B,QAAM,OAAO;AACb,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAE1C,QAAM,QAAS,KAAK,SAAoB;AACxC,QAAM,cAAe,KAAK,eAA0B;AAEpD,QAAM,kBAAkB,MAAM;AAC1B,eAAW;AACX,WAAO,KAAK,GAAG,WAAW,4BAA4B,QAAQ;AAAA,EAClE;AAEA,SACI,oBAAC,UAAO,MAAM,QAAQ,cAAc,MAAM,WAAW,GACjD,+BAAC,iBAAc,WAAU,4DACrB;AAAA,yBAAC,gBAAa,WAAU,uBACpB;AAAA,0BAAC,SAAI,WAAU,oEACX,8BAAC,YAAS,MAAM,IAAI,WAAU,iBAAgB,GAClD;AAAA,MACA,qBAAC,SAAI,WAAU,uBACX;AAAA,4BAAC,eAAY,WAAU,2CAClB,iBACL;AAAA,QACA,oBAAC,qBAAkB,WAAU,yCACxB,uBACL;AAAA,SACJ;AAAA,OACJ;AAAA,IACA,oBAAC,SAAI,WAAU,wDACX;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS;AAAA,QACZ;AAAA;AAAA,IAED,GACJ;AAAA,KACJ,GACJ;AAER;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modals/PaidPlanRequiredModal.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { IconLock } from '@tabler/icons-react';\r\nimport { Button } from '../ui/buttons/Button';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../ui/overlay/Dialog';\r\nimport { useWhitelabelUrls } from '../../providers/whitelabel.provider';\r\nimport { useModalManager } from '../../store/useModalManager';\r\nimport type { ModalData } from '../../store/useModalManager';\r\n\r\nexport default function PaidPlanRequiredModal() {\r\n const { activeModal, modalData, closeModal } = useModalManager();\r\n const isOpen = activeModal === 'paidPlanRequiredModal';\r\n const data = modalData as ModalData & { title?: string; description?: string };\r\n const { accountsUrl } = useWhitelabelUrls();\r\n\r\n const title = (data.title as string) ?? \"Recurso disponível em planos pagos\";\r\n const description = (data.description as string) ?? \"Para acessar este recurso, faça upgrade para um plano pago\";\r\n\r\n const handleKnowPlans = () => {\r\n closeModal();\r\n window.open(`${accountsUrl}/subscriptions?tab=plans`, '_blank');\r\n };\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={() => closeModal()}>\r\n <DialogContent className=\"flex flex-col p-0 gap-0 w-full md:w-[410px] lg:w-[410px]\">\r\n <DialogHeader className=\"gap-3 text-left p-5\">\r\n <div className=\"flex items-center justify-center w-10 h-10 bg-zinc-50 rounded-lg\">\r\n <IconLock size={24} className=\"text-zinc-950\" />\r\n </div>\r\n <div className=\"flex flex-col gap-2\">\r\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\r\n {title}\r\n </DialogTitle>\r\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\">\r\n {description}\r\n </DialogDescription>\r\n </div>\r\n </DialogHeader>\r\n <div className=\"flex items-center gap-2 p-5 border-t border-zinc-200\">\r\n <Button\r\n className=\"w-fit h-10!\"\r\n onClick={handleKnowPlans}\r\n >\r\n Conhecer planos\r\n </Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":";AAkCwB,cAEJ,YAFI;AAhCxB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAGjB,SAAR,wBAAyC;AAC5C,QAAM,EAAE,aAAa,WAAW,WAAW,IAAI,gBAAgB;AAC/D,QAAM,SAAS,gBAAgB;AAC/B,QAAM,OAAO;AACb,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAE1C,QAAM,QAAS,KAAK,SAAoB;AACxC,QAAM,cAAe,KAAK,eAA0B;AAEpD,QAAM,kBAAkB,MAAM;AAC1B,eAAW;AACX,WAAO,KAAK,GAAG,WAAW,4BAA4B,QAAQ;AAAA,EAClE;AAEA,SACI,oBAAC,UAAO,MAAM,QAAQ,cAAc,MAAM,WAAW,GACjD,+BAAC,iBAAc,WAAU,4DACrB;AAAA,yBAAC,gBAAa,WAAU,uBACpB;AAAA,0BAAC,SAAI,WAAU,oEACX,8BAAC,YAAS,MAAM,IAAI,WAAU,iBAAgB,GAClD;AAAA,MACA,qBAAC,SAAI,WAAU,uBACX;AAAA,4BAAC,eAAY,WAAU,2CAClB,iBACL;AAAA,QACA,oBAAC,qBAAkB,WAAU,yCACxB,uBACL;AAAA,SACJ;AAAA,OACJ;AAAA,IACA,oBAAC,SAAI,WAAU,wDACX;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS;AAAA,QACZ;AAAA;AAAA,IAED,GACJ;AAAA,KACJ,GACJ;AAER;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/modals/cards/AddCardModal.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useState } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';\nimport { Button } from '../../ui/buttons/Button';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useCreateCard } from '../../../modules/cards/hooks/create-card.hook';\nimport { useUpdateAccount } from '../../../modules/accounts/hooks/useAccountManagement';\nimport { CardFormFields, BillingFormFields, cardFormSchema } from './CardFormFields';\nimport type { CardFormData, StripeElementsStatus } from './CardFormFields';\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\nimport { IconLoader2, IconX } from '@tabler/icons-react';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { CardNumberElement, useElements, useStripe } from '@stripe/react-stripe-js';\nimport { toast } from 'sonner';\n\nconst INITIAL_STRIPE_STATUS: StripeElementsStatus = {\n cardNumber: false,\n cardExpiry: false,\n cardCvc: false,\n};\n\nexport default function AddCardModal() {\n const { activeModal, modalData, closeModal } = useModalManager();\n const isDefaultWl = useIsDefaultWhitelabel();\n const isOpen = activeModal === 'addCardModal';\n const [currentStep, setCurrentStep] = useState(1);\n const [stripeStatus, setStripeStatus] = useState<StripeElementsStatus>(INITIAL_STRIPE_STATUS);\n const [stripeErrors, setStripeErrors] = useState<Record<string, string | undefined>>({});\n\n const onCardAdded = modalData.onCardAdded as ((cardId: string) => void) | undefined;\n\n const createCardMutation = useCreateCard();\n const updateAccountMutation = useUpdateAccount();\n const elements = useElements();\n const stripe = useStripe();\n\n const form = useForm<CardFormData>({\n resolver: zodResolver(cardFormSchema),\n mode: 'onSubmit',\n reValidateMode: 'onChange',\n defaultValues: {\n country: 'BR',\n personType: 'pf',\n },\n });\n\n const handleClose = useCallback(() => {\n form.reset();\n setCurrentStep(1);\n setStripeStatus(INITIAL_STRIPE_STATUS);\n setStripeErrors({});\n closeModal();\n }, [form, closeModal]);\n\n const handleStripeChange = useCallback(\n (field: keyof StripeElementsStatus, complete: boolean) => {\n setStripeStatus((prev) => ({ ...prev, [field]: complete }));\n if (complete) {\n setStripeErrors((prev) => ({ ...prev, [field]: undefined }));\n }\n },\n []\n );\n\n const handleContinue = useCallback(async () => {\n const rhfValid = await form.trigger(['name', 'country', 'personType', 'cpf', 'cnpj']);\n\n const newStripeErrors: Record<string, string | undefined> = {};\n if (!stripeStatus.cardNumber) newStripeErrors.cardNumber = 'Número do cartão é obrigatório';\n if (!stripeStatus.cardExpiry) newStripeErrors.cardExpiry = 'Data de validade é obrigatória';\n if (!stripeStatus.cardCvc) newStripeErrors.cardCvc = 'Código de segurança é obrigatório';\n setStripeErrors(newStripeErrors);\n\n const stripeValid = stripeStatus.cardNumber && stripeStatus.cardExpiry && stripeStatus.cardCvc;\n\n if (rhfValid && stripeValid) {\n form.clearErrors(['fullName', 'cep', 'street', 'streetNumber', 'neighborhood', 'city', 'state']);\n setCurrentStep(2);\n }\n }, [form, stripeStatus]);\n\n const handleBack = useCallback(() => {\n setCurrentStep(1);\n }, []);\n\n async function handleSubmit(data: CardFormData) {\n if (!stripe || !elements) return;\n\n const cardElement = elements.getElement(CardNumberElement);\n if (!cardElement) return;\n\n const { error, paymentMethod } = await stripe.createPaymentMethod({\n type: 'card',\n card: cardElement,\n billing_details: {\n name: data.fullName,\n address: {\n country: data.country,\n postal_code: data.cep,\n line1: `${data.street}, ${data.streetNumber}`,\n line2: data.complement || undefined,\n city: data.city,\n state: data.state,\n },\n },\n });\n\n if (error) {\n toast.custom(\n (t) => (\n <Toast\n variant=\"error\"\n message=\"Não foi possível adicionar o cartão na Stripe, tente novamente.\"\n toastId={t}\n />\n ),\n { duration: 5000 }\n );\n return;\n }\n\n try {\n const [cardResult] = await Promise.all([\n createCardMutation.mutateAsync({ payment_method_id: paymentMethod.id }),\n updateAccountMutation.mutateAsync({\n financial_document_type: data.personType === 'pf' ? 1 : 2,\n financial_document: data.personType === 'pf' ? data.cpf : data.cnpj,\n financial_name: data.fullName,\n zipcode: data.cep,\n address: data.street,\n address_number: data.streetNumber,\n address_complement: data.complement || '',\n neighborhood: data.neighborhood,\n city: data.city,\n state: data.state,\n }),\n ]);\n\n if (cardResult.success && cardResult.data?.id != null) {\n onCardAdded?.(cardResult.data.id.toString());\n }\n\n toast.custom(\n (t) => <Toast variant=\"success\" message=\"Cartão adicionado com sucesso.\" toastId={t} />,\n { duration: 5000 }\n );\n handleClose();\n } catch {\n toast.custom(\n (t) => (\n <Toast\n variant=\"error\"\n message=\"Não foi possível salvar o seu novo cartão, tente novamente.\"\n toastId={t}\n />\n ),\n { duration: 5000 }\n );\n }\n }\n\n const isSubmitting =\n createCardMutation.isPending ||\n updateAccountMutation.isPending ||\n form.formState.isSubmitting;\n\n const watchedValues = form.watch(['name', 'country', 'personType', 'cpf', 'cnpj', 'fullName', 'cep', 'street', 'streetNumber', 'neighborhood', 'city', 'state']);\n const [name, country, personType, cpf, cnpj, fullName, cep, street, streetNumber, neighborhood, city, state] = watchedValues;\n const isStep1Valid =\n !!name &&\n !!country &&\n !!personType &&\n (personType === 'pf' ? !!cpf && cpf.length >= 14 : !!cnpj && cnpj.length >= 18) &&\n stripeStatus.cardNumber &&\n stripeStatus.cardExpiry &&\n stripeStatus.cardCvc;\n const isStep2Valid =\n !!fullName &&\n !!cep && cep.length >= 9 &&\n !!street &&\n !!streetNumber &&\n !!neighborhood &&\n !!city &&\n !!state;\n\n return (\n <Dialog open={isOpen} onOpenChange={handleClose}>\n <DialogContent\n showCloseButton={false}\n 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\"\n >\n <DialogHeader className=\"p-0\">\n <div className=\"flex items-center justify-center px-4 py-3 relative border-b border-zinc-200 lg:border-b-0\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950 text-center\">\n {currentStep === 1 ? 'Adicionar cartão' : 'Dados de cobrança'}\n </DialogTitle>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"size-8! p-0 absolute right-4\"\n onClick={handleClose}\n >\n <IconX size={18} />\n </Button>\n </div>\n </DialogHeader>\n\n {/* Progress bar */}\n <div className=\"h-1 bg-zinc-100 w-full\">\n <div\n className={`h-full transition-all duration-300 ease-in-out ${isDefaultWl ? 'bg-cyan-400' : 'bg-zinc-400'}`}\n style={{ width: currentStep === 1 ? '50%' : '100%' }}\n />\n </div>\n\n <form\n onSubmit={form.handleSubmit(handleSubmit)}\n className=\"flex flex-col flex-1 lg:flex-none\"\n >\n <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 1 ? 'hidden' : ''}`}>\n <CardFormFields\n form={form}\n onStripeChange={handleStripeChange}\n stripeErrors={stripeErrors}\n />\n </div>\n <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 2 ? 'hidden' : ''}`}>\n <BillingFormFields form={form} />\n </div>\n\n <div className=\"flex justify-between items-center p-4 lg:p-5 border-t border-zinc-200 gap-2 mt-auto lg:mt-0\">\n {currentStep === 1 ? (\n <>\n <Button variant=\"secondary\" type=\"button\" onClick={handleClose} className=\"h-10!\">\n Cancelar\n </Button>\n <Button\n type=\"button\"\n className=\"h-10!\"\n onClick={handleContinue}\n disabled={!isStep1Valid}\n >\n Continuar\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"secondary\" type=\"button\" onClick={handleBack} className=\"h-10!\">\n Voltar\n </Button>\n <Button type=\"submit\" className=\"h-10!\" disabled={isSubmitting || !isStep2Valid}>\n {isSubmitting && <IconLoader2 className=\"size-4 animate-spin\" />}\n {isSubmitting ? 'Adicionando cartão...' : 'Adicionar cartão'}\n </Button>\n </>\n )}\n </div>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/modals/cards/AddCardModal.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { useCallback, useState } from 'react';\r\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';\r\nimport { Button } from '../../ui/buttons/Button';\r\nimport { Toast } from '../../ui/feedback/Toast';\r\nimport { useModalManager } from '../../../store/useModalManager';\r\nimport { useCreateCard } from '../../../modules/cards/hooks/create-card.hook';\r\nimport { useUpdateAccount } from '../../../modules/accounts/hooks/useAccountManagement';\r\nimport { CardFormFields, BillingFormFields, cardFormSchema } from './CardFormFields';\r\nimport type { CardFormData, StripeElementsStatus } from './CardFormFields';\r\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\r\nimport { IconLoader2, IconX } from '@tabler/icons-react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { CardNumberElement, useElements, useStripe } from '@stripe/react-stripe-js';\r\nimport { toast } from 'sonner';\r\n\r\nconst INITIAL_STRIPE_STATUS: StripeElementsStatus = {\r\n cardNumber: false,\r\n cardExpiry: false,\r\n cardCvc: false,\r\n};\r\n\r\nexport default function AddCardModal() {\r\n const { activeModal, modalData, closeModal } = useModalManager();\r\n const isDefaultWl = useIsDefaultWhitelabel();\r\n const isOpen = activeModal === 'addCardModal';\r\n const [currentStep, setCurrentStep] = useState(1);\r\n const [stripeStatus, setStripeStatus] = useState<StripeElementsStatus>(INITIAL_STRIPE_STATUS);\r\n const [stripeErrors, setStripeErrors] = useState<Record<string, string | undefined>>({});\r\n\r\n const onCardAdded = modalData.onCardAdded as ((cardId: string) => void) | undefined;\r\n\r\n const createCardMutation = useCreateCard();\r\n const updateAccountMutation = useUpdateAccount();\r\n const elements = useElements();\r\n const stripe = useStripe();\r\n\r\n const form = useForm<CardFormData>({\r\n resolver: zodResolver(cardFormSchema),\r\n mode: 'onSubmit',\r\n reValidateMode: 'onChange',\r\n defaultValues: {\r\n country: 'BR',\r\n personType: 'pf',\r\n },\r\n });\r\n\r\n const handleClose = useCallback(() => {\r\n form.reset();\r\n setCurrentStep(1);\r\n setStripeStatus(INITIAL_STRIPE_STATUS);\r\n setStripeErrors({});\r\n closeModal();\r\n }, [form, closeModal]);\r\n\r\n const handleStripeChange = useCallback(\r\n (field: keyof StripeElementsStatus, complete: boolean) => {\r\n setStripeStatus((prev) => ({ ...prev, [field]: complete }));\r\n if (complete) {\r\n setStripeErrors((prev) => ({ ...prev, [field]: undefined }));\r\n }\r\n },\r\n []\r\n );\r\n\r\n const handleContinue = useCallback(async () => {\r\n const rhfValid = await form.trigger(['name', 'country', 'personType', 'cpf', 'cnpj']);\r\n\r\n const newStripeErrors: Record<string, string | undefined> = {};\r\n if (!stripeStatus.cardNumber) newStripeErrors.cardNumber = 'Número do cartão é obrigatório';\r\n if (!stripeStatus.cardExpiry) newStripeErrors.cardExpiry = 'Data de validade é obrigatória';\r\n if (!stripeStatus.cardCvc) newStripeErrors.cardCvc = 'Código de segurança é obrigatório';\r\n setStripeErrors(newStripeErrors);\r\n\r\n const stripeValid = stripeStatus.cardNumber && stripeStatus.cardExpiry && stripeStatus.cardCvc;\r\n\r\n if (rhfValid && stripeValid) {\r\n form.clearErrors(['fullName', 'cep', 'street', 'streetNumber', 'neighborhood', 'city', 'state']);\r\n setCurrentStep(2);\r\n }\r\n }, [form, stripeStatus]);\r\n\r\n const handleBack = useCallback(() => {\r\n setCurrentStep(1);\r\n }, []);\r\n\r\n async function handleSubmit(data: CardFormData) {\r\n if (!stripe || !elements) return;\r\n\r\n const cardElement = elements.getElement(CardNumberElement);\r\n if (!cardElement) return;\r\n\r\n const { error, paymentMethod } = await stripe.createPaymentMethod({\r\n type: 'card',\r\n card: cardElement,\r\n billing_details: {\r\n name: data.fullName,\r\n address: {\r\n country: data.country,\r\n postal_code: data.cep,\r\n line1: `${data.street}, ${data.streetNumber}`,\r\n line2: data.complement || undefined,\r\n city: data.city,\r\n state: data.state,\r\n },\r\n },\r\n });\r\n\r\n if (error) {\r\n toast.custom(\r\n (t) => (\r\n <Toast\r\n variant=\"error\"\r\n message=\"Não foi possível adicionar o cartão na Stripe, tente novamente.\"\r\n toastId={t}\r\n />\r\n ),\r\n { duration: 5000 }\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n const [cardResult] = await Promise.all([\r\n createCardMutation.mutateAsync({ payment_method_id: paymentMethod.id }),\r\n updateAccountMutation.mutateAsync({\r\n financial_document_type: data.personType === 'pf' ? 1 : 2,\r\n financial_document: data.personType === 'pf' ? data.cpf : data.cnpj,\r\n financial_name: data.fullName,\r\n zipcode: data.cep,\r\n address: data.street,\r\n address_number: data.streetNumber,\r\n address_complement: data.complement || '',\r\n neighborhood: data.neighborhood,\r\n city: data.city,\r\n state: data.state,\r\n }),\r\n ]);\r\n\r\n if (cardResult.success && cardResult.data?.id != null) {\r\n onCardAdded?.(cardResult.data.id.toString());\r\n }\r\n\r\n toast.custom(\r\n (t) => <Toast variant=\"success\" message=\"Cartão adicionado com sucesso.\" toastId={t} />,\r\n { duration: 5000 }\r\n );\r\n handleClose();\r\n } catch {\r\n toast.custom(\r\n (t) => (\r\n <Toast\r\n variant=\"error\"\r\n message=\"Não foi possível salvar o seu novo cartão, tente novamente.\"\r\n toastId={t}\r\n />\r\n ),\r\n { duration: 5000 }\r\n );\r\n }\r\n }\r\n\r\n const isSubmitting =\r\n createCardMutation.isPending ||\r\n updateAccountMutation.isPending ||\r\n form.formState.isSubmitting;\r\n\r\n const watchedValues = form.watch(['name', 'country', 'personType', 'cpf', 'cnpj', 'fullName', 'cep', 'street', 'streetNumber', 'neighborhood', 'city', 'state']);\r\n const [name, country, personType, cpf, cnpj, fullName, cep, street, streetNumber, neighborhood, city, state] = watchedValues;\r\n const isStep1Valid =\r\n !!name &&\r\n !!country &&\r\n !!personType &&\r\n (personType === 'pf' ? !!cpf && cpf.length >= 14 : !!cnpj && cnpj.length >= 18) &&\r\n stripeStatus.cardNumber &&\r\n stripeStatus.cardExpiry &&\r\n stripeStatus.cardCvc;\r\n const isStep2Valid =\r\n !!fullName &&\r\n !!cep && cep.length >= 9 &&\r\n !!street &&\r\n !!streetNumber &&\r\n !!neighborhood &&\r\n !!city &&\r\n !!state;\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={handleClose}>\r\n <DialogContent\r\n showCloseButton={false}\r\n 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\"\r\n >\r\n <DialogHeader className=\"p-0\">\r\n <div className=\"flex items-center justify-center px-4 py-3 relative border-b border-zinc-200 lg:border-b-0\">\r\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950 text-center\">\r\n {currentStep === 1 ? 'Adicionar cartão' : 'Dados de cobrança'}\r\n </DialogTitle>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n className=\"size-8! p-0 absolute right-4\"\r\n onClick={handleClose}\r\n >\r\n <IconX size={18} />\r\n </Button>\r\n </div>\r\n </DialogHeader>\r\n\r\n {/* Progress bar */}\r\n <div className=\"h-1 bg-zinc-100 w-full\">\r\n <div\r\n className={`h-full transition-all duration-300 ease-in-out ${isDefaultWl ? 'bg-cyan-400' : 'bg-zinc-400'}`}\r\n style={{ width: currentStep === 1 ? '50%' : '100%' }}\r\n />\r\n </div>\r\n\r\n <form\r\n onSubmit={form.handleSubmit(handleSubmit)}\r\n className=\"flex flex-col flex-1 lg:flex-none\"\r\n >\r\n <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 1 ? 'hidden' : ''}`}>\r\n <CardFormFields\r\n form={form}\r\n onStripeChange={handleStripeChange}\r\n stripeErrors={stripeErrors}\r\n />\r\n </div>\r\n <div className={`flex flex-col gap-6 lg:gap-8 p-4 lg:p-5 flex-1 lg:flex-none ${currentStep !== 2 ? 'hidden' : ''}`}>\r\n <BillingFormFields form={form} />\r\n </div>\r\n\r\n <div className=\"flex justify-between items-center p-4 lg:p-5 border-t border-zinc-200 gap-2 mt-auto lg:mt-0\">\r\n {currentStep === 1 ? (\r\n <>\r\n <Button variant=\"secondary\" type=\"button\" onClick={handleClose} className=\"h-10!\">\r\n Cancelar\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n className=\"h-10!\"\r\n onClick={handleContinue}\r\n disabled={!isStep1Valid}\r\n >\r\n Continuar\r\n </Button>\r\n </>\r\n ) : (\r\n <>\r\n <Button variant=\"secondary\" type=\"button\" onClick={handleBack} className=\"h-10!\">\r\n Voltar\r\n </Button>\r\n <Button type=\"submit\" className=\"h-10!\" disabled={isSubmitting || !isStep2Valid}>\r\n {isSubmitting && <IconLoader2 className=\"size-4 animate-spin\" />}\r\n {isSubmitting ? 'Adicionando cartão...' : 'Adicionar cartão'}\r\n </Button>\r\n </>\r\n )}\r\n </div>\r\n </form>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/modals/cards/CardFormFields.tsx"],"sourcesContent":["\"use client\";\n\nimport { UseFormReturn } from \"react-hook-form\";\nimport { useViaCep } from \"../../../modules/accounts/hooks/useViaCep\";\nimport { FormField } from \"../../ui/form/FormField\";\nimport { SelectField } from \"../../ui/form/SelectField\";\nimport {\n formatCPF,\n formatCNPJ,\n formatPostalCode,\n} from \"../../../utils/format/masks\";\nimport z from \"zod\";\nimport {\n CardCvcElement,\n CardExpiryElement,\n CardNumberElement,\n} from \"@stripe/react-stripe-js\";\n\nconst stripeElementOptions = {\n style: {\n base: {\n fontSize: \"16px\",\n color: \"#030712\",\n fontFamily: \"Inter, sans-serif\",\n \"::placeholder\": {\n color: \"#9ca3af\",\n },\n },\n },\n};\n\nexport const cardFormSchema = z\n .object({\n name: z.string().min(1, \"Nome é obrigatório\"),\n country: z.string().min(1, \"País é obrigatório\"),\n personType: z.enum([\"pf\", \"pj\"]),\n cpf: z.string().optional(),\n cnpj: z.string().optional(),\n fullName: z.string().min(1, \"Nome completo é obrigatório\"),\n cep: z.string().min(9, \"CEP é obrigatório\"),\n street: z.string().min(1, \"Endereço é obrigatório\"),\n streetNumber: z.string().min(1, \"Número é obrigatório\"),\n city: z.string().min(1, \"Cidade é obrigatória\"),\n state: z.string().min(1, \"UF é obrigatório\"),\n neighborhood: z.string().min(1, \"Bairro é obrigatório\"),\n complement: z.string().optional(),\n })\n .refine(\n (data) => {\n if (data.personType === \"pf\") return !!data.cpf && data.cpf.length >= 14;\n return !!data.cnpj && data.cnpj.length >= 18;\n },\n {\n message: \"Documento é obrigatório\",\n path: [\"cpf\"],\n },\n );\n\nexport type CardFormData = z.infer<typeof cardFormSchema>;\n\nexport type StripeElementsStatus = {\n cardNumber: boolean;\n cardExpiry: boolean;\n cardCvc: boolean;\n};\n\nexport const STEP1_FIELDS = [\n \"name\",\n \"country\",\n \"personType\",\n \"cpf\",\n \"cnpj\",\n] as const;\n\ntype CardFormFieldsProps = {\n readonly form: UseFormReturn<CardFormData>;\n readonly onStripeChange: (\n field: keyof StripeElementsStatus,\n complete: boolean,\n ) => void;\n readonly stripeErrors: {\n cardNumber?: string;\n cardExpiry?: string;\n cardCvc?: string;\n };\n};\n\nexport function CardFormFields({\n form,\n onStripeChange,\n stripeErrors,\n}: CardFormFieldsProps) {\n const {\n register,\n watch,\n setValue,\n formState: { errors },\n } = form;\n\n const personType = watch(\"personType\");\n\n return (\n <div className=\"flex flex-col gap-5\">\n <FormField\n label=\"Nome impresso no cartão\"\n placeholder=\"Digite aqui\"\n {...register(\"name\")}\n error={!!errors.name}\n errorMessage={errors.name?.message}\n />\n\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\n Número do cartão\n </label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400 relative\">\n <div className=\"w-full\">\n <CardNumberElement\n options={{ ...stripeElementOptions, showIcon: true }}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardNumber\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardNumber && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardNumber}\n </p>\n )}\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-1 flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\n Data de validade\n </label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\n <div className=\"w-full\">\n <CardExpiryElement\n options={stripeElementOptions}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardExpiry\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardExpiry && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardExpiry}\n </p>\n )}\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1.5\">\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">CVC</label>\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\n <div className=\"w-full\">\n <CardCvcElement\n options={stripeElementOptions}\n onChange={(e: { complete: boolean }) =>\n onStripeChange(\"cardCvc\", e.complete)\n }\n />\n </div>\n </div>\n {stripeErrors.cardCvc && (\n <p className=\"paragraph-xsmall-semibold text-red-600\">\n {stripeErrors.cardCvc}\n </p>\n )}\n </div>\n </div>\n\n <SelectField\n label=\"País\"\n placeholder=\"Selecione\"\n value={watch(\"country\")}\n onChange={(value) => setValue(\"country\", value as string)}\n options={[\n { value: \"BR\", label: \"Brasil\" },\n { value: \"ES\", label: \"Espanha\" },\n { value: \"US\", label: \"Estados Unidos\" },\n ]}\n />\n\n <div className=\"flex gap-4\">\n <SelectField\n label=\"Tipo de pessoa\"\n placeholder=\"Selecione\"\n value={personType}\n onChange={(value) => {\n setValue(\"personType\", value as \"pf\" | \"pj\");\n setValue(\"cpf\", \"\");\n setValue(\"cnpj\", \"\");\n }}\n options={[\n { value: \"pf\", label: \"Pessoa física\" },\n { value: \"pj\", label: \"Pessoa jurídica\" },\n ]}\n containerClassName=\"flex-1\"\n />\n <div className=\"flex-1\">\n {personType === \"pj\" ? (\n <FormField\n label=\"CNPJ\"\n placeholder=\"__.___.___/____-__\"\n {...register(\"cnpj\", {\n onChange: (e) => {\n setValue(\"cnpj\", formatCNPJ(e.target.value));\n },\n })}\n error={!!errors.cpf}\n errorMessage={errors.cpf?.message}\n />\n ) : (\n <FormField\n label=\"CPF\"\n placeholder=\"___.___.___-__\"\n {...register(\"cpf\", {\n onChange: (e) => {\n setValue(\"cpf\", formatCPF(e.target.value));\n },\n })}\n error={!!errors.cpf}\n errorMessage={errors.cpf?.message}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\ntype BillingFormFieldsProps = {\n readonly form: UseFormReturn<CardFormData>;\n};\n\nexport function BillingFormFields({ form }: BillingFormFieldsProps) {\n const {\n register,\n setValue,\n formState: { errors },\n } = form;\n\n const { mutateAsync: lookupCep } = useViaCep();\n\n const handleCepChange = (rawValue: string) => {\n const masked = formatPostalCode(rawValue);\n setValue(\"cep\", masked);\n\n const digits = rawValue.replace(/\\D/g, \"\");\n if (digits.length === 8) {\n lookupCep(digits)\n .then((data) => {\n setValue(\"street\", data.logradouro, { shouldValidate: true });\n setValue(\"neighborhood\", data.bairro, { shouldValidate: true });\n setValue(\"city\", data.localidade, { shouldValidate: true });\n setValue(\"state\", data.uf, { shouldValidate: true });\n })\n .catch(() => {\n // silently ignore — user can fill manually\n });\n }\n };\n\n return (\n <div className=\"flex flex-col gap-5\">\n <FormField\n label=\"Nome completo\"\n placeholder=\"Digite aqui\"\n {...register(\"fullName\")}\n error={!!errors.fullName}\n errorMessage={errors.fullName?.message}\n />\n\n <FormField\n label=\"CEP\"\n placeholder=\"_____-___\"\n {...register(\"cep\", {\n onChange: (e) => handleCepChange(e.target.value),\n })}\n error={!!errors.cep}\n errorMessage={errors.cep?.message}\n />\n\n <div className=\"flex gap-4\">\n <div className=\"flex-[4]\">\n <FormField\n label=\"Endereço\"\n placeholder=\"\"\n {...register(\"street\")}\n error={!!errors.street}\n errorMessage={errors.street?.message}\n />\n </div>\n <div className=\"flex-[1]\">\n <FormField\n label=\"Número\"\n placeholder=\"\"\n {...register(\"streetNumber\")}\n error={!!errors.streetNumber}\n errorMessage={errors.streetNumber?.message}\n />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <div className=\"flex-1\">\n <FormField\n label=\"Cidade\"\n placeholder=\"\"\n {...register(\"city\")}\n error={!!errors.city}\n errorMessage={errors.city?.message}\n />\n </div>\n <div className=\"flex-1\">\n <FormField\n label=\"UF\"\n placeholder=\"\"\n {...register(\"state\")}\n error={!!errors.state}\n errorMessage={errors.state?.message}\n />\n </div>\n </div>\n\n <div className=\"flex gap-4\">\n <FormField\n label=\"Bairro\"\n placeholder=\"\"\n {...register(\"neighborhood\")}\n error={!!errors.neighborhood}\n errorMessage={errors.neighborhood?.message}\n />\n <FormField\n label=\"Complemento\"\n optional\n placeholder=\"\"\n {...register(\"complement\")}\n error={!!errors.complement}\n errorMessage={errors.complement?.message}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/modals/cards/CardFormFields.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { UseFormReturn } from \"react-hook-form\";\r\nimport { useViaCep } from \"../../../modules/accounts/hooks/useViaCep\";\r\nimport { FormField } from \"../../ui/form/FormField\";\r\nimport { SelectField } from \"../../ui/form/SelectField\";\r\nimport {\r\n formatCPF,\r\n formatCNPJ,\r\n formatPostalCode,\r\n} from \"../../../utils/format/masks\";\r\nimport z from \"zod\";\r\nimport {\r\n CardCvcElement,\r\n CardExpiryElement,\r\n CardNumberElement,\r\n} from \"@stripe/react-stripe-js\";\r\n\r\nconst stripeElementOptions = {\r\n style: {\r\n base: {\r\n fontSize: \"16px\",\r\n color: \"#030712\",\r\n fontFamily: \"Inter, sans-serif\",\r\n \"::placeholder\": {\r\n color: \"#9ca3af\",\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const cardFormSchema = z\r\n .object({\r\n name: z.string().min(1, \"Nome é obrigatório\"),\r\n country: z.string().min(1, \"País é obrigatório\"),\r\n personType: z.enum([\"pf\", \"pj\"]),\r\n cpf: z.string().optional(),\r\n cnpj: z.string().optional(),\r\n fullName: z.string().min(1, \"Nome completo é obrigatório\"),\r\n cep: z.string().min(9, \"CEP é obrigatório\"),\r\n street: z.string().min(1, \"Endereço é obrigatório\"),\r\n streetNumber: z.string().min(1, \"Número é obrigatório\"),\r\n city: z.string().min(1, \"Cidade é obrigatória\"),\r\n state: z.string().min(1, \"UF é obrigatório\"),\r\n neighborhood: z.string().min(1, \"Bairro é obrigatório\"),\r\n complement: z.string().optional(),\r\n })\r\n .refine(\r\n (data) => {\r\n if (data.personType === \"pf\") return !!data.cpf && data.cpf.length >= 14;\r\n return !!data.cnpj && data.cnpj.length >= 18;\r\n },\r\n {\r\n message: \"Documento é obrigatório\",\r\n path: [\"cpf\"],\r\n },\r\n );\r\n\r\nexport type CardFormData = z.infer<typeof cardFormSchema>;\r\n\r\nexport type StripeElementsStatus = {\r\n cardNumber: boolean;\r\n cardExpiry: boolean;\r\n cardCvc: boolean;\r\n};\r\n\r\nexport const STEP1_FIELDS = [\r\n \"name\",\r\n \"country\",\r\n \"personType\",\r\n \"cpf\",\r\n \"cnpj\",\r\n] as const;\r\n\r\ntype CardFormFieldsProps = {\r\n readonly form: UseFormReturn<CardFormData>;\r\n readonly onStripeChange: (\r\n field: keyof StripeElementsStatus,\r\n complete: boolean,\r\n ) => void;\r\n readonly stripeErrors: {\r\n cardNumber?: string;\r\n cardExpiry?: string;\r\n cardCvc?: string;\r\n };\r\n};\r\n\r\nexport function CardFormFields({\r\n form,\r\n onStripeChange,\r\n stripeErrors,\r\n}: CardFormFieldsProps) {\r\n const {\r\n register,\r\n watch,\r\n setValue,\r\n formState: { errors },\r\n } = form;\r\n\r\n const personType = watch(\"personType\");\r\n\r\n return (\r\n <div className=\"flex flex-col gap-5\">\r\n <FormField\r\n label=\"Nome impresso no cartão\"\r\n placeholder=\"Digite aqui\"\r\n {...register(\"name\")}\r\n error={!!errors.name}\r\n errorMessage={errors.name?.message}\r\n />\r\n\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\r\n Número do cartão\r\n </label>\r\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400 relative\">\r\n <div className=\"w-full\">\r\n <CardNumberElement\r\n options={{ ...stripeElementOptions, showIcon: true }}\r\n onChange={(e: { complete: boolean }) =>\r\n onStripeChange(\"cardNumber\", e.complete)\r\n }\r\n />\r\n </div>\r\n </div>\r\n {stripeErrors.cardNumber && (\r\n <p className=\"paragraph-xsmall-semibold text-red-600\">\r\n {stripeErrors.cardNumber}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex gap-4\">\r\n <div className=\"flex-1 flex flex-col gap-1.5\">\r\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">\r\n Data de validade\r\n </label>\r\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\r\n <div className=\"w-full\">\r\n <CardExpiryElement\r\n options={stripeElementOptions}\r\n onChange={(e: { complete: boolean }) =>\r\n onStripeChange(\"cardExpiry\", e.complete)\r\n }\r\n />\r\n </div>\r\n </div>\r\n {stripeErrors.cardExpiry && (\r\n <p className=\"paragraph-xsmall-semibold text-red-600\">\r\n {stripeErrors.cardExpiry}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1 flex flex-col gap-1.5\">\r\n <label className=\"paragraph-xsmall-semibold text-zinc-600\">CVC</label>\r\n <div className=\"h-10 px-3 flex items-center w-full border border-zinc-200 rounded-lg bg-white transition-colors focus-within:border-zinc-400\">\r\n <div className=\"w-full\">\r\n <CardCvcElement\r\n options={stripeElementOptions}\r\n onChange={(e: { complete: boolean }) =>\r\n onStripeChange(\"cardCvc\", e.complete)\r\n }\r\n />\r\n </div>\r\n </div>\r\n {stripeErrors.cardCvc && (\r\n <p className=\"paragraph-xsmall-semibold text-red-600\">\r\n {stripeErrors.cardCvc}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <SelectField\r\n label=\"País\"\r\n placeholder=\"Selecione\"\r\n value={watch(\"country\")}\r\n onChange={(value) => setValue(\"country\", value as string)}\r\n options={[\r\n { value: \"BR\", label: \"Brasil\" },\r\n { value: \"ES\", label: \"Espanha\" },\r\n { value: \"US\", label: \"Estados Unidos\" },\r\n ]}\r\n />\r\n\r\n <div className=\"flex gap-4\">\r\n <SelectField\r\n label=\"Tipo de pessoa\"\r\n placeholder=\"Selecione\"\r\n value={personType}\r\n onChange={(value) => {\r\n setValue(\"personType\", value as \"pf\" | \"pj\");\r\n setValue(\"cpf\", \"\");\r\n setValue(\"cnpj\", \"\");\r\n }}\r\n options={[\r\n { value: \"pf\", label: \"Pessoa física\" },\r\n { value: \"pj\", label: \"Pessoa jurídica\" },\r\n ]}\r\n containerClassName=\"flex-1\"\r\n />\r\n <div className=\"flex-1\">\r\n {personType === \"pj\" ? (\r\n <FormField\r\n label=\"CNPJ\"\r\n placeholder=\"__.___.___/____-__\"\r\n {...register(\"cnpj\", {\r\n onChange: (e) => {\r\n setValue(\"cnpj\", formatCNPJ(e.target.value));\r\n },\r\n })}\r\n error={!!errors.cpf}\r\n errorMessage={errors.cpf?.message}\r\n />\r\n ) : (\r\n <FormField\r\n label=\"CPF\"\r\n placeholder=\"___.___.___-__\"\r\n {...register(\"cpf\", {\r\n onChange: (e) => {\r\n setValue(\"cpf\", formatCPF(e.target.value));\r\n },\r\n })}\r\n error={!!errors.cpf}\r\n errorMessage={errors.cpf?.message}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BillingFormFieldsProps = {\r\n readonly form: UseFormReturn<CardFormData>;\r\n};\r\n\r\nexport function BillingFormFields({ form }: BillingFormFieldsProps) {\r\n const {\r\n register,\r\n setValue,\r\n formState: { errors },\r\n } = form;\r\n\r\n const { mutateAsync: lookupCep } = useViaCep();\r\n\r\n const handleCepChange = (rawValue: string) => {\r\n const masked = formatPostalCode(rawValue);\r\n setValue(\"cep\", masked);\r\n\r\n const digits = rawValue.replace(/\\D/g, \"\");\r\n if (digits.length === 8) {\r\n lookupCep(digits)\r\n .then((data) => {\r\n setValue(\"street\", data.logradouro, { shouldValidate: true });\r\n setValue(\"neighborhood\", data.bairro, { shouldValidate: true });\r\n setValue(\"city\", data.localidade, { shouldValidate: true });\r\n setValue(\"state\", data.uf, { shouldValidate: true });\r\n })\r\n .catch(() => {\r\n // silently ignore — user can fill manually\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col gap-5\">\r\n <FormField\r\n label=\"Nome completo\"\r\n placeholder=\"Digite aqui\"\r\n {...register(\"fullName\")}\r\n error={!!errors.fullName}\r\n errorMessage={errors.fullName?.message}\r\n />\r\n\r\n <FormField\r\n label=\"CEP\"\r\n placeholder=\"_____-___\"\r\n {...register(\"cep\", {\r\n onChange: (e) => handleCepChange(e.target.value),\r\n })}\r\n error={!!errors.cep}\r\n errorMessage={errors.cep?.message}\r\n />\r\n\r\n <div className=\"flex gap-4\">\r\n <div className=\"flex-[4]\">\r\n <FormField\r\n label=\"Endereço\"\r\n placeholder=\"\"\r\n {...register(\"street\")}\r\n error={!!errors.street}\r\n errorMessage={errors.street?.message}\r\n />\r\n </div>\r\n <div className=\"flex-[1]\">\r\n <FormField\r\n label=\"Número\"\r\n placeholder=\"\"\r\n {...register(\"streetNumber\")}\r\n error={!!errors.streetNumber}\r\n errorMessage={errors.streetNumber?.message}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex gap-4\">\r\n <div className=\"flex-1\">\r\n <FormField\r\n label=\"Cidade\"\r\n placeholder=\"\"\r\n {...register(\"city\")}\r\n error={!!errors.city}\r\n errorMessage={errors.city?.message}\r\n />\r\n </div>\r\n <div className=\"flex-1\">\r\n <FormField\r\n label=\"UF\"\r\n placeholder=\"\"\r\n {...register(\"state\")}\r\n error={!!errors.state}\r\n errorMessage={errors.state?.message}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex gap-4\">\r\n <FormField\r\n label=\"Bairro\"\r\n placeholder=\"\"\r\n {...register(\"neighborhood\")}\r\n error={!!errors.neighborhood}\r\n errorMessage={errors.neighborhood?.message}\r\n />\r\n <FormField\r\n label=\"Complemento\"\r\n optional\r\n placeholder=\"\"\r\n {...register(\"complement\")}\r\n error={!!errors.complement}\r\n errorMessage={errors.complement?.message}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/navigation/CancelledSubscriptionBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertOctagon, IconX } from '@tabler/icons-react';\nimport { formatShortDate } from '../../infra/utils/date';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\n\ninterface CancelledSubscriptionBannerProps {\n onReactivate?: () => void;\n}\n\nexport function CancelledSubscriptionBanner({ onReactivate }: CancelledSubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n const dueDate = new Date(subscription?.date_due);\n const today = new Date();\n const isPastDue = today >= dueDate;\n const formattedDate = formatShortDate(dueDate);\n\n const isTrial = subscription?.type === 'trial';\n\n if (!visible) return null;\n if (isTrial && !isPastDue) return null;\n if (!isTrial && (!subscription?.date_cancellation || isPastDue)) return null;\n\n return (\n <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\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-red-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'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertOctagon size={16} className=\"text-white shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-white\">\n {isPastDue\n ? 'Sua assinatura foi cancelada e suas páginas foram retiradas do ar.'\n : `Assinatura cancelada! Suas páginas serão retiradas do ar no dia ${formattedDate}!`}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onReactivate}\n >\n <span className=\"paragraph-xsmall-semibold text-white underline\">\n Reativar assinatura\n </span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-red-200\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAsCQ,SACE,KADF;AApCR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,kBAAkB,aAAa;AACxC,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AAM/B,SAAS,4BAA4B,EAAE,aAAa,GAAqC;AAC9F,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AACvD,QAAM,UAAU,IAAI,KAAK,cAAc,QAAQ;AAC/C,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,YAAY,SAAS;AAC3B,QAAM,gBAAgB,gBAAgB,OAAO;AAE7C,QAAM,UAAU,cAAc,SAAS;AAEvC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,WAAW,CAAC,UAAW,QAAO;AAClC,MAAI,CAAC,YAAY,CAAC,cAAc,qBAAqB,WAAY,QAAO;AAExE,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8NAA8N,WAAW,mCAAmC,mBAAmB;AAAA,MAE1S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,oBAAiB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC5D,oBAAC,UAAK,WAAU,wCACb,sBACG,0EACA,yEAAmE,aAAa,KACtF;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDAAiD,iCAEjE;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,gBAAe,GAC5C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/navigation/CancelledSubscriptionBanner.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { useState, useEffect, useCallback } from 'react';\r\nimport { IconAlertOctagon, IconX } from '@tabler/icons-react';\r\nimport { formatShortDate } from '../../infra/utils/date';\r\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\r\n\r\ninterface CancelledSubscriptionBannerProps {\r\n onReactivate?: () => void;\r\n}\r\n\r\nexport function CancelledSubscriptionBanner({ onReactivate }: CancelledSubscriptionBannerProps) {\r\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\r\n const [visible, setVisible] = useState(true);\r\n const [animated, setAnimated] = useState(false);\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => setAnimated(true), 50);\r\n return () => clearTimeout(timer);\r\n }, []);\r\n\r\n const dismiss = useCallback(() => setVisible(false), []);\r\n const dueDate = new Date(subscription?.date_due);\r\n const today = new Date();\r\n const isPastDue = today >= dueDate;\r\n const formattedDate = formatShortDate(dueDate);\r\n\r\n const isTrial = subscription?.type === 'trial';\r\n\r\n if (!visible) return null;\r\n if (isTrial && !isPastDue) return null;\r\n if (!isTrial && (!subscription?.date_cancellation || isPastDue)) return null;\r\n\r\n return (\r\n <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\">\r\n <div\r\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-red-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'}`}\r\n >\r\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\r\n <IconAlertOctagon size={16} className=\"text-white shrink-0\" />\r\n <span className=\"paragraph-xsmall-semibold text-white\">\r\n {isPastDue\r\n ? 'Sua assinatura foi cancelada e suas páginas foram retiradas do ar.'\r\n : `Assinatura cancelada! Suas páginas serão retiradas do ar no dia ${formattedDate}!`}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\r\n <button\r\n type=\"button\"\r\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\r\n onClick={onReactivate}\r\n >\r\n <span className=\"paragraph-xsmall-semibold text-white underline\">\r\n Reativar assinatura\r\n </span>\r\n </button>\r\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\r\n <IconX size={18} className=\"text-red-200\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":";AAsCQ,SACE,KADF;AApCR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,kBAAkB,aAAa;AACxC,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AAM/B,SAAS,4BAA4B,EAAE,aAAa,GAAqC;AAC9F,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AACvD,QAAM,UAAU,IAAI,KAAK,cAAc,QAAQ;AAC/C,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,YAAY,SAAS;AAC3B,QAAM,gBAAgB,gBAAgB,OAAO;AAE7C,QAAM,UAAU,cAAc,SAAS;AAEvC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,WAAW,CAAC,UAAW,QAAO;AAClC,MAAI,CAAC,YAAY,CAAC,cAAc,qBAAqB,WAAY,QAAO;AAExE,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8NAA8N,WAAW,mCAAmC,mBAAmB;AAAA,MAE1S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,oBAAiB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC5D,oBAAC,UAAK,WAAU,wCACb,sBACG,0EACA,yEAAmE,aAAa,KACtF;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDAAiD,iCAEjE;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,gBAAe,GAC5C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/navigation/NavItemsContext.ts"],"sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { NavItemConfig } from './subcomponents/NavItems';\n\ninterface NavItemsContextValue {\n navItems: NavItemConfig[];\n setNavItems: (items: NavItemConfig[]) => void;\n mobileVariant: 'sheet' | 'tabs';\n}\n\nexport const NavItemsContext = createContext<NavItemsContextValue>({\n navItems: [],\n setNavItems: () => {},\n mobileVariant: 'sheet',\n});\n\nexport function useNavItemsContext(): NavItemsContextValue {\n return useContext(NavItemsContext);\n}\n"],"mappings":";AAEA,SAAS,eAAe,kBAAkB;AASnC,MAAM,kBAAkB,cAAoC;AAAA,EACjE,UAAU,CAAC;AAAA,EACX,aAAa,MAAM;AAAA,EAAC;AAAA,EACpB,eAAe;AACjB,CAAC;AAEM,SAAS,qBAA2C;AACzD,SAAO,WAAW,eAAe;AACnC;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/navigation/NavItemsContext.ts"],"sourcesContent":["'use client';\r\n\r\nimport { createContext, useContext } from 'react';\r\nimport type { NavItemConfig } from './subcomponents/NavItems';\r\n\r\ninterface NavItemsContextValue {\r\n navItems: NavItemConfig[];\r\n setNavItems: (items: NavItemConfig[]) => void;\r\n mobileVariant: 'sheet' | 'tabs';\r\n}\r\n\r\nexport const NavItemsContext = createContext<NavItemsContextValue>({\r\n navItems: [],\r\n setNavItems: () => {},\r\n mobileVariant: 'sheet',\r\n});\r\n\r\nexport function useNavItemsContext(): NavItemsContextValue {\r\n return useContext(NavItemsContext);\r\n}\r\n"],"mappings":";AAEA,SAAS,eAAe,kBAAkB;AASnC,MAAM,kBAAkB,cAAoC;AAAA,EACjE,UAAU,CAAC;AAAA,EACX,aAAa,MAAM;AAAA,EAAC;AAAA,EACpB,eAAe;AACjB,CAAC;AAEM,SAAS,qBAA2C;AACzD,SAAO,WAAW,eAAe;AACnC;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/navigation/ProjectSelectorPopover.tsx"],"sourcesContent":["'use client';\n\nimport { Dispatch, RefObject, SetStateAction, UIEvent, useCallback } from 'react';\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n UserAvatar,\n} from '../../index';\nimport { IconCheck, IconChevronDown, IconFolderOpen } from '@tabler/icons-react';\nimport type { Project } from '../../modules/projects/types';\n\nexport interface ProjectSelectorPopoverProps {\n open: boolean;\n setOpen: Dispatch<SetStateAction<boolean>>;\n titleRef?: RefObject<HTMLSpanElement | null>;\n projects: Project[];\n selectedProject: Project | null;\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n onLoadMore?: () => void | Promise<unknown>;\n onSelectProject: (project: Project) => void;\n onManageProjects?: () => void;\n search?: string;\n onSearchChange?: (value: string) => void;\n children?: React.ReactNode;\n}\n\nfunction ProjectItemSkeleton() {\n return (\n <div className=\"flex items-center justify-between px-2 py-2 gap-2\">\n <div className=\"flex items-center gap-2 flex-1\">\n <div className=\"skeleton size-9 rounded-lg shrink-0\" />\n <div className=\"skeleton h-4 w-36 rounded\" />\n </div>\n <div className=\"skeleton size-4 rounded-full shrink-0\" />\n </div>\n );\n}\n\nexport function ProjectSelectorPopover({\n open,\n setOpen,\n titleRef,\n projects,\n selectedProject,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n onLoadMore,\n onSelectProject,\n onManageProjects,\n search,\n onSearchChange,\n children,\n}: ProjectSelectorPopoverProps) {\n const handleListScroll = useCallback((event: UIEvent<HTMLDivElement>) => {\n if (!hasNextPage || isFetchingNextPage || !onLoadMore) return;\n\n const target = event.currentTarget;\n const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight;\n\n if (distanceToBottom <= 80) {\n onLoadMore();\n }\n }, [hasNextPage, isFetchingNextPage, onLoadMore]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n {children ?? (\n <button className=\"cursor-pointer\">\n <IconChevronDown\n size={20}\n className={`transition-transform duration-200 ${open ? 'rotate-180 text-gray-950' : 'text-gray-400'}`}\n />\n </button>\n )}\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[296px] max-h-[380px] p-0 bg-white rounded-2xl shadow-md border border-gray-200\"\n align=\"start\"\n sideOffset={8}\n onInteractOutside={(event: Event) => {\n if (titleRef?.current?.contains(event.target as Node)) {\n event.preventDefault();\n }\n }}\n >\n <div className=\"flex flex-col p-3 gap-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"paragraph-small-semibold\">Projetos</span>\n </div>\n <Command className=\"gap-2\" defaultValue=\" \" shouldFilter={!onSearchChange} value=\" \" onValueChange={() => {}}>\n <CommandInput placeholder=\"Busque aqui\" value={search} onValueChange={onSearchChange} />\n <CommandList\n className=\"custom-scrollbar paragraph-small-medium text-gray-600 max-h-[227px]\"\n onScroll={handleListScroll}\n >\n {isLoading ? (\n <>\n <ProjectItemSkeleton />\n <ProjectItemSkeleton />\n <ProjectItemSkeleton />\n <ProjectItemSkeleton />\n </>\n ) : projects.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4\">\n <IconFolderOpen size={28} className=\"text-gray-300\" />\n <span className=\"paragraph-small-medium text-center text-gray-500\">\n Nenhum projeto encontrado.\n <br />\n Crie um projeto para começar.\n </span>\n </div>\n ) : (\n <>\n <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>\n {projects.map((project) => {\n const isSelected = selectedProject?.id === project.id;\n return (\n <CommandItem\n key={project.id}\n value={`${project.title}-${project.id}`}\n keywords={[project.title]}\n className={isSelected ? 'bg-gray-50 min-h-[39px]' : 'min-h-[39px]'}\n onSelect={() => onSelectProject(project)}\n >\n <div className=\"flex items-center justify-between w-full cursor-pointer\">\n <div className=\"flex items-center gap-2 w-full\">\n <UserAvatar\n photo={project.photo}\n name={project.title}\n size={36}\n />\n {project.title}\n </div>\n {isSelected && (\n <IconCheck className=\"size-4 text-gray-950\" />\n )}\n </div>\n </CommandItem>\n );\n })}\n {isFetchingNextPage && (\n <>\n <ProjectItemSkeleton />\n <ProjectItemSkeleton />\n </>\n )}\n </>\n )}\n </CommandList>\n </Command>\n {onManageProjects && (\n <>\n <div className=\"border-t border-gray-200\" />\n <Button\n variant=\"ghost\"\n className=\"h-10! paragraph-small-medium text-gray-600 hover:text-gray-950 hover:bg-zinc-50 w-full justify-center\"\n onClick={onManageProjects}\n >\n Gerenciar projetos\n </Button>\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/navigation/ProjectSelectorPopover.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { Dispatch, RefObject, SetStateAction, UIEvent, useCallback } from 'react';\r\nimport {\r\n Button,\r\n Command,\r\n CommandEmpty,\r\n CommandInput,\r\n CommandItem,\r\n CommandList,\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n UserAvatar,\r\n} from '../../index';\r\nimport { IconCheck, IconChevronDown, IconFolderOpen } from '@tabler/icons-react';\r\nimport type { Project } from '../../modules/projects/types';\r\n\r\nexport interface ProjectSelectorPopoverProps {\r\n open: boolean;\r\n setOpen: Dispatch<SetStateAction<boolean>>;\r\n titleRef?: RefObject<HTMLSpanElement | null>;\r\n projects: Project[];\r\n selectedProject: Project | null;\r\n isLoading?: boolean;\r\n isFetchingNextPage?: boolean;\r\n hasNextPage?: boolean;\r\n onLoadMore?: () => void | Promise<unknown>;\r\n onSelectProject: (project: Project) => void;\r\n onManageProjects?: () => void;\r\n search?: string;\r\n onSearchChange?: (value: string) => void;\r\n children?: React.ReactNode;\r\n}\r\n\r\nfunction ProjectItemSkeleton() {\r\n return (\r\n <div className=\"flex items-center justify-between px-2 py-2 gap-2\">\r\n <div className=\"flex items-center gap-2 flex-1\">\r\n <div className=\"skeleton size-9 rounded-lg shrink-0\" />\r\n <div className=\"skeleton h-4 w-36 rounded\" />\r\n </div>\r\n <div className=\"skeleton size-4 rounded-full shrink-0\" />\r\n </div>\r\n );\r\n}\r\n\r\nexport function ProjectSelectorPopover({\r\n open,\r\n setOpen,\r\n titleRef,\r\n projects,\r\n selectedProject,\r\n isLoading,\r\n isFetchingNextPage,\r\n hasNextPage,\r\n onLoadMore,\r\n onSelectProject,\r\n onManageProjects,\r\n search,\r\n onSearchChange,\r\n children,\r\n}: ProjectSelectorPopoverProps) {\r\n const handleListScroll = useCallback((event: UIEvent<HTMLDivElement>) => {\r\n if (!hasNextPage || isFetchingNextPage || !onLoadMore) return;\r\n\r\n const target = event.currentTarget;\r\n const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight;\r\n\r\n if (distanceToBottom <= 80) {\r\n onLoadMore();\r\n }\r\n }, [hasNextPage, isFetchingNextPage, onLoadMore]);\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n {children ?? (\r\n <button className=\"cursor-pointer\">\r\n <IconChevronDown\r\n size={20}\r\n className={`transition-transform duration-200 ${open ? 'rotate-180 text-gray-950' : 'text-gray-400'}`}\r\n />\r\n </button>\r\n )}\r\n </PopoverTrigger>\r\n <PopoverContent\r\n className=\"w-[296px] max-h-[380px] p-0 bg-white rounded-2xl shadow-md border border-gray-200\"\r\n align=\"start\"\r\n sideOffset={8}\r\n onInteractOutside={(event: Event) => {\r\n if (titleRef?.current?.contains(event.target as Node)) {\r\n event.preventDefault();\r\n }\r\n }}\r\n >\r\n <div className=\"flex flex-col p-3 gap-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"paragraph-small-semibold\">Projetos</span>\r\n </div>\r\n <Command className=\"gap-2\" defaultValue=\" \" shouldFilter={!onSearchChange} value=\" \" onValueChange={() => {}}>\r\n <CommandInput placeholder=\"Busque aqui\" value={search} onValueChange={onSearchChange} />\r\n <CommandList\r\n className=\"custom-scrollbar paragraph-small-medium text-gray-600 max-h-[227px]\"\r\n onScroll={handleListScroll}\r\n >\r\n {isLoading ? (\r\n <>\r\n <ProjectItemSkeleton />\r\n <ProjectItemSkeleton />\r\n <ProjectItemSkeleton />\r\n <ProjectItemSkeleton />\r\n </>\r\n ) : projects.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4\">\r\n <IconFolderOpen size={28} className=\"text-gray-300\" />\r\n <span className=\"paragraph-small-medium text-center text-gray-500\">\r\n Nenhum projeto encontrado.\r\n <br />\r\n Crie um projeto para começar.\r\n </span>\r\n </div>\r\n ) : (\r\n <>\r\n <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>\r\n {projects.map((project) => {\r\n const isSelected = selectedProject?.id === project.id;\r\n return (\r\n <CommandItem\r\n key={project.id}\r\n value={`${project.title}-${project.id}`}\r\n keywords={[project.title]}\r\n className={isSelected ? 'bg-gray-50 min-h-[39px]' : 'min-h-[39px]'}\r\n onSelect={() => onSelectProject(project)}\r\n >\r\n <div className=\"flex items-center justify-between w-full cursor-pointer\">\r\n <div className=\"flex items-center gap-2 w-full\">\r\n <UserAvatar\r\n photo={project.photo}\r\n name={project.title}\r\n size={36}\r\n />\r\n {project.title}\r\n </div>\r\n {isSelected && (\r\n <IconCheck className=\"size-4 text-gray-950\" />\r\n )}\r\n </div>\r\n </CommandItem>\r\n );\r\n })}\r\n {isFetchingNextPage && (\r\n <>\r\n <ProjectItemSkeleton />\r\n <ProjectItemSkeleton />\r\n </>\r\n )}\r\n </>\r\n )}\r\n </CommandList>\r\n </Command>\r\n {onManageProjects && (\r\n <>\r\n <div className=\"border-t border-gray-200\" />\r\n <Button\r\n variant=\"ghost\"\r\n className=\"h-10! paragraph-small-medium text-gray-600 hover:text-gray-950 hover:bg-zinc-50 w-full justify-center\"\r\n onClick={onManageProjects}\r\n >\r\n Gerenciar projetos\r\n </Button>\r\n </>\r\n )}\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/navigation/shells/TabsMobileShell.tsx"],"sourcesContent":["'use client';\n\nimport { ReactNode, useRef, useEffect } from 'react';\nimport Link from 'next/link';\nimport { AppNavigationContext } from '../AppNavigationContext';\nimport { useNavItemsContext } from '../NavItemsContext';\n\nfunction InternalTabsBar({ topOffset = '72px' }: { topOffset?: string }) {\n const { navItems } = useNavItemsContext();\n const tabsListRef = useRef<HTMLDivElement>(null);\n const activeTabRef = useRef<HTMLAnchorElement>(null);\n\n const activeLabel = navItems.find((i) => i.isActive)?.label;\n\n // Scroll active tab into center when active item changes\n useEffect(() => {\n if (activeTabRef.current && tabsListRef.current) {\n const tabsList = tabsListRef.current;\n const activeTabElement = activeTabRef.current;\n const tabsListRect = tabsList.getBoundingClientRect();\n const activeTabRect = activeTabElement.getBoundingClientRect();\n const scrollLeft =\n activeTabElement.offsetLeft - tabsListRect.width / 2 + activeTabRect.width / 2;\n tabsList.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });\n }\n }, [activeLabel]);\n\n if (!navItems.length) return null;\n\n return (\n <div\n ref={tabsListRef}\n className=\"md:hidden fixed left-0 right-0 z-40 bg-white border-b border-gray-200 flex overflow-x-auto scrollbar-hide\"\n style={{ top: topOffset }}\n >\n {navItems.map((item) => (\n <Link\n key={item.label}\n ref={item.isActive ? activeTabRef : undefined}\n href={item.href}\n prefetch\n className={`flex items-center gap-2 px-4 py-3 shrink-0 border-b-2 transition-colors ${\n item.isActive\n ? 'border-gray-950 text-gray-950'\n : 'border-transparent text-gray-500 hover:text-gray-900'\n }`}\n >\n {item.icon && <item.icon size={16} className=\"shrink-0\" />}\n <span\n className={\n item.isActive ? 'paragraph-small-semibold' : 'paragraph-small-medium'\n }\n >\n {item.label}\n </span>\n </Link>\n ))}\n </div>\n );\n}\n\nexport function TabsMobileShell({ children, topOffset }: { children: ReactNode; topOffset?: string }) {\n return (\n <AppNavigationContext.Provider value={{ breakpoint: 'mobile' }}>\n {/*\n Children are hidden visually, but NavItems' useEffect still fires inside\n display:none — React effects are tied to commit phase, not layout visibility.\n This registers navItems in NavItemsContext so InternalTabsBar can read them.\n */}\n <div className=\"hidden\">{children}</div>\n <InternalTabsBar topOffset={topOffset} />\n </AppNavigationContext.Provider>\n );\n}\n"],"mappings":";AAoCQ,SAWgB,KAXhB;AAlCR,SAAoB,QAAQ,iBAAiB;AAC7C,OAAO,UAAU;AACjB,SAAS,4BAA4B;AACrC,SAAS,0BAA0B;AAEnC,SAAS,gBAAgB,EAAE,YAAY,OAAO,GAA2B;AACvE,QAAM,EAAE,SAAS,IAAI,mBAAmB;AACxC,QAAM,cAAc,OAAuB,IAAI;AAC/C,QAAM,eAAe,OAA0B,IAAI;AAEnD,QAAM,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAGtD,YAAU,MAAM;AACd,QAAI,aAAa,WAAW,YAAY,SAAS;AAC/C,YAAM,WAAW,YAAY;AAC7B,YAAM,mBAAmB,aAAa;AACtC,YAAM,eAAe,SAAS,sBAAsB;AACpD,YAAM,gBAAgB,iBAAiB,sBAAsB;AAC7D,YAAM,aACJ,iBAAiB,aAAa,aAAa,QAAQ,IAAI,cAAc,QAAQ;AAC/E,eAAS,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,UAAU,GAAG,UAAU,SAAS,CAAC;AAAA,IACzE;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO,EAAE,KAAK,UAAU;AAAA,MAEvB,mBAAS,IAAI,CAAC,SACb;AAAA,QAAC;AAAA;AAAA,UAEC,KAAK,KAAK,WAAW,eAAe;AAAA,UACpC,MAAM,KAAK;AAAA,UACX,UAAQ;AAAA,UACR,WAAW,2EACT,KAAK,WACD,kCACA,sDACN;AAAA,UAEC;AAAA,iBAAK,QAAQ,oBAAC,KAAK,MAAL,EAAU,MAAM,IAAI,WAAU,YAAW;AAAA,YACxD;AAAA,cAAC;AAAA;AAAA,gBACC,WACE,KAAK,WAAW,6BAA6B;AAAA,gBAG9C,eAAK;AAAA;AAAA,YACR;AAAA;AAAA;AAAA,QAjBK,KAAK;AAAA,MAkBZ,CACD;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,gBAAgB,EAAE,UAAU,UAAU,GAAgD;AACpG,SACE,qBAAC,qBAAqB,UAArB,EAA8B,OAAO,EAAE,YAAY,SAAS,GAM3D;AAAA,wBAAC,SAAI,WAAU,UAAU,UAAS;AAAA,IAClC,oBAAC,mBAAgB,WAAsB;AAAA,KACzC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/navigation/shells/TabsMobileShell.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { ReactNode, useRef, useEffect } from 'react';\r\nimport Link from 'next/link';\r\nimport { AppNavigationContext } from '../AppNavigationContext';\r\nimport { useNavItemsContext } from '../NavItemsContext';\r\n\r\nfunction InternalTabsBar({ topOffset = '72px' }: { topOffset?: string }) {\r\n const { navItems } = useNavItemsContext();\r\n const tabsListRef = useRef<HTMLDivElement>(null);\r\n const activeTabRef = useRef<HTMLAnchorElement>(null);\r\n\r\n const activeLabel = navItems.find((i) => i.isActive)?.label;\r\n\r\n // Scroll active tab into center when active item changes\r\n useEffect(() => {\r\n if (activeTabRef.current && tabsListRef.current) {\r\n const tabsList = tabsListRef.current;\r\n const activeTabElement = activeTabRef.current;\r\n const tabsListRect = tabsList.getBoundingClientRect();\r\n const activeTabRect = activeTabElement.getBoundingClientRect();\r\n const scrollLeft =\r\n activeTabElement.offsetLeft - tabsListRect.width / 2 + activeTabRect.width / 2;\r\n tabsList.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });\r\n }\r\n }, [activeLabel]);\r\n\r\n if (!navItems.length) return null;\r\n\r\n return (\r\n <div\r\n ref={tabsListRef}\r\n className=\"md:hidden fixed left-0 right-0 z-40 bg-white border-b border-gray-200 flex overflow-x-auto scrollbar-hide\"\r\n style={{ top: topOffset }}\r\n >\r\n {navItems.map((item) => (\r\n <Link\r\n key={item.label}\r\n ref={item.isActive ? activeTabRef : undefined}\r\n href={item.href}\r\n prefetch\r\n className={`flex items-center gap-2 px-4 py-3 shrink-0 border-b-2 transition-colors ${\r\n item.isActive\r\n ? 'border-gray-950 text-gray-950'\r\n : 'border-transparent text-gray-500 hover:text-gray-900'\r\n }`}\r\n >\r\n {item.icon && <item.icon size={16} className=\"shrink-0\" />}\r\n <span\r\n className={\r\n item.isActive ? 'paragraph-small-semibold' : 'paragraph-small-medium'\r\n }\r\n >\r\n {item.label}\r\n </span>\r\n </Link>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport function TabsMobileShell({ children, topOffset }: { children: ReactNode; topOffset?: string }) {\r\n return (\r\n <AppNavigationContext.Provider value={{ breakpoint: 'mobile' }}>\r\n {/*\r\n Children are hidden visually, but NavItems' useEffect still fires inside\r\n display:none — React effects are tied to commit phase, not layout visibility.\r\n This registers navItems in NavItemsContext so InternalTabsBar can read them.\r\n */}\r\n <div className=\"hidden\">{children}</div>\r\n <InternalTabsBar topOffset={topOffset} />\r\n </AppNavigationContext.Provider>\r\n );\r\n}\r\n"],"mappings":";AAoCQ,SAWgB,KAXhB;AAlCR,SAAoB,QAAQ,iBAAiB;AAC7C,OAAO,UAAU;AACjB,SAAS,4BAA4B;AACrC,SAAS,0BAA0B;AAEnC,SAAS,gBAAgB,EAAE,YAAY,OAAO,GAA2B;AACvE,QAAM,EAAE,SAAS,IAAI,mBAAmB;AACxC,QAAM,cAAc,OAAuB,IAAI;AAC/C,QAAM,eAAe,OAA0B,IAAI;AAEnD,QAAM,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAGtD,YAAU,MAAM;AACd,QAAI,aAAa,WAAW,YAAY,SAAS;AAC/C,YAAM,WAAW,YAAY;AAC7B,YAAM,mBAAmB,aAAa;AACtC,YAAM,eAAe,SAAS,sBAAsB;AACpD,YAAM,gBAAgB,iBAAiB,sBAAsB;AAC7D,YAAM,aACJ,iBAAiB,aAAa,aAAa,QAAQ,IAAI,cAAc,QAAQ;AAC/E,eAAS,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,UAAU,GAAG,UAAU,SAAS,CAAC;AAAA,IACzE;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO,EAAE,KAAK,UAAU;AAAA,MAEvB,mBAAS,IAAI,CAAC,SACb;AAAA,QAAC;AAAA;AAAA,UAEC,KAAK,KAAK,WAAW,eAAe;AAAA,UACpC,MAAM,KAAK;AAAA,UACX,UAAQ;AAAA,UACR,WAAW,2EACT,KAAK,WACD,kCACA,sDACN;AAAA,UAEC;AAAA,iBAAK,QAAQ,oBAAC,KAAK,MAAL,EAAU,MAAM,IAAI,WAAU,YAAW;AAAA,YACxD;AAAA,cAAC;AAAA;AAAA,gBACC,WACE,KAAK,WAAW,6BAA6B;AAAA,gBAG9C,eAAK;AAAA;AAAA,YACR;AAAA;AAAA;AAAA,QAjBK,KAAK;AAAA,MAkBZ,CACD;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,gBAAgB,EAAE,UAAU,UAAU,GAAgD;AACpG,SACE,qBAAC,qBAAqB,UAArB,EAA8B,OAAO,EAAE,YAAY,SAAS,GAM3D;AAAA,wBAAC,SAAI,WAAU,UAAU,UAAS;AAAA,IAClC,oBAAC,mBAAgB,WAAsB;AAAA,KACzC;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/navigation/subcomponents/BottomLinks.tsx"],"sourcesContent":["'use client';\n\nimport { IconHelp, IconBulb } from '@tabler/icons-react';\n\nconst LINKS = [\n {\n label: 'Central de ajuda',\n icon: IconHelp,\n href: 'https://ajuda.greatsoftwares.com.br/pt-br/',\n },\n {\n label: 'Enviar sugestões',\n icon: IconBulb,\n href: 'https://ideias.greatpages.com.br/b/y0geg1ve/feature-ideas',\n },\n] as const;\n\nexport function BottomLinks() {\n return (\n <div className=\"flex flex-col\">\n {LINKS.map((link) => (\n <a\n key={link.label}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"rounded-md flex items-center gap-2 p-3 cursor-pointer transition-colors no-underline bg-white hover:bg-gray-100 active:bg-gray-50\"\n >\n <link.icon size={20} className=\"text-gray-400\" />\n <span className=\"paragraph-small-medium text-gray-500\">\n {link.label}\n </span>\n </a>\n ))}\n </div>\n );\n}\n"],"mappings":";AAqBQ,SAOE,KAPF;AAnBR,SAAS,UAAU,gBAAgB;AAEnC,MAAM,QAAQ;AAAA,EACZ;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,SAAS,cAAc;AAC5B,SACE,oBAAC,SAAI,WAAU,iBACZ,gBAAM,IAAI,CAAC,SACV;AAAA,IAAC;AAAA;AAAA,MAEC,MAAM,KAAK;AAAA,MACX,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAU;AAAA,MAEV;AAAA,4BAAC,KAAK,MAAL,EAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,QAC/C,oBAAC,UAAK,WAAU,wCACb,eAAK,OACR;AAAA;AAAA;AAAA,IATK,KAAK;AAAA,EAUZ,CACD,GACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/navigation/subcomponents/BottomLinks.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { IconHelp, IconBulb } from '@tabler/icons-react';\r\n\r\nconst LINKS = [\r\n {\r\n label: 'Central de ajuda',\r\n icon: IconHelp,\r\n href: 'https://ajuda.greatsoftwares.com.br/pt-br/',\r\n },\r\n {\r\n label: 'Enviar sugestões',\r\n icon: IconBulb,\r\n href: 'https://ideias.greatpages.com.br/b/y0geg1ve/feature-ideas',\r\n },\r\n] as const;\r\n\r\nexport function BottomLinks() {\r\n return (\r\n <div className=\"flex flex-col\">\r\n {LINKS.map((link) => (\r\n <a\r\n key={link.label}\r\n href={link.href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"rounded-md flex items-center gap-2 p-3 cursor-pointer transition-colors no-underline bg-white hover:bg-gray-100 active:bg-gray-50\"\r\n >\r\n <link.icon size={20} className=\"text-gray-400\" />\r\n <span className=\"paragraph-small-medium text-gray-500\">\r\n {link.label}\r\n </span>\r\n </a>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"mappings":";AAqBQ,SAOE,KAPF;AAnBR,SAAS,UAAU,gBAAgB;AAEnC,MAAM,QAAQ;AAAA,EACZ;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,SAAS,cAAc;AAC5B,SACE,oBAAC,SAAI,WAAU,iBACZ,gBAAM,IAAI,CAAC,SACV;AAAA,IAAC;AAAA;AAAA,MAEC,MAAM,KAAK;AAAA,MACX,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAU;AAAA,MAEV;AAAA,4BAAC,KAAK,MAAL,EAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,QAC/C,oBAAC,UAAK,WAAU,wCACb,eAAK,OACR;AAAA;AAAA;AAAA,IATK,KAAK;AAAA,EAUZ,CACD,GACH;AAEJ;","names":[]}