@greatapps/common 1.1.700 → 1.1.701

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  18. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  20. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  21. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  22. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  24. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  25. package/dist/components/layouts/NavBar.mjs.map +1 -1
  26. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  27. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  28. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  29. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  30. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  31. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  32. package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
  33. package/dist/components/modals/HexaPromoModal.mjs +2 -2
  34. package/dist/components/modals/HexaPromoModal.mjs.map +1 -1
  35. package/dist/components/modals/HexaPromoModalGate.mjs.map +1 -1
  36. package/dist/components/modals/Modals.mjs.map +1 -1
  37. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  38. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  39. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  40. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  41. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  42. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  43. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  44. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  45. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  46. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  47. package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
  48. package/dist/components/navigation/TrialBanner.mjs.map +1 -1
  49. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  50. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  51. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  52. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  53. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  54. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  55. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  56. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  57. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  60. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  61. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  62. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  63. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  64. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  65. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  66. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  67. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  68. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  69. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  70. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  71. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  72. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  73. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  74. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  75. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  76. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  77. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  78. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  79. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  80. package/dist/components/ui/form/FormField.mjs.map +1 -1
  81. package/dist/components/ui/form/Input.mjs.map +1 -1
  82. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  83. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  84. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  85. package/dist/components/ui/form/Select.mjs +1 -1
  86. package/dist/components/ui/form/Select.mjs.map +1 -1
  87. package/dist/components/ui/form/Switch.mjs.map +1 -1
  88. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  89. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  90. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  91. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  92. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  93. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  94. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  95. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  96. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  97. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  98. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  99. package/dist/handlers.mjs.map +1 -1
  100. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  101. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  102. package/dist/hooks/useBrandLoadingIcon.mjs.map +1 -1
  103. package/dist/hooks/useRouter.mjs.map +1 -1
  104. package/dist/http.mjs.map +1 -1
  105. package/dist/i18n/config.mjs.map +1 -1
  106. package/dist/i18n/country-language.mjs.map +1 -1
  107. package/dist/i18n/messages/en-us.mjs.map +1 -1
  108. package/dist/i18n/messages/es-es.mjs.map +1 -1
  109. package/dist/i18n/messages/index.mjs.map +1 -1
  110. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  111. package/dist/i18n/normalize.mjs.map +1 -1
  112. package/dist/i18n/resolve-locale.mjs.map +1 -1
  113. package/dist/i18n.mjs.map +1 -1
  114. package/dist/index.mjs.map +1 -1
  115. package/dist/infra/http/api-fetch.mjs.map +1 -1
  116. package/dist/infra/route/parse-id.mjs.map +1 -1
  117. package/dist/infra/route/parse-numeric.mjs.map +1 -1
  118. package/dist/infra/route/safe-route-handler.mjs.map +1 -1
  119. package/dist/infra/route/search-params.mjs.map +1 -1
  120. package/dist/infra/utils/array.mjs.map +1 -1
  121. package/dist/infra/utils/date.mjs.map +1 -1
  122. package/dist/middleware.mjs.map +1 -1
  123. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  124. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  125. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  126. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  127. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  128. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  129. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  130. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -1
  131. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  132. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  133. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  134. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  135. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  136. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  137. package/dist/modules/auth/actions/social-google-login.action.mjs.map +1 -1
  138. package/dist/modules/auth/actions/social-google-onboarding.action.mjs.map +1 -1
  139. package/dist/modules/auth/actions/unlink-google.action.mjs.map +1 -1
  140. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  141. package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
  142. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  143. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  144. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  145. package/dist/modules/auth/hooks/social-google-login.hook.mjs.map +1 -1
  146. package/dist/modules/auth/hooks/social-google-onboarding.hook.mjs.map +1 -1
  147. package/dist/modules/auth/hooks/unlink-google.hook.mjs.map +1 -1
  148. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  149. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  150. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  151. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  152. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  153. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  154. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  155. package/dist/modules/auth/utils/require-token-not-expired.mjs.map +1 -1
  156. package/dist/modules/auth/utils/require-valid-session.mjs.map +1 -1
  157. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  158. package/dist/modules/cards/actions/create-setup-intent.action.mjs.map +1 -1
  159. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  160. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  161. package/dist/modules/cards/handlers/find-card-by-id.handler.mjs.map +1 -1
  162. package/dist/modules/cards/handlers/list-cards.handler.mjs.map +1 -1
  163. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  164. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  165. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  166. package/dist/modules/cards/hooks/create-setup-intent.hook.mjs.map +1 -1
  167. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  168. package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -1
  169. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  170. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  171. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  172. package/dist/modules/cards/types.mjs.map +1 -1
  173. package/dist/modules/charges/actions/charge-action.action.mjs.map +1 -1
  174. package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs.map +1 -1
  175. package/dist/modules/charges/handlers/list-charges.handler.mjs.map +1 -1
  176. package/dist/modules/charges/hooks/charge-action.hook.mjs.map +1 -1
  177. package/dist/modules/charges/hooks/charge-by-id.hook.mjs.map +1 -1
  178. package/dist/modules/charges/hooks/charges.hook.mjs.map +1 -1
  179. package/dist/modules/charges/services/charges.service.mjs.map +1 -1
  180. package/dist/modules/charges/types/charge.type.mjs.map +1 -1
  181. package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs.map +1 -1
  182. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  183. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  184. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  185. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  186. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  187. package/dist/modules/images/utils/base64.mjs.map +1 -1
  188. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  189. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  190. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  191. package/dist/modules/pages/constants/query-keys.constants.mjs.map +1 -1
  192. package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -1
  193. package/dist/modules/pages/hooks/count-pages.hook.mjs.map +1 -1
  194. package/dist/modules/pages/services/pages.service.mjs.map +1 -1
  195. package/dist/modules/plans/handlers/find-plan-by-id.handler.mjs.map +1 -1
  196. package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -1
  197. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  198. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  199. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  200. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  201. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  202. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  203. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  204. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  205. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  206. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  207. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  208. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  209. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  210. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  211. package/dist/modules/projects/handlers/find-project.handler.mjs.map +1 -1
  212. package/dist/modules/projects/handlers/list-all-account-users.handler.mjs.map +1 -1
  213. package/dist/modules/projects/handlers/list-available-users.handler.mjs.map +1 -1
  214. package/dist/modules/projects/handlers/list-project-users.handler.mjs.map +1 -1
  215. package/dist/modules/projects/handlers/list-projects.handler.mjs.map +1 -1
  216. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  217. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  218. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  219. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  220. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  221. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  222. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  223. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  224. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  225. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  226. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  227. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  228. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  229. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  230. package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -1
  231. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  232. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  233. package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
  234. package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs.map +1 -1
  235. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  236. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  237. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  238. package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -1
  239. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  240. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  241. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  242. package/dist/modules/subscriptions/types/pix-pending.type.mjs.map +1 -1
  243. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  244. package/dist/modules/subscriptions/utils/get-subscription-cancellation-state.mjs.map +1 -1
  245. package/dist/modules/subscriptions/utils/get-subscription-expiry-date.mjs.map +1 -1
  246. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  247. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  248. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  249. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  250. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  251. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  252. package/dist/modules/users/handlers/list-messages.handler.mjs.map +1 -1
  253. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  254. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  255. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  256. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  257. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  258. package/dist/providers/auth.provider.mjs.map +1 -1
  259. package/dist/providers/navigation.provider.mjs.map +1 -1
  260. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  261. package/dist/route.mjs.map +1 -1
  262. package/dist/store/useAccountModals.mjs.map +1 -1
  263. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  264. package/dist/store/useCreditsDisabledModal.mjs.map +1 -1
  265. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  266. package/dist/store/useHexaPromoModal.mjs.map +1 -1
  267. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  268. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  269. package/dist/utils/constants/br-states.mjs.map +1 -1
  270. package/dist/utils/cookies/hexa-promo.mjs.map +1 -1
  271. package/dist/utils/countries.mjs.map +1 -1
  272. package/dist/utils/format/currency.mjs.map +1 -1
  273. package/dist/utils/intl/cookie-domain.mjs.map +1 -1
  274. package/dist/utils/intl/locale-cookie.mjs.map +1 -1
  275. package/dist/utils/next-navigation.mjs.map +1 -1
  276. package/dist/utils/redirect.mjs.map +1 -1
  277. package/dist/utils/safeMutationAction.mjs.map +1 -1
  278. package/dist/utils/safeServerAction.mjs.map +1 -1
  279. package/dist/utils/withAction.mjs.map +1 -1
  280. package/package.json +115 -115
  281. package/src/components/account/ConfigurationsMyAccountModal.tsx +179 -179
  282. package/src/components/account/ConfirmDeleteAccountModal.tsx +110 -110
  283. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +68 -68
  284. package/src/components/account/DeleteAccountModal.tsx +160 -160
  285. package/src/components/account/DisableTwoFactorAuthModal.tsx +92 -92
  286. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +51 -51
  287. package/src/components/account/TwoFactorAuthModal.tsx +220 -220
  288. package/src/components/account/hooks/useChangePhoneForm.tsx +113 -113
  289. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +116 -116
  290. package/src/components/account/sections/ChangeEmailModal.tsx +239 -239
  291. package/src/components/account/sections/ChangePasswordSection.tsx +68 -68
  292. package/src/components/account/sections/ChangePhoneModal.tsx +273 -273
  293. package/src/components/account/sections/MyProfileSection.tsx +276 -276
  294. package/src/components/account/sections/PreferencesSection.tsx +278 -278
  295. package/src/components/account/sections/SecuritySection.tsx +102 -102
  296. package/src/components/account/sections/TokenSection.tsx +85 -85
  297. package/src/components/embeds/ClarityEmbed.tsx +70 -70
  298. package/src/components/embeds/CrispEmbed.tsx +195 -195
  299. package/src/components/embeds/EmbedWidgets.tsx +62 -62
  300. package/src/components/embeds/FrillEmbed.tsx +146 -146
  301. package/src/components/layouts/AppMobileNavBar.tsx +214 -214
  302. package/src/components/layouts/AppNavBar.tsx +40 -40
  303. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  304. package/src/components/layouts/NavBar.tsx +228 -228
  305. package/src/components/layouts/NotificationsPopover.tsx +120 -120
  306. package/src/components/layouts/ProfilePopover.tsx +191 -191
  307. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  308. package/src/components/layouts/UsersSelectorPopover.tsx +236 -236
  309. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  310. package/src/components/modals/BuyCreditsModal.tsx +390 -390
  311. package/src/components/modals/CreditsDisabledModal.tsx +62 -62
  312. package/src/components/modals/HexaPromoModal.tsx +212 -212
  313. package/src/components/modals/HexaPromoModalGate.tsx +80 -80
  314. package/src/components/modals/Modals.tsx +25 -25
  315. package/src/components/modals/PaidPlanRequiredModal.tsx +60 -60
  316. package/src/components/modals/cards/AddCardModal.tsx +420 -420
  317. package/src/components/modals/cards/CannotDeleteCardModal.tsx +124 -124
  318. package/src/components/modals/cards/CardFormFields.tsx +363 -363
  319. package/src/components/modals/cards/DeleteCardModal.tsx +136 -136
  320. package/src/components/navigation/CancelledSubscriptionBanner.tsx +62 -62
  321. package/src/components/navigation/NavItemsContext.ts +20 -20
  322. package/src/components/navigation/OverdueInvoiceBanner.tsx +51 -51
  323. package/src/components/navigation/PendingCancellationBanner.tsx +60 -60
  324. package/src/components/navigation/ProjectSelectorPopover.tsx +180 -180
  325. package/src/components/navigation/SubscriptionBanner.tsx +94 -94
  326. package/src/components/navigation/TrialBanner.tsx +54 -54
  327. package/src/components/navigation/UpcomingInvoiceBanner.tsx +55 -55
  328. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  329. package/src/components/navigation/subcomponents/BottomLinks.tsx +85 -85
  330. package/src/components/navigation/subcomponents/ProjectSelector.tsx +184 -184
  331. package/src/components/pages/NotFoundPage.tsx +75 -75
  332. package/src/components/pages/notifications/Notifications.tsx +190 -190
  333. package/src/components/ui/buttons/Button.tsx +77 -77
  334. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  335. package/src/components/ui/buttons/CopyButton.tsx +59 -59
  336. package/src/components/ui/data-display/Accordion.tsx +81 -81
  337. package/src/components/ui/data-display/Badge.tsx +47 -47
  338. package/src/components/ui/data-display/Card.tsx +93 -93
  339. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  340. package/src/components/ui/data-display/CardItem.tsx +135 -135
  341. package/src/components/ui/data-display/Pagination.tsx +126 -126
  342. package/src/components/ui/data-display/PaymentInfoCard.tsx +193 -193
  343. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  344. package/src/components/ui/data-display/Separator.tsx +29 -29
  345. package/src/components/ui/data-display/Table.tsx +117 -117
  346. package/src/components/ui/data-display/Tabs.tsx +67 -67
  347. package/src/components/ui/feedback/CircularProgress.tsx +79 -79
  348. package/src/components/ui/feedback/DefaultCircularProgress.tsx +67 -67
  349. package/src/components/ui/feedback/LoadingOverlay.tsx +30 -30
  350. package/src/components/ui/feedback/Progress.tsx +40 -40
  351. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  352. package/src/components/ui/feedback/Toast.tsx +104 -104
  353. package/src/components/ui/form/Calendar.tsx +228 -228
  354. package/src/components/ui/form/Checkbox.tsx +31 -31
  355. package/src/components/ui/form/ComboboxField.tsx +159 -159
  356. package/src/components/ui/form/DatePicker.tsx +100 -100
  357. package/src/components/ui/form/DateRangePicker.tsx +111 -111
  358. package/src/components/ui/form/FormField.tsx +133 -133
  359. package/src/components/ui/form/Input.tsx +20 -20
  360. package/src/components/ui/form/InputOtp.tsx +80 -80
  361. package/src/components/ui/form/PhoneInput.tsx +210 -210
  362. package/src/components/ui/form/RadioGroup.tsx +45 -45
  363. package/src/components/ui/form/Select.tsx +200 -200
  364. package/src/components/ui/form/Switch.tsx +32 -32
  365. package/src/components/ui/form/Textarea.tsx +19 -19
  366. package/src/components/ui/overlay/Command.tsx +185 -185
  367. package/src/components/ui/overlay/Dialog.tsx +153 -153
  368. package/src/components/ui/overlay/Popover.tsx +49 -49
  369. package/src/components/ui/overlay/Sheet.tsx +170 -170
  370. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  371. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +392 -392
  372. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +62 -62
  373. package/src/components/widgets/ImageUpload/ImageUpload.tsx +131 -131
  374. package/src/components/widgets/ImageUpload/index.ts +3 -3
  375. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  376. package/src/handlers.ts +22 -22
  377. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  378. package/src/hooks/useAuthQueryKey.ts +32 -32
  379. package/src/hooks/useBrandLoadingIcon.tsx +18 -18
  380. package/src/hooks/useRouter.ts +38 -38
  381. package/src/http.ts +1 -1
  382. package/src/i18n/config.ts +17 -17
  383. package/src/i18n/country-language.ts +60 -60
  384. package/src/i18n/messages/en-us.ts +519 -519
  385. package/src/i18n/messages/es-es.ts +520 -520
  386. package/src/i18n/messages/index.ts +24 -24
  387. package/src/i18n/messages/pt-br.ts +543 -543
  388. package/src/i18n/normalize.ts +15 -15
  389. package/src/i18n/resolve-locale.ts +77 -77
  390. package/src/i18n.ts +10 -10
  391. package/src/index.ts +587 -587
  392. package/src/infra/http/api-fetch.ts +39 -39
  393. package/src/infra/route/parse-id.ts +9 -9
  394. package/src/infra/route/parse-numeric.ts +16 -16
  395. package/src/infra/route/safe-route-handler.ts +16 -16
  396. package/src/infra/route/search-params.ts +9 -9
  397. package/src/infra/utils/array.ts +167 -167
  398. package/src/infra/utils/date.ts +59 -59
  399. package/src/middleware.ts +4 -4
  400. package/src/modules/accounts/actions/account-management.action.ts +109 -109
  401. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  402. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  403. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  404. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  405. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  406. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  407. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -32
  408. package/src/modules/accounts/hooks/useAccountManagement.ts +95 -95
  409. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  410. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  411. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  412. package/src/modules/accounts/services/account-token.service.ts +52 -52
  413. package/src/modules/accounts/services/account.service.ts +243 -243
  414. package/src/modules/accounts/types.ts +230 -230
  415. package/src/modules/auth/actions/social-google-login.action.ts +12 -12
  416. package/src/modules/auth/actions/social-google-onboarding.action.ts +13 -13
  417. package/src/modules/auth/actions/unlink-google.action.ts +8 -8
  418. package/src/modules/auth/actions/validate-session.action.ts +70 -70
  419. package/src/modules/auth/actions/verify-two-factor.action.ts +19 -19
  420. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  421. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  422. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  423. package/src/modules/auth/hooks/social-google-login.hook.tsx +13 -13
  424. package/src/modules/auth/hooks/social-google-onboarding.hook.tsx +13 -13
  425. package/src/modules/auth/hooks/unlink-google.hook.tsx +13 -13
  426. package/src/modules/auth/hooks/useManagementPermissions.ts +52 -52
  427. package/src/modules/auth/hooks/useUserQuery.ts +103 -103
  428. package/src/modules/auth/types/management-permission.type.ts +14 -14
  429. package/src/modules/auth/utils/assert-management-permission.ts +56 -56
  430. package/src/modules/auth/utils/assert-management-subscription.ts +38 -38
  431. package/src/modules/auth/utils/assert-paid-subscription.ts +47 -47
  432. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  433. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  434. package/src/modules/auth/utils/require-token-not-expired.ts +53 -53
  435. package/src/modules/auth/utils/require-valid-session.ts +35 -35
  436. package/src/modules/cards/actions/create-card.action.ts +9 -9
  437. package/src/modules/cards/actions/create-setup-intent.action.ts +8 -8
  438. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  439. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  440. package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -15
  441. package/src/modules/cards/handlers/list-cards.handler.ts +10 -10
  442. package/src/modules/cards/hooks/card-by-id.hook.ts +17 -17
  443. package/src/modules/cards/hooks/cards.hook.ts +22 -22
  444. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  445. package/src/modules/cards/hooks/create-setup-intent.hook.ts +11 -11
  446. package/src/modules/cards/hooks/delete-card.hook.ts +52 -52
  447. package/src/modules/cards/hooks/delete-confirmation.hook.ts +40 -40
  448. package/src/modules/cards/hooks/handle-delete-card.hook.ts +47 -47
  449. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  450. package/src/modules/cards/services/cards.service.ts +136 -136
  451. package/src/modules/cards/types.ts +52 -52
  452. package/src/modules/charges/actions/charge-action.action.ts +13 -13
  453. package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -14
  454. package/src/modules/charges/handlers/list-charges.handler.ts +15 -15
  455. package/src/modules/charges/hooks/charge-action.hook.ts +24 -24
  456. package/src/modules/charges/hooks/charge-by-id.hook.ts +19 -19
  457. package/src/modules/charges/hooks/charges.hook.ts +19 -19
  458. package/src/modules/charges/services/charges.service.ts +63 -63
  459. package/src/modules/charges/types/charge.type.ts +68 -68
  460. package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -14
  461. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +103 -103
  462. package/src/modules/images/actions/process-image.action.ts +40 -40
  463. package/src/modules/images/constants/image.constants.ts +11 -11
  464. package/src/modules/images/hooks/use-image-upload.hook.ts +153 -153
  465. package/src/modules/images/services/image-processing.service.ts +75 -75
  466. package/src/modules/images/types/image.type.ts +54 -54
  467. package/src/modules/images/utils/base64.ts +26 -26
  468. package/src/modules/images/utils/compress-image.ts +20 -20
  469. package/src/modules/images/utils/crop-image.ts +68 -68
  470. package/src/modules/images/utils/validate-image.ts +86 -86
  471. package/src/modules/pages/constants/query-keys.constants.ts +1 -1
  472. package/src/modules/pages/handlers/count-pages.handler.ts +12 -12
  473. package/src/modules/pages/hooks/count-pages.hook.ts +21 -21
  474. package/src/modules/pages/services/pages.service.ts +27 -27
  475. package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -14
  476. package/src/modules/plans/handlers/list-plans.handler.ts +22 -22
  477. package/src/modules/plans/hooks/list-plans.hook.ts +23 -23
  478. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  479. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +39 -39
  480. package/src/modules/plans/services/plans.service.ts +136 -136
  481. package/src/modules/plans/types/plan.type.ts +79 -79
  482. package/src/modules/plans/utils/map-api-plan-to-ui.ts +167 -167
  483. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  484. package/src/modules/projects/actions/create-project.action.ts +9 -9
  485. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  486. package/src/modules/projects/actions/find-project.action.ts +8 -8
  487. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  488. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  489. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  490. package/src/modules/projects/actions/update-project.action.ts +9 -9
  491. package/src/modules/projects/handlers/find-project.handler.ts +15 -15
  492. package/src/modules/projects/handlers/list-all-account-users.handler.ts +23 -23
  493. package/src/modules/projects/handlers/list-available-users.handler.ts +26 -26
  494. package/src/modules/projects/handlers/list-project-users.handler.ts +26 -26
  495. package/src/modules/projects/handlers/list-projects.handler.ts +23 -23
  496. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  497. package/src/modules/projects/hooks/create-project.hook.ts +120 -120
  498. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  499. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  500. package/src/modules/projects/hooks/list-all-account-users.hook.ts +40 -40
  501. package/src/modules/projects/hooks/list-available-users.hook.ts +39 -39
  502. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +44 -44
  503. package/src/modules/projects/hooks/list-project-users.hook.ts +39 -39
  504. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  505. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  506. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  507. package/src/modules/projects/services/projects.service.ts +156 -156
  508. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  509. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  510. package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -13
  511. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  512. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  513. package/src/modules/subscriptions/constants/subscription.constants.ts +1 -1
  514. package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -17
  515. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  516. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +22 -22
  517. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +22 -22
  518. package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -25
  519. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  520. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +44 -44
  521. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  522. package/src/modules/subscriptions/types/calculate-subscription.type.ts +116 -116
  523. package/src/modules/subscriptions/types/pix-pending.type.ts +38 -38
  524. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  525. package/src/modules/subscriptions/utils/get-subscription-cancellation-state.ts +37 -37
  526. package/src/modules/subscriptions/utils/get-subscription-expiry-date.ts +33 -33
  527. package/src/modules/subscriptions/utils/has-subscription-expired.ts +11 -11
  528. package/src/modules/subscriptions/utils/periodicity.ts +79 -79
  529. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  530. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  531. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  532. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  533. package/src/modules/users/handlers/list-messages.handler.ts +39 -39
  534. package/src/modules/users/hooks/messages.hook.ts +69 -69
  535. package/src/modules/users/services/messages.service.ts +49 -49
  536. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  537. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  538. package/src/modules/whitelabel/schema.ts +84 -84
  539. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  540. package/src/providers/auth.provider.tsx +267 -267
  541. package/src/providers/navigation.provider.tsx +99 -99
  542. package/src/providers/whitelabel.provider.tsx +90 -90
  543. package/src/route.ts +4 -4
  544. package/src/store/useAccountModals.ts +85 -85
  545. package/src/store/useBuyCreditsModal.ts +21 -21
  546. package/src/store/useCreditsDisabledModal.ts +11 -11
  547. package/src/store/useDesktopSidebarStore.ts +47 -47
  548. package/src/store/useHexaPromoModal.ts +13 -13
  549. package/src/store/useMdSidebarStore.ts +34 -34
  550. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  551. package/src/utils/constants/br-states.ts +29 -29
  552. package/src/utils/cookies/hexa-promo.ts +114 -114
  553. package/src/utils/countries.ts +224 -224
  554. package/src/utils/format/currency.ts +70 -70
  555. package/src/utils/intl/cookie-domain.ts +29 -29
  556. package/src/utils/intl/locale-cookie.ts +18 -18
  557. package/src/utils/next-navigation.ts +7 -7
  558. package/src/utils/redirect.ts +78 -78
  559. package/src/utils/safeMutationAction.ts +24 -24
  560. package/src/utils/safeServerAction.ts +21 -21
  561. package/src/utils/withAction.ts +13 -13
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/NotificationsPopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useState } from \"react\";\r\nimport { useTranslations } from \"next-intl\";\r\nimport { IconBell } from '@tabler/icons-react';\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { Popover } from \"../ui/overlay/Popover\";\r\nimport { Button } from \"../ui/buttons/Button\";\r\nimport NotificationCard from \"../widgets/notifications/NotificationCard\";\r\nimport { cn } from \"../../infra/utils/clsx\";\r\nimport { useMessages, useMarkAllMessagesAsRead } from \"../../modules/users/hooks/messages.hook\";\r\nimport { useIsDefaultWhitelabel } from \"../../providers/whitelabel.provider\";\r\nimport { formatDistanceToNow } from \"date-fns\";\r\nimport { ptBR } from \"date-fns/locale\";\r\n\r\nexport interface NotificationsPopoverProps {\r\n onViewAll?: () => void;\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n badgeClassName?: string;\r\n}\r\n\r\nfunction NotificationsPopover({\r\n onViewAll,\r\n side,\r\n align,\r\n contentClassName,\r\n badgeClassName,\r\n}: NotificationsPopoverProps) {\r\n const translate = useTranslations();\r\n const isDefaultWl = useIsDefaultWhitelabel();\r\n const resolvedBadgeClassName = badgeClassName ?? (isDefaultWl ? \"bg-cyan-300\" : \"bg-zinc-300\");\r\n const [open, setOpen] = useState(false);\r\n const { data: messagesData } = useMessages({ type: 'notification', readed: true, limit: 5 });\r\n const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();\r\n\r\n const messages = messagesData?.data ?? [];\r\n const totalUnread = messagesData?.totalUnread ?? 0;\r\n\r\n const handleOpenChange = (isOpen: boolean) => {\r\n setOpen(isOpen);\r\n if (isOpen && totalUnread > 0) {\r\n markAllAsRead();\r\n }\r\n };\r\n\r\n return (\r\n <Popover open={open} onOpenChange={handleOpenChange}>\r\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\r\n <div\r\n className={`relative rounded-full p-2.5 ${open ? \"bg-gray-100\" : \"hover:bg-gray-100\"}`}\r\n >\r\n <IconBell size={20} className=\"text-gray-500\" />\r\n {totalUnread > 0 && (\r\n <span\r\n className={cn(\r\n \"absolute top-0.5 right-0.5 size-3.5 rounded-full border-2 border-white\",\r\n resolvedBadgeClassName,\r\n )}\r\n />\r\n )}\r\n </div>\r\n </PopoverPrimitive.Trigger>\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n className={cn(\r\n \"absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 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 <span className=\"paragraph-small-semibold text-gray-950 px-4\">\r\n {translate('common.notifications.popover.title')}\r\n </span>\r\n\r\n {messages.length > 0 ? (\r\n messages.map((message, index) => (\r\n <NotificationCard\r\n key={message.id}\r\n icon={<IconBell size={16} />}\r\n iconBgColor=\"bg-gray-100\"\r\n title={message.subject}\r\n time={formatDistanceToNow(new Date(message.datetime_add), {\r\n addSuffix: true,\r\n locale: ptBR,\r\n })}\r\n gapPx={6}\r\n showBorder={index < messages.length - 1}\r\n />\r\n ))\r\n ) : (\r\n <div className=\"flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]\">\r\n <div className=\"bg-gray-50 rounded-md p-2.5\">\r\n <IconBell size={20} color=\"var(--color-gray-950)\" />\r\n </div>\r\n <span className=\"paragraph-small-medium text-gray-950\">\r\n {translate('common.notifications.popover.empty')}\r\n </span>\r\n </div>\r\n )}\r\n\r\n {onViewAll && (\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-8! mt-2 mb-4 mx-4 paragraph-small-semibold\"\r\n onClick={onViewAll}\r\n >\r\n {translate('common.notifications.popover.viewAll')}\r\n </Button>\r\n )}\r\n </PopoverPrimitive.Content>\r\n </PopoverPrimitive.Portal>\r\n </Popover>\r\n );\r\n}\r\n\r\nexport { NotificationsPopover };\r\n"],"mappings":";AAkDQ,SAGE,KAHF;AAhDR,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,YAAY,sBAAsB;AAClC,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,OAAO,sBAAsB;AAC7B,SAAS,UAAU;AACnB,SAAS,aAAa,gCAAgC;AACtD,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC,SAAS,YAAY;AAUrB,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,YAAY,gBAAgB;AAClC,QAAM,cAAc,uBAAuB;AAC3C,QAAM,yBAAyB,mBAAmB,cAAc,gBAAgB;AAChF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,EAAE,MAAM,aAAa,IAAI,YAAY,EAAE,MAAM,gBAAgB,QAAQ,MAAM,OAAO,EAAE,CAAC;AAC3F,QAAM,EAAE,QAAQ,cAAc,IAAI,yBAAyB;AAE3D,QAAM,WAAW,cAAc,QAAQ,CAAC;AACxC,QAAM,cAAc,cAAc,eAAe;AAEjD,QAAM,mBAAmB,CAAC,WAAoB;AAC5C,YAAQ,MAAM;AACd,QAAI,UAAU,cAAc,GAAG;AAC7B,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,kBACjC;AAAA,wBAAC,iBAAiB,SAAjB,EAAyB,WAAU,kBAClC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,+BAA+B,OAAO,gBAAgB,mBAAmB;AAAA,QAEpF;AAAA,8BAAC,YAAS,MAAM,IAAI,WAAU,iBAAgB;AAAA,UAC7C,cAAc,KACb;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,IACA,oBAAC,iBAAiB,QAAjB,EACC;AAAA,MAAC,iBAAiB;AAAA,MAAjB;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QAEZ;AAAA,8BAAC,UAAK,WAAU,+CACb,oBAAU,oCAAoC,GACjD;AAAA,UAEC,SAAS,SAAS,IACjB,SAAS,IAAI,CAAC,SAAS,UACrB;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,oBAAC,YAAS,MAAM,IAAI;AAAA,cAC1B,aAAY;AAAA,cACZ,OAAO,QAAQ;AAAA,cACf,MAAM,oBAAoB,IAAI,KAAK,QAAQ,YAAY,GAAG;AAAA,gBACxD,WAAW;AAAA,gBACX,QAAQ;AAAA,cACV,CAAC;AAAA,cACD,OAAO;AAAA,cACP,YAAY,QAAQ,SAAS,SAAS;AAAA;AAAA,YATjC,QAAQ;AAAA,UAUf,CACD,IAED,qBAAC,SAAI,WAAU,4DACb;AAAA,gCAAC,SAAI,WAAU,+BACb,8BAAC,YAAS,MAAM,IAAI,OAAM,yBAAwB,GACpD;AAAA,YACA,oBAAC,UAAK,WAAU,wCACb,oBAAU,oCAAoC,GACjD;AAAA,aACF;AAAA,UAGD,aACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS;AAAA,cAER,oBAAU,sCAAsC;AAAA;AAAA,UACnD;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layouts/NotificationsPopover.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { useTranslations } from \"next-intl\";\nimport { IconBell } from '@tabler/icons-react';\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Popover } from \"../ui/overlay/Popover\";\nimport { Button } from \"../ui/buttons/Button\";\nimport NotificationCard from \"../widgets/notifications/NotificationCard\";\nimport { cn } from \"../../infra/utils/clsx\";\nimport { useMessages, useMarkAllMessagesAsRead } from \"../../modules/users/hooks/messages.hook\";\nimport { useIsDefaultWhitelabel } from \"../../providers/whitelabel.provider\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\n\nexport interface NotificationsPopoverProps {\n onViewAll?: () => void;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n contentClassName?: string;\n badgeClassName?: string;\n}\n\nfunction NotificationsPopover({\n onViewAll,\n side,\n align,\n contentClassName,\n badgeClassName,\n}: NotificationsPopoverProps) {\n const translate = useTranslations();\n const isDefaultWl = useIsDefaultWhitelabel();\n const resolvedBadgeClassName = badgeClassName ?? (isDefaultWl ? \"bg-cyan-300\" : \"bg-zinc-300\");\n const [open, setOpen] = useState(false);\n const { data: messagesData } = useMessages({ type: 'notification', readed: true, limit: 5 });\n const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();\n\n const messages = messagesData?.data ?? [];\n const totalUnread = messagesData?.totalUnread ?? 0;\n\n const handleOpenChange = (isOpen: boolean) => {\n setOpen(isOpen);\n if (isOpen && totalUnread > 0) {\n markAllAsRead();\n }\n };\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\n <div\n className={`relative rounded-full p-2.5 ${open ? \"bg-gray-100\" : \"hover:bg-gray-100\"}`}\n >\n <IconBell size={20} className=\"text-gray-500\" />\n {totalUnread > 0 && (\n <span\n className={cn(\n \"absolute top-0.5 right-0.5 size-3.5 rounded-full border-2 border-white\",\n resolvedBadgeClassName,\n )}\n />\n )}\n </div>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n className={cn(\n \"absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200\",\n contentClassName,\n )}\n side={side}\n align={align}\n sideOffset={8}\n >\n <span className=\"paragraph-small-semibold text-gray-950 px-4\">\n {translate('common.notifications.popover.title')}\n </span>\n\n {messages.length > 0 ? (\n messages.map((message, index) => (\n <NotificationCard\n key={message.id}\n icon={<IconBell size={16} />}\n iconBgColor=\"bg-gray-100\"\n title={message.subject}\n time={formatDistanceToNow(new Date(message.datetime_add), {\n addSuffix: true,\n locale: ptBR,\n })}\n gapPx={6}\n showBorder={index < messages.length - 1}\n />\n ))\n ) : (\n <div className=\"flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]\">\n <div className=\"bg-gray-50 rounded-md p-2.5\">\n <IconBell size={20} color=\"var(--color-gray-950)\" />\n </div>\n <span className=\"paragraph-small-medium text-gray-950\">\n {translate('common.notifications.popover.empty')}\n </span>\n </div>\n )}\n\n {onViewAll && (\n <Button\n variant=\"secondary\"\n className=\"h-8! mt-2 mb-4 mx-4 paragraph-small-semibold\"\n onClick={onViewAll}\n >\n {translate('common.notifications.popover.viewAll')}\n </Button>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </Popover>\n );\n}\n\nexport { NotificationsPopover };\n"],"mappings":";AAkDQ,SAGE,KAHF;AAhDR,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,YAAY,sBAAsB;AAClC,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,OAAO,sBAAsB;AAC7B,SAAS,UAAU;AACnB,SAAS,aAAa,gCAAgC;AACtD,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC,SAAS,YAAY;AAUrB,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,YAAY,gBAAgB;AAClC,QAAM,cAAc,uBAAuB;AAC3C,QAAM,yBAAyB,mBAAmB,cAAc,gBAAgB;AAChF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,EAAE,MAAM,aAAa,IAAI,YAAY,EAAE,MAAM,gBAAgB,QAAQ,MAAM,OAAO,EAAE,CAAC;AAC3F,QAAM,EAAE,QAAQ,cAAc,IAAI,yBAAyB;AAE3D,QAAM,WAAW,cAAc,QAAQ,CAAC;AACxC,QAAM,cAAc,cAAc,eAAe;AAEjD,QAAM,mBAAmB,CAAC,WAAoB;AAC5C,YAAQ,MAAM;AACd,QAAI,UAAU,cAAc,GAAG;AAC7B,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,kBACjC;AAAA,wBAAC,iBAAiB,SAAjB,EAAyB,WAAU,kBAClC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,+BAA+B,OAAO,gBAAgB,mBAAmB;AAAA,QAEpF;AAAA,8BAAC,YAAS,MAAM,IAAI,WAAU,iBAAgB;AAAA,UAC7C,cAAc,KACb;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,IACA,oBAAC,iBAAiB,QAAjB,EACC;AAAA,MAAC,iBAAiB;AAAA,MAAjB;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QAEZ;AAAA,8BAAC,UAAK,WAAU,+CACb,oBAAU,oCAAoC,GACjD;AAAA,UAEC,SAAS,SAAS,IACjB,SAAS,IAAI,CAAC,SAAS,UACrB;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,oBAAC,YAAS,MAAM,IAAI;AAAA,cAC1B,aAAY;AAAA,cACZ,OAAO,QAAQ;AAAA,cACf,MAAM,oBAAoB,IAAI,KAAK,QAAQ,YAAY,GAAG;AAAA,gBACxD,WAAW;AAAA,gBACX,QAAQ;AAAA,cACV,CAAC;AAAA,cACD,OAAO;AAAA,cACP,YAAY,QAAQ,SAAS,SAAS;AAAA;AAAA,YATjC,QAAQ;AAAA,UAUf,CACD,IAED,qBAAC,SAAI,WAAU,4DACb;AAAA,gCAAC,SAAI,WAAU,+BACb,8BAAC,YAAS,MAAM,IAAI,OAAM,yBAAwB,GACpD;AAAA,YACA,oBAAC,UAAK,WAAU,wCACb,oBAAU,oCAAoC,GACjD;AAAA,aACF;AAAA,UAGD,aACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS;AAAA,cAER,oBAAU,sCAAsC;AAAA;AAAA,UACnD;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/ProfilePopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useState } from \"react\";\r\nimport { useTranslations } from \"next-intl\";\r\nimport { useRouter } from \"next/navigation\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { Popover } from \"../ui/overlay/Popover\";\r\nimport { Button } from \"../ui/buttons/Button\";\r\nimport { Progress } from \"../ui/feedback/Progress\";\r\nimport { Separator } from \"../ui/data-display/Separator\";\r\nimport { NavBarItem } from \"./NavBarItem\";\r\nimport { UserAvatar } from \"../ui/data-display/UserAvatar\";\r\nimport { LoadingOverlay } from \"../ui/feedback/LoadingOverlay\";\r\nimport { useBrandLoadingIcon } from \"../../hooks/useBrandLoadingIcon\";\r\nimport { useAuth } from \"../../providers/auth.provider\";\r\nimport { useIsDefaultWhitelabel, useWhitelabelUrls } from \"../../providers/whitelabel.provider\";\r\nimport { cn } from \"../../infra/utils/clsx\";\r\nimport { useIaCredits } from \"../../modules/ia-credits/hooks/ia-credits.hook\";\r\nimport { useBuyCreditsModal } from \"../../store/useBuyCreditsModal\";\r\nimport { useCreditsDisabledModal } from \"../../store/useCreditsDisabledModal\";\r\n\r\nexport interface ProfileMenuItem {\r\n icon?: React.ReactNode;\r\n label: string;\r\n onClick: () => void;\r\n}\r\n\r\nexport interface ProfilePopoverProps {\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n menuItems?: ProfileMenuItem[];\r\n}\r\n\r\nfunction ProfilePopover({\r\n side = \"top\",\r\n align = \"start\",\r\n contentClassName = \"absolute bottom-2 left-[26px]\",\r\n menuItems = [],\r\n}: ProfilePopoverProps) {\r\n const translate = useTranslations();\r\n const { user, logout } = useAuth();\r\n const [isLoggingOut, setIsLoggingOut] = useState(false);\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n\r\n const { summary, subscription, isSubscriptionLoading, isCreditsLoading } =\r\n useIaCredits();\r\n const { openModal: openBuyCreditsModal } = useBuyCreditsModal();\r\n const { openModal: openCreditsDisabledModal } = useCreditsDisabledModal();\r\n const canManage = user?.profile === 'owner' || user?.profile === 'admin';\r\n const isDefaultWl = useIsDefaultWhitelabel();\r\n const { accountsUrl } = useWhitelabelUrls();\r\n const brandLoadingIcon = useBrandLoadingIcon();\r\n const router = useRouter();\r\n\r\n const handleLogout = async () => {\r\n setPopoverOpen(false);\r\n setIsLoggingOut(true);\r\n await logout();\r\n };\r\n\r\n const hasSubscription = !isSubscriptionLoading && subscription !== null;\r\n\r\n const isApiPlan = hasSubscription && subscription.id_plan === 411;\r\n const shouldShowCredits = hasSubscription && isDefaultWl && !isApiPlan;\r\n const creditsPercentage =\r\n shouldShowCredits && summary.totalCredits > 0\r\n ? (summary.usedCredits / summary.totalCredits) * 100\r\n : 0;\r\n\r\n return (\r\n <>\r\n <LoadingOverlay\r\n isLoading={isLoggingOut}\r\n message={translate('common.layout.profile.loggingOut')}\r\n icon={brandLoadingIcon}\r\n />\r\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\r\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\r\n {user && (\r\n <UserAvatar\r\n key={user.id}\r\n photo={user.photo}\r\n name={user.name}\r\n size={40}\r\n />\r\n )}\r\n </PopoverPrimitive.Trigger>\r\n\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n className={cn(\r\n \"w-64.75 p-0 bg-white rounded-2xl shadow-md border border-gray-200 z-99\",\r\n contentClassName,\r\n )}\r\n side={side}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <div className=\"grid grid-cols-[32px_1fr_auto] items-center gap-3 p-3 w-full\">\r\n {user && (\r\n <UserAvatar\r\n key={user.id}\r\n photo={user.photo}\r\n name={user.name}\r\n size={32}\r\n />\r\n )}\r\n\r\n <div className=\"flex flex-col gap-0.5 min-w-0\">\r\n <span className=\"paragraph-small-semibold text-gray-950 truncate\">\r\n {user?.name || \"\"}\r\n </span>\r\n <span className=\"paragraph-xsmall-medium text-gray-500 truncate\">\r\n {user?.email || \"\"}\r\n </span>\r\n </div>\r\n\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-8! px-3! paragraph-xsmall-semibold\"\r\n onClick={() => {\r\n const isSameOrigin = accountsUrl.startsWith(window.location.origin);\r\n if (isSameOrigin) {\r\n setPopoverOpen(false);\r\n router.push(`${window.location.pathname}?openProfile=true`);\r\n } else {\r\n window.location.href = `${accountsUrl}?openProfile=true`;\r\n }\r\n }}\r\n >\r\n {translate('common.actions.edit')}\r\n </Button>\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-2 border-t border-gray-200 rounded-2xl p-1.5\">\r\n {shouldShowCredits && (\r\n <div\r\n className={cn(\r\n \"flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4 transition-colors\",\r\n \"cursor-pointer hover:bg-gray-950/90\",\r\n )}\r\n onClick={() => {\r\n setPopoverOpen(false);\r\n if (canManage) {\r\n openBuyCreditsModal();\r\n } else {\r\n openCreditsDisabledModal();\r\n }\r\n }}\r\n >\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <span className=\"paragraph-xsmall-semibold text-white truncate\">\r\n {translate('common.layout.profile.usedCredits')}\r\n </span>\r\n <span className=\"paragraph-xsmall-medium text-white/50\">\r\n {summary.usedCredits.toLocaleString(\"pt-BR\")}/\r\n {summary.totalCredits.toLocaleString(\"pt-BR\")}\r\n </span>\r\n </div>\r\n <Progress\r\n className=\"bg-white/10\"\r\n indicatorColor=\"bg-white\"\r\n value={creditsPercentage}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"flex flex-col\">\r\n {menuItems.map((item, index) => (\r\n <NavBarItem\r\n key={index}\r\n icon={item.icon}\r\n label={item.label}\r\n onClick={item.onClick}\r\n />\r\n ))}\r\n </div>\r\n <Separator />\r\n <NavBarItem label={translate('common.layout.profile.logout')} onClick={handleLogout} />\r\n </div>\r\n </div>\r\n </PopoverPrimitive.Content>\r\n </PopoverPrimitive.Portal>\r\n </Popover>\r\n </>\r\n );\r\n}\r\n\r\nexport { ProfilePopover };\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layouts/ProfilePopover.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { useTranslations } from \"next-intl\";\nimport { useRouter } from \"next/navigation\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Popover } from \"../ui/overlay/Popover\";\nimport { Button } from \"../ui/buttons/Button\";\nimport { Progress } from \"../ui/feedback/Progress\";\nimport { Separator } from \"../ui/data-display/Separator\";\nimport { NavBarItem } from \"./NavBarItem\";\nimport { UserAvatar } from \"../ui/data-display/UserAvatar\";\nimport { LoadingOverlay } from \"../ui/feedback/LoadingOverlay\";\nimport { useBrandLoadingIcon } from \"../../hooks/useBrandLoadingIcon\";\nimport { useAuth } from \"../../providers/auth.provider\";\nimport { useIsDefaultWhitelabel, useWhitelabelUrls } from \"../../providers/whitelabel.provider\";\nimport { cn } from \"../../infra/utils/clsx\";\nimport { useIaCredits } from \"../../modules/ia-credits/hooks/ia-credits.hook\";\nimport { useBuyCreditsModal } from \"../../store/useBuyCreditsModal\";\nimport { useCreditsDisabledModal } from \"../../store/useCreditsDisabledModal\";\n\nexport interface ProfileMenuItem {\n icon?: React.ReactNode;\n label: string;\n onClick: () => void;\n}\n\nexport interface ProfilePopoverProps {\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n contentClassName?: string;\n menuItems?: ProfileMenuItem[];\n}\n\nfunction ProfilePopover({\n side = \"top\",\n align = \"start\",\n contentClassName = \"absolute bottom-2 left-[26px]\",\n menuItems = [],\n}: ProfilePopoverProps) {\n const translate = useTranslations();\n const { user, logout } = useAuth();\n const [isLoggingOut, setIsLoggingOut] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const { summary, subscription, isSubscriptionLoading, isCreditsLoading } =\n useIaCredits();\n const { openModal: openBuyCreditsModal } = useBuyCreditsModal();\n const { openModal: openCreditsDisabledModal } = useCreditsDisabledModal();\n const canManage = user?.profile === 'owner' || user?.profile === 'admin';\n const isDefaultWl = useIsDefaultWhitelabel();\n const { accountsUrl } = useWhitelabelUrls();\n const brandLoadingIcon = useBrandLoadingIcon();\n const router = useRouter();\n\n const handleLogout = async () => {\n setPopoverOpen(false);\n setIsLoggingOut(true);\n await logout();\n };\n\n const hasSubscription = !isSubscriptionLoading && subscription !== null;\n\n const isApiPlan = hasSubscription && subscription.id_plan === 411;\n const shouldShowCredits = hasSubscription && isDefaultWl && !isApiPlan;\n const creditsPercentage =\n shouldShowCredits && summary.totalCredits > 0\n ? (summary.usedCredits / summary.totalCredits) * 100\n : 0;\n\n return (\n <>\n <LoadingOverlay\n isLoading={isLoggingOut}\n message={translate('common.layout.profile.loggingOut')}\n icon={brandLoadingIcon}\n />\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\n {user && (\n <UserAvatar\n key={user.id}\n photo={user.photo}\n name={user.name}\n size={40}\n />\n )}\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n className={cn(\n \"w-64.75 p-0 bg-white rounded-2xl shadow-md border border-gray-200 z-99\",\n contentClassName,\n )}\n side={side}\n align={align}\n sideOffset={8}\n >\n <div className=\"grid grid-cols-[32px_1fr_auto] items-center gap-3 p-3 w-full\">\n {user && (\n <UserAvatar\n key={user.id}\n photo={user.photo}\n name={user.name}\n size={32}\n />\n )}\n\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span className=\"paragraph-small-semibold text-gray-950 truncate\">\n {user?.name || \"\"}\n </span>\n <span className=\"paragraph-xsmall-medium text-gray-500 truncate\">\n {user?.email || \"\"}\n </span>\n </div>\n\n <Button\n variant=\"secondary\"\n className=\"h-8! px-3! paragraph-xsmall-semibold\"\n onClick={() => {\n const isSameOrigin = accountsUrl.startsWith(window.location.origin);\n if (isSameOrigin) {\n setPopoverOpen(false);\n router.push(`${window.location.pathname}?openProfile=true`);\n } else {\n window.location.href = `${accountsUrl}?openProfile=true`;\n }\n }}\n >\n {translate('common.actions.edit')}\n </Button>\n </div>\n\n <div className=\"flex flex-col gap-2 border-t border-gray-200 rounded-2xl p-1.5\">\n {shouldShowCredits && (\n <div\n className={cn(\n \"flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4 transition-colors\",\n \"cursor-pointer hover:bg-gray-950/90\",\n )}\n onClick={() => {\n setPopoverOpen(false);\n if (canManage) {\n openBuyCreditsModal();\n } else {\n openCreditsDisabledModal();\n }\n }}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"paragraph-xsmall-semibold text-white truncate\">\n {translate('common.layout.profile.usedCredits')}\n </span>\n <span className=\"paragraph-xsmall-medium text-white/50\">\n {summary.usedCredits.toLocaleString(\"pt-BR\")}/\n {summary.totalCredits.toLocaleString(\"pt-BR\")}\n </span>\n </div>\n <Progress\n className=\"bg-white/10\"\n indicatorColor=\"bg-white\"\n value={creditsPercentage}\n />\n </div>\n )}\n\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col\">\n {menuItems.map((item, index) => (\n <NavBarItem\n key={index}\n icon={item.icon}\n label={item.label}\n onClick={item.onClick}\n />\n ))}\n </div>\n <Separator />\n <NavBarItem label={translate('common.layout.profile.logout')} onClick={handleLogout} />\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </Popover>\n </>\n );\n}\n\nexport { ProfilePopover };\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/SideBarNavigation.tsx"],"sourcesContent":["'use client';\r\n\r\nimport * as React from \"react\"\r\nimport { IconChevronLeft } from '@tabler/icons-react'\r\nimport { useDesktopSidebarStore } from \"../../store/useDesktopSidebarStore\"\r\nimport { useMdSidebarStore } from \"../../store/useMdSidebarStore\"\r\nimport { cn } from \"../../infra/utils/clsx\"\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/overlay/Tooltip\"\r\nimport { useIsDefaultWhitelabel } from \"../../providers/whitelabel.provider\";\r\n\r\nfunction SideBarNavigation({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<\"div\">) {\r\n const { isExpanded, collapse } = useDesktopSidebarStore()\r\n const collapseMd = useMdSidebarStore((s) => s.collapse)\r\n const isMainWhitelabel = useIsDefaultWhitelabel()\r\n\r\n React.useEffect(() => {\r\n const mql = window.matchMedia('(min-width: 1351px)')\r\n const handler = (e: MediaQueryListEvent) => {\r\n if (e.matches) collapseMd()\r\n }\r\n if (mql.matches) collapseMd()\r\n mql.addEventListener('change', handler)\r\n return () => mql.removeEventListener('change', handler)\r\n }, [collapseMd])\r\n\r\n return (\r\n <div\r\n data-slot=\"sidebar-navigation\"\r\n className=\"relative hidden lg:block h-screen overflow-visible z-30\"\r\n >\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <button\r\n onClick={collapse}\r\n className={cn(\r\n \"absolute -right-4 size-8 flex items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-all duration-300 z-[999]\",\r\n isMainWhitelabel ? 'top-[59px]' : 'top-[70px]',\r\n isExpanded ? \"opacity-100 scale-100\" : \"opacity-0 scale-0 pointer-events-none\",\r\n )}\r\n >\r\n <IconChevronLeft size={16} className=\"text-gray-500\" />\r\n </button>\r\n </TooltipTrigger>\r\n {isExpanded && <TooltipContent side=\"right\">Recolher menu</TooltipContent>}\r\n </Tooltip>\r\n <div\r\n className={cn(\r\n \"h-full transition-[width] duration-300 ease-in-out overflow-hidden\",\r\n isExpanded ? \"w-[273px] border-r border-gray-200\" : \"w-0\",\r\n )}\r\n {...props}\r\n >\r\n <div className={cn(\"flex flex-col h-full min-w-[273px] w-[273px] p-4\", className)}>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport { SideBarNavigation };\r\n"],"mappings":";AAkCY,SAUY,KAVZ;AAhCZ,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,UAAU;AACnB,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,8BAA8B;AAEvC,SAAS,kBAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAgC;AAC5B,QAAM,EAAE,YAAY,SAAS,IAAI,uBAAuB;AACxD,QAAM,aAAa,kBAAkB,CAAC,MAAM,EAAE,QAAQ;AACtD,QAAM,mBAAmB,uBAAuB;AAEhD,QAAM,UAAU,MAAM;AAClB,UAAM,MAAM,OAAO,WAAW,qBAAqB;AACnD,UAAM,UAAU,CAAC,MAA2B;AACxC,UAAI,EAAE,QAAS,YAAW;AAAA,IAC9B;AACA,QAAI,IAAI,QAAS,YAAW;AAC5B,QAAI,iBAAiB,UAAU,OAAO;AACtC,WAAO,MAAM,IAAI,oBAAoB,UAAU,OAAO;AAAA,EAC1D,GAAG,CAAC,UAAU,CAAC;AAEf,SACI;AAAA,IAAC;AAAA;AAAA,MACG,aAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,6BAAC,WACG;AAAA,8BAAC,kBAAe,SAAO,MACnB;AAAA,YAAC;AAAA;AAAA,cACG,SAAS;AAAA,cACT,WAAW;AAAA,gBACP;AAAA,gBACA,mBAAmB,eAAe;AAAA,gBAClC,aAAa,0BAA0B;AAAA,cAC3C;AAAA,cAEA,8BAAC,mBAAgB,MAAM,IAAI,WAAU,iBAAgB;AAAA;AAAA,UACzD,GACJ;AAAA,UACC,cAAc,oBAAC,kBAAe,MAAK,SAAQ,2BAAa;AAAA,WAC7D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,aAAa,uCAAuC;AAAA,YACxD;AAAA,YACC,GAAG;AAAA,YAEJ,8BAAC,SAAI,WAAW,GAAG,oDAAoD,SAAS,GAC3E,UACL;AAAA;AAAA,QACJ;AAAA;AAAA;AAAA,EACJ;AAER;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layouts/SideBarNavigation.tsx"],"sourcesContent":["'use client';\n\nimport * as React from \"react\"\nimport { IconChevronLeft } from '@tabler/icons-react'\nimport { useDesktopSidebarStore } from \"../../store/useDesktopSidebarStore\"\nimport { useMdSidebarStore } from \"../../store/useMdSidebarStore\"\nimport { cn } from \"../../infra/utils/clsx\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/overlay/Tooltip\"\nimport { useIsDefaultWhitelabel } from \"../../providers/whitelabel.provider\";\n\nfunction SideBarNavigation({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { isExpanded, collapse } = useDesktopSidebarStore()\n const collapseMd = useMdSidebarStore((s) => s.collapse)\n const isMainWhitelabel = useIsDefaultWhitelabel()\n\n React.useEffect(() => {\n const mql = window.matchMedia('(min-width: 1351px)')\n const handler = (e: MediaQueryListEvent) => {\n if (e.matches) collapseMd()\n }\n if (mql.matches) collapseMd()\n mql.addEventListener('change', handler)\n return () => mql.removeEventListener('change', handler)\n }, [collapseMd])\n\n return (\n <div\n data-slot=\"sidebar-navigation\"\n className=\"relative hidden lg:block h-screen overflow-visible z-30\"\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={collapse}\n className={cn(\n \"absolute -right-4 size-8 flex items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-all duration-300 z-[999]\",\n isMainWhitelabel ? 'top-[59px]' : 'top-[70px]',\n isExpanded ? \"opacity-100 scale-100\" : \"opacity-0 scale-0 pointer-events-none\",\n )}\n >\n <IconChevronLeft size={16} className=\"text-gray-500\" />\n </button>\n </TooltipTrigger>\n {isExpanded && <TooltipContent side=\"right\">Recolher menu</TooltipContent>}\n </Tooltip>\n <div\n className={cn(\n \"h-full transition-[width] duration-300 ease-in-out overflow-hidden\",\n isExpanded ? \"w-[273px] border-r border-gray-200\" : \"w-0\",\n )}\n {...props}\n >\n <div className={cn(\"flex flex-col h-full min-w-[273px] w-[273px] p-4\", className)}>\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nexport { SideBarNavigation };\n"],"mappings":";AAkCY,SAUY,KAVZ;AAhCZ,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,UAAU;AACnB,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,8BAA8B;AAEvC,SAAS,kBAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAgC;AAC5B,QAAM,EAAE,YAAY,SAAS,IAAI,uBAAuB;AACxD,QAAM,aAAa,kBAAkB,CAAC,MAAM,EAAE,QAAQ;AACtD,QAAM,mBAAmB,uBAAuB;AAEhD,QAAM,UAAU,MAAM;AAClB,UAAM,MAAM,OAAO,WAAW,qBAAqB;AACnD,UAAM,UAAU,CAAC,MAA2B;AACxC,UAAI,EAAE,QAAS,YAAW;AAAA,IAC9B;AACA,QAAI,IAAI,QAAS,YAAW;AAC5B,QAAI,iBAAiB,UAAU,OAAO;AACtC,WAAO,MAAM,IAAI,oBAAoB,UAAU,OAAO;AAAA,EAC1D,GAAG,CAAC,UAAU,CAAC;AAEf,SACI;AAAA,IAAC;AAAA;AAAA,MACG,aAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,6BAAC,WACG;AAAA,8BAAC,kBAAe,SAAO,MACnB;AAAA,YAAC;AAAA;AAAA,cACG,SAAS;AAAA,cACT,WAAW;AAAA,gBACP;AAAA,gBACA,mBAAmB,eAAe;AAAA,gBAClC,aAAa,0BAA0B;AAAA,cAC3C;AAAA,cAEA,8BAAC,mBAAgB,MAAM,IAAI,WAAU,iBAAgB;AAAA;AAAA,UACzD,GACJ;AAAA,UACC,cAAc,oBAAC,kBAAe,MAAK,SAAQ,2BAAa;AAAA,WAC7D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,aAAa,uCAAuC;AAAA,YACxD;AAAA,YACC,GAAG;AAAA,YAEJ,8BAAC,SAAI,WAAW,GAAG,oDAAoD,SAAS,GAC3E,UACL;AAAA;AAAA,QACJ;AAAA;AAAA;AAAA,EACJ;AAER;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/UsersSelectorPopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport { useTranslations } from \"next-intl\";\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 translate = useTranslations();\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\">{translate('common.layout.usersSelector.title')}</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 {translate('common.layout.usersSelector.add')}\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={translate('common.layout.usersSelector.searchPlaceholder')}\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 {translate('common.layout.usersSelector.empty')}\r\n </span>\r\n </div>\r\n ) : (\r\n <>\r\n <CommandEmpty>{translate('common.layout.usersSelector.noResults')}</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 ? translate('common.layout.usersSelector.removeFromProject') : translate('common.layout.usersSelector.addToProject')}\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 {translate('common.layout.usersSelector.manageTeam')}\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
+ {"version":3,"sources":["../../../src/components/layouts/UsersSelectorPopover.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useTranslations } from \"next-intl\";\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 translate = useTranslations();\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\">{translate('common.layout.usersSelector.title')}</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 {translate('common.layout.usersSelector.add')}\n </Button>\n </div>\n </div>\n\n <Command shouldFilter={false} className=\"gap-2\" value=\"\">\n <CommandInput\n placeholder={translate('common.layout.usersSelector.searchPlaceholder')}\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 {translate('common.layout.usersSelector.empty')}\n </span>\n </div>\n ) : (\n <>\n <CommandEmpty>{translate('common.layout.usersSelector.noResults')}</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 ? translate('common.layout.usersSelector.removeFromProject') : translate('common.layout.usersSelector.addToProject')}\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 {translate('common.layout.usersSelector.manageTeam')}\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
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
+ {"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 +1 @@
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, useExternalContracting } from '../../providers/whitelabel.provider';\r\nimport { IconInfoCircle, IconX, IconLoader2, IconSparkles } from '@tabler/icons-react';\r\nimport { useTranslations } from 'next-intl';\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 translate = useTranslations();\r\n const { open, closeModal } = useBuyCreditsModal();\r\n const { openModal } = useModalManager();\r\n const isDefaultWl = useIsDefaultWhitelabel();\r\n const { isExternalContracting, redirectToExternal } = useExternalContracting();\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 {translate('common.credits.buy.creditsOptionLabel', { credits: opt.credits.toLocaleString('pt-BR') })}\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: translate('common.credits.buy.creditsOptionDisplayValue', { credits: opt.credits.toLocaleString('pt-BR') }),\r\n }));\r\n }, [translate]);\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={translate('common.credits.buy.creditsChangedToast', { credits: 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 ? translate('common.credits.buy.defaultPrice') : 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 if (isExternalContracting) {\r\n return (\r\n <Dialog open={open} onOpenChange={handleClose}>\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 <IconSparkles 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 {translate('common.credits.buy.externalTitle')}\r\n </DialogTitle>\r\n <span className=\"paragraph-small-regular text-zinc-600\">\r\n {translate('common.credits.buy.externalDescription')}\r\n </span>\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={() => {\r\n closeModal();\r\n redirectToExternal('contracting');\r\n }}\r\n >\r\n {translate('common.credits.buy.externalButton')}\r\n </Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n }\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 {translate('common.credits.buy.title')}\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 ? translate('common.credits.buy.paymentOnConfirm')\r\n : translate('common.credits.buy.nextInvoiceChanges')}\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\">{translate('common.credits.buy.immediateCharge')}</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\">{translate('common.credits.buy.totalPlanValue')}</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 {translate('common.credits.buy.confirmAndPay')}\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\">{translate('common.credits.buy.immediateCharge')}</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\">{translate('common.credits.buy.totalPlanValue')}</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 {translate('common.credits.buy.confirmAndPay')}\r\n </Button>\r\n </div>\r\n </form>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":";AA4LQ,SACE,KADF;AA1LR;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,SAAS,6BAA6B;AACtC,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,kCAAkC;AAC3C,SAAS,wBAAwB,8BAA8B;AAC/D,SAAS,gBAAgB,OAAO,aAAa,oBAAoB;AACjE,SAAS,uBAAuB;AAChC,SAAS,aAAa,WAAW,SAAS,cAAc;AACxD,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,OAAO,OAAO;AACd,SAAS,aAAa;AAEtB,MAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,iBAAiB,IAAI,GAAG,GAAG;AAAA,IAClE,SAAS;AAAA,EACX,CAAC;AAAA,EACD,gBAAgB,EAAE,OAAO,EAAE,IAAI,GAAG,wBAAqB;AACzD,CAAC;AAIc,SAAR,kBAAmC;AACxC,QAAM,YAAY,gBAAgB;AAClC,QAAM,EAAE,MAAM,WAAW,IAAI,mBAAmB;AAChD,QAAM,EAAE,UAAU,IAAI,gBAAgB;AACtC,QAAM,cAAc,uBAAuB;AAC3C,QAAM,EAAE,uBAAuB,mBAAmB,IAAI,uBAAuB;AAC7E,QAAM,EAAE,MAAM,UAAU,IAAI,SAAS;AACrC,QAAM,EAAE,MAAM,iBAAiB,IAAI,sBAAsB;AACzD,QAAM,eAAe,kBAAkB,OAAO,CAAC,KAAK;AACpD,QAAM,gBACJ,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,UAAU,GAAG,IAAI,SAAS,KAC/D,WAAW,OAAO,CAAC,GAAG,IAAI,SAAS,KACnC;AAEF,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,MAAM;AAAA,EACR,IAAI,yBAAyB;AAC7B,QAAM,qBAAqB,0BAA0B;AAErD,QAAM,SAAS;AAAA,IACb,MAAM,cAAc,OAAO,KAAK,CAAC,SAAS,KAAK,aAAa,UAAU,EAAE;AAAA,IACxE,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,iBAAiB,QAAQ,YAAY;AAC3C,QAAM,iBAAiB,cAAc;AACrC,QAAM,SAAS,cAAc;AAE7B,QAAM,OAAO,QAA2B;AAAA,IACtC,UAAU,YAAY,eAAe;AAAA,IACrC,MAAM;AAAA,IACN,eAAe;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,OAAO,KAAK;AAEnC,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,qBAAe,UAAU;AACzB;AAAA,IACF;AAEA,QAAI,eAAe,WAAW,CAAC,aAAc;AAC7C,mBAAe,UAAU;AAEzB,SAAK,MAAM;AAAA,MACT,cAAc;AAAA,MACd,gBAAgB;AAAA,IAClB,CAAC;AAED,cAAU;AAAA,MACR,YAAY;AAAA,MACZ,GAAI,UAAU,QAAQ,EAAE,SAAS,OAAO;AAAA,MACxC,GAAI,kBAAkB,QAAQ,EAAE,iBAAiB,eAAe;AAAA,MAChE,aAAa;AAAA,QACX,EAAE,UAAU,UAAU,IAAI,UAAU,eAAe;AAAA,MACrD;AAAA,IACF,CAAC;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,YAAU,MAAM;AACd,QAAI,QAAQ,iBAAiB,CAAC,KAAK,UAAU,gBAAgB,GAAG;AAC9D,WAAK,SAAS,kBAAkB,eAAe,EAAE,gBAAgB,KAAK,CAAC;AAAA,IACzE;AAAA,EACF,GAAG,CAAC,MAAM,eAAe,IAAI,CAAC;AAE9B,QAAM,eAAe,KAAK,MAAM,cAAc;AAC9C,QAAM,iBAAiB,KAAK,MAAM,gBAAgB;AAClD,QAAM,EAAE,SAAS,cAAc,QAAQ,IAAI,KAAK;AAGhD,QAAM,2BAA2B;AAAA,IAC/B,CAAC,UAAqC;AACpC,YAAM,UAAU,OAAO,KAAK;AAE5B,WAAK,SAAS,gBAAgB,SAAS;AAAA,QACrC,gBAAgB;AAAA,QAChB,aAAa;AAAA,MACf,CAAC;AAED,YAAM,SAAS,kBAAkB,KAAK,CAAC,QAAQ,IAAI,YAAY,OAAO;AACtE,UAAI,CAAC,OAAQ;AAEb,gBAAU;AAAA,QACR,YAAY;AAAA,QACZ,GAAI,UAAU,QAAQ,EAAE,SAAS,OAAO;AAAA,QACxC,GAAI,kBAAkB,QAAQ,EAAE,iBAAiB,eAAe;AAAA,QAChE,aAAa;AAAA,UACX,EAAE,UAAU,UAAU,IAAI,UAAU,OAAO,SAAS,UAAU,MAAM;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM,gBAAgB,QAAQ,SAAS;AAAA,EAC1C;AAEA,QAAM,iBAAiB,eAAe,QAAQ;AAE9C,QAAM,sBAAsB,eAAe;AAC3C,QAAM,aAAa,iBAAiB;AAEpC,QAAM,uBAAuB,gBAAgB,QAAQ,kBAAkB,SAAS;AAEhF,QAAM,aAAa,QAAQ,MAAM;AAC/B,QAAI,CAAC,eAAgB,QAAO;AAC5B,WAAO,2BAA2B,gBAAgB,cAAc,WAAW;AAAA,EAC7E,GAAG,CAAC,gBAAgB,YAAY,CAAC;AAEjC,QAAM,cAAc,YAAY,CAAC,UAAkB;AACjD,WAAO,MAAM,eAAe,SAAS;AAAA,MACnC,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,CAAC,WAAW,CAAC,WAAW,sBAAsB;AAExE,QAAM,cAAc,YAAY,MAAM;AACpC,SAAK,MAAM;AACX,eAAW;AAAA,EACb,GAAG,CAAC,MAAM,UAAU,CAAC;AAErB,QAAM,yBAAyB,YAAY,MAAM;AAC/C,cAAU,cAAc;AAAA,EAC1B,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,gBAAgB,QAAQ,MAAM;AAClC,WAAO,kBAAkB,IAAI,CAAC,SAAS;AAAA,MACrC,OAAO,IAAI;AAAA,MACX,OACE,qBAAC,SAAI,WAAU,kDACb;AAAA,4BAAC,UAAK,WAAU,+CACb,oBAAU,yCAAyC,EAAE,SAAS,IAAI,QAAQ,eAAe,OAAO,EAAE,CAAC,GACtG;AAAA,QACA,oBAAC,UAAK,WAAU,mDAAmD,cAAI,YAAW;AAAA,SACpF;AAAA,MAEF,cAAc,UAAU,gDAAgD,EAAE,SAAS,IAAI,QAAQ,eAAe,OAAO,EAAE,CAAC;AAAA,IAC1H,EAAE;AAAA,EACJ,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,WAAW;AAAA,IACf,OAAO,SAA4B;AACjC,UAAI,CAAC,eAAgB;AAErB,YAAM,SAAS,kBAAkB,KAAK,CAAC,QAAQ,IAAI,YAAY,KAAK,YAAY;AAChF,UAAI,CAAC,OAAQ;AAEb,YAAM,mBAAmB,YAAY;AAAA,QACnC;AAAA,QACA,MAAM;AAAA,UACJ,aAAa;AAAA,YACX;AAAA,cACE,UAAU,UAAU;AAAA,cACpB,UAAU,OAAO;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,OAAO,CAAC,MACZ;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,UAAU,0CAA0C,EAAE,SAAS,KAAK,aAAa,eAAe,OAAO,EAAE,CAAC;AAAA,UACnH,SAAS;AAAA;AAAA,MACX,CACD;AACD,WAAK,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,IACA,CAAC,gBAAgB,oBAAoB,MAAM,UAAU;AAAA,EACvD;AAEA,QAAM,qBAAqB,YAAY,MAAM;AAC3C,QAAI,oBAAoB;AACtB,aAAO,oBAAC,YAAS,WAAU,YAAW;AAAA,IACxC;AACA,QAAI,eAAe,MAAM;AACvB,aACE,oBAAC,UAAK,WAAU,2CACb,yBAAe,IAAI,UAAU,iCAAiC,IAAI,YAAY,UAAU,GAC3F;AAAA,IAEJ;AACA,WAAO,oBAAC,UAAK,WAAU,2CAA0C,gBAAE;AAAA,EACrE,GAAG,CAAC,oBAAoB,YAAY,WAAW,CAAC;AAEhD,MAAI,uBAAuB;AACzB,WACE,oBAAC,UAAO,MAAY,cAAc,aAChC,+BAAC,iBAAc,WAAU,4DACvB;AAAA,2BAAC,gBAAa,WAAU,uBACtB;AAAA,4BAAC,SAAI,WAAU,oEACb,8BAAC,gBAAa,MAAM,IAAI,WAAU,iBAAgB,GACpD;AAAA,QACA,qBAAC,SAAI,WAAU,uBACb;AAAA,8BAAC,eAAY,WAAU,2CACpB,oBAAU,kCAAkC,GAC/C;AAAA,UACA,oBAAC,UAAK,WAAU,yCACb,oBAAU,wCAAwC,GACrD;AAAA,WACF;AAAA,SACF;AAAA,MACA,oBAAC,SAAI,WAAU,wDACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM;AACb,uBAAW;AACX,+BAAmB,aAAa;AAAA,UAClC;AAAA,UAEC,oBAAU,mCAAmC;AAAA;AAAA,MAChD,GACF;AAAA,OACF,GACF;AAAA,EAEJ;AAEA,SACE,oBAAC,UAAO,MAAY,cAAc,aAChC;AAAA,IAAC;AAAA;AAAA,MACC,iBAAiB;AAAA,MACjB,WAAU;AAAA,MAEV;AAAA,6BAAC,gBAAa,WAAU,wDACtB;AAAA,8BAAC,eAAY,WAAU,uDACpB,oBAAU,0BAA0B,GACvC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,8BAAC,SAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA;AAAA,UAC7C;AAAA,WACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,KAAK,aAAa,QAAQ;AAAA,YACpC,WAAU;AAAA,YAEV;AAAA,mCAAC,SAAI,WAAU,+EACb;AAAA,qCAAC,SAAI,WAAU,uBACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS;AAAA,sBACT,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,WAAU;AAAA;AAAA,kBACZ;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA,cAAc,CAAC,WACb,KAAK,SAAS,kBAAkB,QAAQ,EAAE,gBAAgB,KAAK,CAAC;AAAA,sBAElE,eAAe;AAAA;AAAA,kBACjB;AAAA,kBAEC,cACC,qBAAC,SAAI,WAAW,0CAA0C,cAAc,eAAe,YAAY,IACjG;AAAA,wCAAC,kBAAe,WAAU,iCAAgC;AAAA,oBAC1D,oBAAC,UAAK,WAAU,yCACb,gCACG,UAAU,qCAAqC,IAC/C,UAAU,uCAAuC,GACvD;AAAA,qBACF;AAAA,mBAEJ;AAAA,gBAEA,oBAAC,aAAU,WAAU,+BAA8B;AAAA,gBAEnD,qBAAC,SAAI,WAAU,iCACZ;AAAA,2CAAyB,QAAQ,uBAAuB,KACvD,qBAAC,SAAI,WAAU,qCACb;AAAA,wCAAC,UAAK,WAAU,yCAAyC,oBAAU,oCAAoC,GAAE;AAAA,oBACxG,qBACC,oBAAC,YAAS,WAAU,YAAW,IAE/B,oBAAC,UAAK,WAAU,0CACb,sBAAY,oBAAoB,GACnC;AAAA,qBAEJ;AAAA,kBAEF,qBAAC,SAAI,WAAU,qCACb;AAAA,wCAAC,UAAK,WAAU,wCAAwC,oBAAU,mCAAmC,GAAE;AAAA,oBACtG,mBAAmB;AAAA,qBACtB;AAAA,mBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,UAAU;AAAA,oBACV,WAAU;AAAA,oBAET;AAAA,sCAAgB,oBAAC,eAAY,WAAU,uBAAsB;AAAA,sBAC7D,UAAU,kCAAkC;AAAA;AAAA;AAAA,gBAC/C;AAAA,iBACF;AAAA,cAEA,qBAAC,SAAI,WAAU,uEACb;AAAA,qCAAC,SAAI,WAAU,uBACZ;AAAA,2CAAyB,QAAQ,uBAAuB,KACvD,qBAAC,SAAI,WAAU,qCACb;AAAA,wCAAC,UAAK,WAAU,yCAAyC,oBAAU,oCAAoC,GAAE;AAAA,oBACxG,qBACC,oBAAC,YAAS,WAAU,YAAW,IAE/B,oBAAC,UAAK,WAAU,0CACb,sBAAY,oBAAoB,GACnC;AAAA,qBAEJ;AAAA,kBAEF,qBAAC,SAAI,WAAU,qCACb;AAAA,wCAAC,UAAK,WAAU,wCAAwC,oBAAU,mCAAmC,GAAE;AAAA,oBACtG,mBAAmB;AAAA,qBACtB;AAAA,mBACF;AAAA,gBACA,qBAAC,UAAO,MAAK,UAAS,UAAU,mBAAmB,WAAU,UAC1D;AAAA,kCAAgB,oBAAC,eAAY,WAAU,uBAAsB;AAAA,kBAC7D,UAAU,kCAAkC;AAAA,mBAC/C;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
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, useExternalContracting } from '../../providers/whitelabel.provider';\nimport { IconInfoCircle, IconX, IconLoader2, IconSparkles } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\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 translate = useTranslations();\n const { open, closeModal } = useBuyCreditsModal();\n const { openModal } = useModalManager();\n const isDefaultWl = useIsDefaultWhitelabel();\n const { isExternalContracting, redirectToExternal } = useExternalContracting();\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 {translate('common.credits.buy.creditsOptionLabel', { credits: opt.credits.toLocaleString('pt-BR') })}\n </span>\n <span className=\"paragraph-small-medium text-zinc-500 opacity-70\">{opt.priceLabel}</span>\n </div>\n ),\n displayValue: translate('common.credits.buy.creditsOptionDisplayValue', { credits: opt.credits.toLocaleString('pt-BR') }),\n }));\n }, [translate]);\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={translate('common.credits.buy.creditsChangedToast', { credits: 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 ? translate('common.credits.buy.defaultPrice') : formatPrice(totalPrice)}\n </span>\n );\n }\n return <span className=\"paragraph-xlarge-semibold text-zinc-400\">--</span>;\n }, [isCalculatePending, totalPrice, formatPrice]);\n\n if (isExternalContracting) {\n return (\n <Dialog open={open} onOpenChange={handleClose}>\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 <IconSparkles 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 {translate('common.credits.buy.externalTitle')}\n </DialogTitle>\n <span className=\"paragraph-small-regular text-zinc-600\">\n {translate('common.credits.buy.externalDescription')}\n </span>\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={() => {\n closeModal();\n redirectToExternal('contracting');\n }}\n >\n {translate('common.credits.buy.externalButton')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n }\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 {translate('common.credits.buy.title')}\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 ? translate('common.credits.buy.paymentOnConfirm')\n : translate('common.credits.buy.nextInvoiceChanges')}\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\">{translate('common.credits.buy.immediateCharge')}</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\">{translate('common.credits.buy.totalPlanValue')}</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 {translate('common.credits.buy.confirmAndPay')}\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\">{translate('common.credits.buy.immediateCharge')}</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\">{translate('common.credits.buy.totalPlanValue')}</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 {translate('common.credits.buy.confirmAndPay')}\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modals/CreditsDisabledModal.tsx"],"sourcesContent":["'use client';\r\n\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 { Button } from '../ui/buttons/Button';\r\nimport { Separator } from '../ui/data-display/Separator';\r\nimport { IconAlertTriangle } from '@tabler/icons-react';\r\nimport { useTranslations } from 'next-intl';\r\nimport { useCreditsDisabledModal } from '../../store/useCreditsDisabledModal';\r\n\r\nexport default function CreditsDisabledModal() {\r\n const translate = useTranslations();\r\n const { open, closeModal } = useCreditsDisabledModal();\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onOpenChange={(nextOpen) => {\r\n if (!nextOpen) closeModal();\r\n }}\r\n >\r\n <DialogContent\r\n onOpenAutoFocus={(e) => e.preventDefault()}\r\n className=\"flex flex-col p-0 gap-0 md:w-[410px]! lg:w-[410px]! max-w-[410px]! max-[410px]:w-[calc(100%-32px)] duration-0!\"\r\n >\r\n <DialogHeader className=\"gap-3 text-left p-5\">\r\n <div className=\"flex items-center justify-center w-10 h-10 bg-gray-100 rounded-lg\">\r\n <IconAlertTriangle size={20} className=\"text-gray-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 {translate('common.credits.disabled.title')}\r\n </DialogTitle>\r\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\" asChild>\r\n <div className=\"flex flex-col gap-3\">\r\n <p>{translate('common.credits.disabled.descriptionLine1')}</p>\r\n <p>{translate('common.credits.disabled.descriptionLine2')}</p>\r\n </div>\r\n </DialogDescription>\r\n </div>\r\n </DialogHeader>\r\n\r\n <Separator />\r\n\r\n <div className=\"flex items-center gap-2 p-5\">\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-10! transition-colors\"\r\n onClick={() => closeModal()}\r\n >\r\n {translate('common.credits.disabled.understood')}\r\n </Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":";AAgCY,cAOE,YAPF;AA9BZ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AAEzB,SAAR,uBAAwC;AAC7C,QAAM,YAAY,gBAAgB;AAClC,QAAM,EAAE,MAAM,WAAW,IAAI,wBAAwB;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,CAAC,aAAa;AAC1B,YAAI,CAAC,SAAU,YAAW;AAAA,MAC5B;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,UACzC,WAAU;AAAA,UAEV;AAAA,iCAAC,gBAAa,WAAU,uBACtB;AAAA,kCAAC,SAAI,WAAU,qEACb,8BAAC,qBAAkB,MAAM,IAAI,WAAU,iBAAgB,GACzD;AAAA,cACA,qBAAC,SAAI,WAAU,uBACb;AAAA,oCAAC,eAAY,WAAU,2CACpB,oBAAU,+BAA+B,GAC5C;AAAA,gBACA,oBAAC,qBAAkB,WAAU,yCAAwC,SAAO,MAC1E,+BAAC,SAAI,WAAU,uBACb;AAAA,sCAAC,OAAG,oBAAU,0CAA0C,GAAE;AAAA,kBAC1D,oBAAC,OAAG,oBAAU,0CAA0C,GAAE;AAAA,mBAC5D,GACF;AAAA,iBACF;AAAA,eACF;AAAA,YAEA,oBAAC,aAAU;AAAA,YAEX,oBAAC,SAAI,WAAU,+BACb;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,SAAS,MAAM,WAAW;AAAA,gBAEzB,oBAAU,oCAAoC;AAAA;AAAA,YACjD,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modals/CreditsDisabledModal.tsx"],"sourcesContent":["'use client';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../ui/overlay/Dialog';\nimport { Button } from '../ui/buttons/Button';\nimport { Separator } from '../ui/data-display/Separator';\nimport { IconAlertTriangle } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { useCreditsDisabledModal } from '../../store/useCreditsDisabledModal';\n\nexport default function CreditsDisabledModal() {\n const translate = useTranslations();\n const { open, closeModal } = useCreditsDisabledModal();\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) closeModal();\n }}\n >\n <DialogContent\n onOpenAutoFocus={(e) => e.preventDefault()}\n className=\"flex flex-col p-0 gap-0 md:w-[410px]! lg:w-[410px]! max-w-[410px]! max-[410px]:w-[calc(100%-32px)] duration-0!\"\n >\n <DialogHeader className=\"gap-3 text-left p-5\">\n <div className=\"flex items-center justify-center w-10 h-10 bg-gray-100 rounded-lg\">\n <IconAlertTriangle size={20} className=\"text-gray-950\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\n {translate('common.credits.disabled.title')}\n </DialogTitle>\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\" asChild>\n <div className=\"flex flex-col gap-3\">\n <p>{translate('common.credits.disabled.descriptionLine1')}</p>\n <p>{translate('common.credits.disabled.descriptionLine2')}</p>\n </div>\n </DialogDescription>\n </div>\n </DialogHeader>\n\n <Separator />\n\n <div className=\"flex items-center gap-2 p-5\">\n <Button\n variant=\"secondary\"\n className=\"h-10! transition-colors\"\n onClick={() => closeModal()}\n >\n {translate('common.credits.disabled.understood')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AAgCY,cAOE,YAPF;AA9BZ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AAEzB,SAAR,uBAAwC;AAC7C,QAAM,YAAY,gBAAgB;AAClC,QAAM,EAAE,MAAM,WAAW,IAAI,wBAAwB;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,CAAC,aAAa;AAC1B,YAAI,CAAC,SAAU,YAAW;AAAA,MAC5B;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,UACzC,WAAU;AAAA,UAEV;AAAA,iCAAC,gBAAa,WAAU,uBACtB;AAAA,kCAAC,SAAI,WAAU,qEACb,8BAAC,qBAAkB,MAAM,IAAI,WAAU,iBAAgB,GACzD;AAAA,cACA,qBAAC,SAAI,WAAU,uBACb;AAAA,oCAAC,eAAY,WAAU,2CACpB,oBAAU,+BAA+B,GAC5C;AAAA,gBACA,oBAAC,qBAAkB,WAAU,yCAAwC,SAAO,MAC1E,+BAAC,SAAI,WAAU,uBACb;AAAA,sCAAC,OAAG,oBAAU,0CAA0C,GAAE;AAAA,kBAC1D,oBAAC,OAAG,oBAAU,0CAA0C,GAAE;AAAA,mBAC5D,GACF;AAAA,iBACF;AAAA,eACF;AAAA,YAEA,oBAAC,aAAU;AAAA,YAEX,oBAAC,SAAI,WAAU,+BACb;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,SAAS,MAAM,WAAW;AAAA,gBAEzB,oBAAU,oCAAoC;AAAA;AAAA,YACjD,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -64,7 +64,7 @@ function HexaPromoModal() {
64
64
  {
65
65
  showCloseButton: false,
66
66
  onOpenAutoFocus: (e) => e.preventDefault(),
67
- className: "border-0 bg-transparent p-0 shadow-none w-[calc(100%-32px)] sm:max-w-[940px] md:w-[924px] lg:w-[924px]",
67
+ className: "border-0 bg-transparent p-0 shadow-none w-[calc(100%-32px)] sm:max-w-[940px] md:w-[924px] lg:w-[924px] max-h-[calc(100dvh-32px)] overflow-y-auto",
68
68
  children: [
69
69
  /* @__PURE__ */ jsx(DialogTitle, { className: "sr-only", children: COPY.title }),
70
70
  /* @__PURE__ */ jsx("div", { className: "rounded-[12px] p-1", style: { background: GRADIENT }, children: /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden rounded-[10px] bg-white p-8 shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)]", children: [
@@ -74,7 +74,7 @@ function HexaPromoModal() {
74
74
  src: "/promo/hexa-confetti.png",
75
75
  alt: "",
76
76
  "aria-hidden": true,
77
- className: "pointer-events-none absolute -top-10 right-0 w-[280px] select-none"
77
+ className: "pointer-events-none absolute -top-10 right-0 w-[280px] -rotate-16 select-none"
78
78
  }
79
79
  ),
80
80
  /* @__PURE__ */ jsxs(DialogClose, { className: "absolute right-3 top-3 z-10 flex size-8 items-center justify-center rounded-lg p-2 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-950 focus:outline-none", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modals/HexaPromoModal.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { toast } from 'sonner';\r\nimport {\r\n IconCheck,\r\n IconCopy,\r\n IconInfoCircle,\r\n IconStar,\r\n IconTicket,\r\n IconX,\r\n} from '@tabler/icons-react';\r\nimport { Dialog, DialogClose, DialogContent, DialogTitle } from '../ui/overlay/Dialog';\r\nimport { Toast } from '../ui/feedback/Toast';\r\nimport { Button } from '../ui/buttons/Button';\r\nimport useCopyToClipboard from '../../hooks/copy-to-clipboard.hook';\r\nimport { useModalManager } from '../../store/useModalManager';\r\nimport { useWhitelabelUrls } from '../../providers/whitelabel.provider';\r\nimport { cn } from '../../infra/utils/clsx';\r\n\r\ninterface HexaCombo {\r\n coupon: string;\r\n name: string;\r\n features: string[];\r\n highlighted: boolean;\r\n}\r\n\r\n// Campanha \"Rumo ao Hexa\" — exclusiva da whitelabel 1 (público pt-br). O texto é fixo de\r\n// propósito: a modal precisa renderizar também no gapps, que não tem provider de next-intl.\r\nconst COPY = {\r\n title: 'Rumo ao Hexa!',\r\n subtitlePrefix: 'Ofertas exclusivas até ',\r\n subtitleDate: '24/06',\r\n mostChosen: 'Mais escolhido',\r\n couponLabel: 'Cupom',\r\n choosePlan: 'Escolher plano',\r\n couponCopied: 'Cupom copiado!',\r\n close: 'Fechar',\r\n footerPrefix: 'Válido para a ',\r\n footerBold: 'primeira contratação',\r\n footerSuffix: ' dos planos Essencial, Negócio ou Agência',\r\n};\r\n\r\nconst COMBOS: HexaCombo[] = [\r\n {\r\n coupon: 'MENSAL10',\r\n name: 'Combo convocação',\r\n highlighted: false,\r\n features: ['10% OFF no plano mensal', 'Webinars exclusivos'],\r\n },\r\n {\r\n coupon: 'SEMESTRAL10',\r\n name: 'Combo Hexa',\r\n highlighted: true,\r\n features: ['10% OFF no plano semestral', '3 templates exclusivos', 'Webinars exclusivos'],\r\n },\r\n {\r\n coupon: 'ANUAL10',\r\n name: 'Combo escalação',\r\n highlighted: false,\r\n features: ['10% OFF no plano anual', '3 templates exclusivos'],\r\n },\r\n];\r\n\r\n// Cores promocionais (verde/amarelo do Brasil) — específicas desta campanha, fora do design\r\n// system, por isso ficam hardcoded apenas aqui.\r\nconst GRADIENT = 'linear-gradient(180deg, #08c44f 0%, #7bd237 46.6%, #ffe31b 100%)';\r\n\r\nexport default function HexaPromoModal() {\r\n const { activeModal, closeModal } = useModalManager();\r\n const { accountsUrl } = useWhitelabelUrls();\r\n const isOpen = activeModal === 'hexaPromoModal';\r\n\r\n const goToPlans = (coupon: string) => {\r\n closeModal();\r\n const url = `${accountsUrl}/subscriptions?tab=plans&coupon=${encodeURIComponent(coupon)}`;\r\n window.location.assign(url);\r\n };\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={() => closeModal()}>\r\n <DialogContent\r\n showCloseButton={false}\r\n onOpenAutoFocus={(e) => e.preventDefault()}\r\n className=\"border-0 bg-transparent p-0 shadow-none w-[calc(100%-32px)] sm:max-w-[940px] md:w-[924px] lg:w-[924px]\"\r\n >\r\n <DialogTitle className=\"sr-only\">{COPY.title}</DialogTitle>\r\n\r\n <div className=\"rounded-[12px] p-1\" style={{ background: GRADIENT }}>\r\n <div className=\"relative overflow-hidden rounded-[10px] bg-white p-8 shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)]\">\r\n {/* Arte decorativa (festão/bandeira) no canto superior direito */}\r\n <img\r\n src=\"/promo/hexa-confetti.png\"\r\n alt=\"\"\r\n aria-hidden\r\n className=\"pointer-events-none absolute -top-10 right-0 w-[280px] select-none\"\r\n />\r\n\r\n <DialogClose className=\"absolute right-3 top-3 z-10 flex size-8 items-center justify-center rounded-lg p-2 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-950 focus:outline-none\">\r\n <span className=\"sr-only\">{COPY.close}</span>\r\n <IconX className=\"size-[18px]\" />\r\n </DialogClose>\r\n\r\n {/* Header: logo + bandeira */}\r\n <div className=\"relative z-[1] flex w-fit items-center gap-[9px] rounded-lg bg-zinc-100 px-[9px] py-2\">\r\n <img src=\"/promo/hexa-logo.svg\" alt=\"\" aria-hidden className=\"size-6 select-none\" />\r\n <img src=\"/promo/hexa-flag.png\" alt=\"\" aria-hidden className=\"size-6 rounded select-none\" />\r\n </div>\r\n\r\n {/* Título */}\r\n <div className=\"relative z-[1] mt-4 flex flex-col gap-1\">\r\n <h2 className=\"font-['Outfit'] text-[32px] font-semibold leading-8 text-zinc-950\">\r\n {COPY.title}\r\n </h2>\r\n <p className=\"paragraph-medium-medium text-zinc-950\">\r\n {COPY.subtitlePrefix}\r\n <span className=\"font-bold\">{COPY.subtitleDate}</span>\r\n </p>\r\n </div>\r\n\r\n {/* Cards */}\r\n <div className=\"relative z-[1] mt-10 flex flex-col items-stretch gap-3 md:flex-row\">\r\n {COMBOS.map((combo) => (\r\n <ComboCard key={combo.coupon} combo={combo} onChoose={() => goToPlans(combo.coupon)} />\r\n ))}\r\n </div>\r\n\r\n {/* Rodapé informativo */}\r\n <div className=\"relative z-[1] mt-3 flex items-center justify-center gap-2.5 rounded-[10px] bg-zinc-100 p-3 text-center\">\r\n <IconInfoCircle className=\"size-4 shrink-0 text-zinc-950\" />\r\n <p className=\"paragraph-small-medium text-zinc-950\">\r\n {COPY.footerPrefix}\r\n <span className=\"font-semibold\">{COPY.footerBold}</span>\r\n {COPY.footerSuffix}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\ninterface ComboCardProps {\r\n combo: HexaCombo;\r\n onChoose: () => void;\r\n}\r\n\r\nfunction ComboCard({ combo, onChoose }: ComboCardProps) {\r\n const { isCopied, copy } = useCopyToClipboard({\r\n onSuccess: () => {\r\n toast.custom((t) => <Toast variant=\"success\" message={COPY.couponCopied} toastId={t} />);\r\n },\r\n });\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'relative flex flex-1 flex-col rounded-[10px] border bg-white pb-3 md:w-[276px]',\r\n combo.highlighted ? 'border-cyan-500' : 'border-zinc-200',\r\n )}\r\n >\r\n {combo.highlighted && (\r\n <div className=\"absolute left-1/2 top-0 z-[1] flex h-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center gap-[5px] rounded-md border-4 border-white bg-cyan-100 px-2\">\r\n <IconStar className=\"size-3 text-cyan-600\" />\r\n <span className=\"paragraph-xsmall-semibold whitespace-nowrap text-cyan-600\">\r\n {COPY.mostChosen}\r\n </span>\r\n <IconStar className=\"size-3 text-cyan-600\" />\r\n </div>\r\n )}\r\n\r\n <h3 className=\"border-b border-zinc-200 px-4 py-4 text-center font-['Outfit'] text-base font-semibold text-zinc-950\">\r\n {combo.name}\r\n </h3>\r\n\r\n <ul className=\"flex flex-1 flex-col gap-5 px-5 pt-5\">\r\n {combo.features.map((feature) => (\r\n <li key={feature} className=\"flex items-center gap-2.5\">\r\n <IconCheck className=\"size-5 shrink-0 text-cyan-500\" />\r\n <span className=\"paragraph-small-medium text-zinc-950\">{feature}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <div className=\"mx-3 mt-5 flex items-center gap-3 rounded-lg bg-cyan-50 py-2 pl-3.5 pr-2.5\">\r\n <IconTicket className=\"size-5 shrink-0 text-cyan-600\" />\r\n <div className=\"flex min-w-0 flex-1 flex-col\">\r\n <span className=\"paragraph-xsmall-medium text-zinc-400\">{COPY.couponLabel}</span>\r\n <span className=\"paragraph-small-semibold text-zinc-950\">{combo.coupon}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n aria-label={COPY.couponLabel}\r\n onClick={() => copy(combo.coupon)}\r\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-zinc-500 transition-colors hover:bg-cyan-100 hover:text-zinc-950\"\r\n >\r\n {isCopied ? <IconCheck className=\"size-[18px]\" /> : <IconCopy className=\"size-[18px]\" />}\r\n </button>\r\n </div>\r\n\r\n <div className=\"mx-3 mt-3\">\r\n <Button\r\n variant={combo.highlighted ? 'default' : 'secondary'}\r\n className={cn('h-11! w-full', combo.highlighted && 'bg-cyan-500 text-white hover:bg-cyan-600')}\r\n onClick={onChoose}\r\n >\r\n {COPY.choosePlan}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":";AAqFQ,cAYI,YAZJ;AAnFR,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,QAAQ,aAAa,eAAe,mBAAmB;AAChE,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,OAAO,wBAAwB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,UAAU;AAWnB,MAAM,OAAO;AAAA,EACX,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,OAAO;AAAA,EACP,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAChB;AAEA,MAAM,SAAsB;AAAA,EAC1B;AAAA,IACE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU,CAAC,2BAA2B,qBAAqB;AAAA,EAC7D;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU,CAAC,8BAA8B,0BAA0B,qBAAqB;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU,CAAC,0BAA0B,wBAAwB;AAAA,EAC/D;AACF;AAIA,MAAM,WAAW;AAEF,SAAR,iBAAkC;AACvC,QAAM,EAAE,aAAa,WAAW,IAAI,gBAAgB;AACpD,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,QAAM,SAAS,gBAAgB;AAE/B,QAAM,YAAY,CAAC,WAAmB;AACpC,eAAW;AACX,UAAM,MAAM,GAAG,WAAW,mCAAmC,mBAAmB,MAAM,CAAC;AACvF,WAAO,SAAS,OAAO,GAAG;AAAA,EAC5B;AAEA,SACE,oBAAC,UAAO,MAAM,QAAQ,cAAc,MAAM,WAAW,GACnD;AAAA,IAAC;AAAA;AAAA,MACC,iBAAiB;AAAA,MACjB,iBAAiB,CAAC,MAAM,EAAE,eAAe;AAAA,MACzC,WAAU;AAAA,MAEV;AAAA,4BAAC,eAAY,WAAU,WAAW,eAAK,OAAM;AAAA,QAE7C,oBAAC,SAAI,WAAU,sBAAqB,OAAO,EAAE,YAAY,SAAS,GAChE,+BAAC,SAAI,WAAU,sGAEb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAI;AAAA,cACJ,KAAI;AAAA,cACJ,eAAW;AAAA,cACX,WAAU;AAAA;AAAA,UACZ;AAAA,UAEA,qBAAC,eAAY,WAAU,+KACrB;AAAA,gCAAC,UAAK,WAAU,WAAW,eAAK,OAAM;AAAA,YACtC,oBAAC,SAAM,WAAU,eAAc;AAAA,aACjC;AAAA,UAGA,qBAAC,SAAI,WAAU,yFACb;AAAA,gCAAC,SAAI,KAAI,wBAAuB,KAAI,IAAG,eAAW,MAAC,WAAU,sBAAqB;AAAA,YAClF,oBAAC,SAAI,KAAI,wBAAuB,KAAI,IAAG,eAAW,MAAC,WAAU,8BAA6B;AAAA,aAC5F;AAAA,UAGA,qBAAC,SAAI,WAAU,2CACb;AAAA,gCAAC,QAAG,WAAU,qEACX,eAAK,OACR;AAAA,YACA,qBAAC,OAAE,WAAU,yCACV;AAAA,mBAAK;AAAA,cACN,oBAAC,UAAK,WAAU,aAAa,eAAK,cAAa;AAAA,eACjD;AAAA,aACF;AAAA,UAGA,oBAAC,SAAI,WAAU,sEACZ,iBAAO,IAAI,CAAC,UACX,oBAAC,aAA6B,OAAc,UAAU,MAAM,UAAU,MAAM,MAAM,KAAlE,MAAM,MAA+D,CACtF,GACH;AAAA,UAGA,qBAAC,SAAI,WAAU,2GACb;AAAA,gCAAC,kBAAe,WAAU,iCAAgC;AAAA,YAC1D,qBAAC,OAAE,WAAU,wCACV;AAAA,mBAAK;AAAA,cACN,oBAAC,UAAK,WAAU,iBAAiB,eAAK,YAAW;AAAA,cAChD,KAAK;AAAA,eACR;AAAA,aACF;AAAA,WACF,GACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;AAOA,SAAS,UAAU,EAAE,OAAO,SAAS,GAAmB;AACtD,QAAM,EAAE,UAAU,KAAK,IAAI,mBAAmB;AAAA,IAC5C,WAAW,MAAM;AACf,YAAM,OAAO,CAAC,MAAM,oBAAC,SAAM,SAAQ,WAAU,SAAS,KAAK,cAAc,SAAS,GAAG,CAAE;AAAA,IACzF;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,MAAM,cAAc,oBAAoB;AAAA,MAC1C;AAAA,MAEC;AAAA,cAAM,eACL,qBAAC,SAAI,WAAU,oKACb;AAAA,8BAAC,YAAS,WAAU,wBAAuB;AAAA,UAC3C,oBAAC,UAAK,WAAU,6DACb,eAAK,YACR;AAAA,UACA,oBAAC,YAAS,WAAU,wBAAuB;AAAA,WAC7C;AAAA,QAGF,oBAAC,QAAG,WAAU,wGACX,gBAAM,MACT;AAAA,QAEA,oBAAC,QAAG,WAAU,wCACX,gBAAM,SAAS,IAAI,CAAC,YACnB,qBAAC,QAAiB,WAAU,6BAC1B;AAAA,8BAAC,aAAU,WAAU,iCAAgC;AAAA,UACrD,oBAAC,UAAK,WAAU,wCAAwC,mBAAQ;AAAA,aAFzD,OAGT,CACD,GACH;AAAA,QAEA,qBAAC,SAAI,WAAU,8EACb;AAAA,8BAAC,cAAW,WAAU,iCAAgC;AAAA,UACtD,qBAAC,SAAI,WAAU,gCACb;AAAA,gCAAC,UAAK,WAAU,yCAAyC,eAAK,aAAY;AAAA,YAC1E,oBAAC,UAAK,WAAU,0CAA0C,gBAAM,QAAO;AAAA,aACzE;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY,KAAK;AAAA,cACjB,SAAS,MAAM,KAAK,MAAM,MAAM;AAAA,cAChC,WAAU;AAAA,cAET,qBAAW,oBAAC,aAAU,WAAU,eAAc,IAAK,oBAAC,YAAS,WAAU,eAAc;AAAA;AAAA,UACxF;AAAA,WACF;AAAA,QAEA,oBAAC,SAAI,WAAU,aACb;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,cAAc,YAAY;AAAA,YACzC,WAAW,GAAG,gBAAgB,MAAM,eAAe,0CAA0C;AAAA,YAC7F,SAAS;AAAA,YAER,eAAK;AAAA;AAAA,QACR,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modals/HexaPromoModal.tsx"],"sourcesContent":["'use client';\n\nimport { toast } from 'sonner';\nimport {\n IconCheck,\n IconCopy,\n IconInfoCircle,\n IconStar,\n IconTicket,\n IconX,\n} from '@tabler/icons-react';\nimport { Dialog, DialogClose, DialogContent, DialogTitle } from '../ui/overlay/Dialog';\nimport { Toast } from '../ui/feedback/Toast';\nimport { Button } from '../ui/buttons/Button';\nimport useCopyToClipboard from '../../hooks/copy-to-clipboard.hook';\nimport { useModalManager } from '../../store/useModalManager';\nimport { useWhitelabelUrls } from '../../providers/whitelabel.provider';\nimport { cn } from '../../infra/utils/clsx';\n\ninterface HexaCombo {\n coupon: string;\n name: string;\n features: string[];\n highlighted: boolean;\n}\n\n// Campanha \"Rumo ao Hexa\" — exclusiva da whitelabel 1 (público pt-br). O texto é fixo de\n// propósito: a modal precisa renderizar também no gapps, que não tem provider de next-intl.\nconst COPY = {\n title: 'Rumo ao Hexa!',\n subtitlePrefix: 'Ofertas exclusivas até ',\n subtitleDate: '24/06',\n mostChosen: 'Mais escolhido',\n couponLabel: 'Cupom',\n choosePlan: 'Escolher plano',\n couponCopied: 'Cupom copiado!',\n close: 'Fechar',\n footerPrefix: 'Válido para a ',\n footerBold: 'primeira contratação',\n footerSuffix: ' dos planos Essencial, Negócio ou Agência',\n};\n\nconst COMBOS: HexaCombo[] = [\n {\n coupon: 'MENSAL10',\n name: 'Combo convocação',\n highlighted: false,\n features: ['10% OFF no plano mensal', 'Webinars exclusivos'],\n },\n {\n coupon: 'SEMESTRAL10',\n name: 'Combo Hexa',\n highlighted: true,\n features: ['10% OFF no plano semestral', '3 templates exclusivos', 'Webinars exclusivos'],\n },\n {\n coupon: 'ANUAL10',\n name: 'Combo escalação',\n highlighted: false,\n features: ['10% OFF no plano anual', '3 templates exclusivos'],\n },\n];\n\n// Cores promocionais (verde/amarelo do Brasil) — específicas desta campanha, fora do design\n// system, por isso ficam hardcoded apenas aqui.\nconst GRADIENT = 'linear-gradient(180deg, #08c44f 0%, #7bd237 46.6%, #ffe31b 100%)';\n\nexport default function HexaPromoModal() {\n const { activeModal, closeModal } = useModalManager();\n const { accountsUrl } = useWhitelabelUrls();\n const isOpen = activeModal === 'hexaPromoModal';\n\n const goToPlans = (coupon: string) => {\n closeModal();\n const url = `${accountsUrl}/subscriptions?tab=plans&coupon=${encodeURIComponent(coupon)}`;\n window.location.assign(url);\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={() => closeModal()}>\n <DialogContent\n showCloseButton={false}\n onOpenAutoFocus={(e) => e.preventDefault()}\n className=\"border-0 bg-transparent p-0 shadow-none w-[calc(100%-32px)] sm:max-w-[940px] md:w-[924px] lg:w-[924px] max-h-[calc(100dvh-32px)] overflow-y-auto\"\n >\n <DialogTitle className=\"sr-only\">{COPY.title}</DialogTitle>\n\n <div className=\"rounded-[12px] p-1\" style={{ background: GRADIENT }}>\n <div className=\"relative overflow-hidden rounded-[10px] bg-white p-8 shadow-[0px_2px_10px_0px_rgba(26,26,26,0.05)]\">\n {/* Arte decorativa (festão/bandeira) no canto superior direito */}\n <img\n src=\"/promo/hexa-confetti.png\"\n alt=\"\"\n aria-hidden\n className=\"pointer-events-none absolute -top-10 right-0 w-[280px] -rotate-16 select-none\"\n />\n\n <DialogClose className=\"absolute right-3 top-3 z-10 flex size-8 items-center justify-center rounded-lg p-2 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-950 focus:outline-none\">\n <span className=\"sr-only\">{COPY.close}</span>\n <IconX className=\"size-[18px]\" />\n </DialogClose>\n\n {/* Header: logo + bandeira */}\n <div className=\"relative z-[1] flex w-fit items-center gap-[9px] rounded-lg bg-zinc-100 px-[9px] py-2\">\n <img src=\"/promo/hexa-logo.svg\" alt=\"\" aria-hidden className=\"size-6 select-none\" />\n <img src=\"/promo/hexa-flag.png\" alt=\"\" aria-hidden className=\"size-6 rounded select-none\" />\n </div>\n\n {/* Título */}\n <div className=\"relative z-[1] mt-4 flex flex-col gap-1\">\n <h2 className=\"font-['Outfit'] text-[32px] font-semibold leading-8 text-zinc-950\">\n {COPY.title}\n </h2>\n <p className=\"paragraph-medium-medium text-zinc-950\">\n {COPY.subtitlePrefix}\n <span className=\"font-bold\">{COPY.subtitleDate}</span>\n </p>\n </div>\n\n {/* Cards */}\n <div className=\"relative z-[1] mt-10 flex flex-col items-stretch gap-3 md:flex-row\">\n {COMBOS.map((combo) => (\n <ComboCard key={combo.coupon} combo={combo} onChoose={() => goToPlans(combo.coupon)} />\n ))}\n </div>\n\n {/* Rodapé informativo */}\n <div className=\"relative z-[1] mt-3 flex items-center justify-center gap-2.5 rounded-[10px] bg-zinc-100 p-3 text-center\">\n <IconInfoCircle className=\"size-4 shrink-0 text-zinc-950\" />\n <p className=\"paragraph-small-medium text-zinc-950\">\n {COPY.footerPrefix}\n <span className=\"font-semibold\">{COPY.footerBold}</span>\n {COPY.footerSuffix}\n </p>\n </div>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\ninterface ComboCardProps {\n combo: HexaCombo;\n onChoose: () => void;\n}\n\nfunction ComboCard({ combo, onChoose }: ComboCardProps) {\n const { isCopied, copy } = useCopyToClipboard({\n onSuccess: () => {\n toast.custom((t) => <Toast variant=\"success\" message={COPY.couponCopied} toastId={t} />);\n },\n });\n\n return (\n <div\n className={cn(\n 'relative flex flex-1 flex-col rounded-[10px] border bg-white pb-3 md:w-[276px]',\n combo.highlighted ? 'border-cyan-500' : 'border-zinc-200',\n )}\n >\n {combo.highlighted && (\n <div className=\"absolute left-1/2 top-0 z-[1] flex h-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center gap-[5px] rounded-md border-4 border-white bg-cyan-100 px-2\">\n <IconStar className=\"size-3 text-cyan-600\" />\n <span className=\"paragraph-xsmall-semibold whitespace-nowrap text-cyan-600\">\n {COPY.mostChosen}\n </span>\n <IconStar className=\"size-3 text-cyan-600\" />\n </div>\n )}\n\n <h3 className=\"border-b border-zinc-200 px-4 py-4 text-center font-['Outfit'] text-base font-semibold text-zinc-950\">\n {combo.name}\n </h3>\n\n <ul className=\"flex flex-1 flex-col gap-5 px-5 pt-5\">\n {combo.features.map((feature) => (\n <li key={feature} className=\"flex items-center gap-2.5\">\n <IconCheck className=\"size-5 shrink-0 text-cyan-500\" />\n <span className=\"paragraph-small-medium text-zinc-950\">{feature}</span>\n </li>\n ))}\n </ul>\n\n <div className=\"mx-3 mt-5 flex items-center gap-3 rounded-lg bg-cyan-50 py-2 pl-3.5 pr-2.5\">\n <IconTicket className=\"size-5 shrink-0 text-cyan-600\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"paragraph-xsmall-medium text-zinc-400\">{COPY.couponLabel}</span>\n <span className=\"paragraph-small-semibold text-zinc-950\">{combo.coupon}</span>\n </div>\n <button\n type=\"button\"\n aria-label={COPY.couponLabel}\n onClick={() => copy(combo.coupon)}\n className=\"flex size-8 shrink-0 items-center justify-center rounded-md text-zinc-500 transition-colors hover:bg-cyan-100 hover:text-zinc-950\"\n >\n {isCopied ? <IconCheck className=\"size-[18px]\" /> : <IconCopy className=\"size-[18px]\" />}\n </button>\n </div>\n\n <div className=\"mx-3 mt-3\">\n <Button\n variant={combo.highlighted ? 'default' : 'secondary'}\n className={cn('h-11! w-full', combo.highlighted && 'bg-cyan-500 text-white hover:bg-cyan-600')}\n onClick={onChoose}\n >\n {COPY.choosePlan}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modals/HexaPromoModalGate.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { useEffect, useRef } from 'react';\r\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\r\nimport { useAuth } from '../../providers/auth.provider';\r\nimport { useWhitelabel } from '../../providers/whitelabel.provider';\r\nimport { useModalManager } from '../../store/useModalManager';\r\nimport {\r\n getHexaPromoSeenDay,\r\n getHexaPromoSince,\r\n hexaPromoDayKey,\r\n setHexaPromoSeenDay,\r\n setHexaPromoSince,\r\n} from '../../utils/cookies/hexa-promo';\r\n\r\n/** Janela de tempo online antes de abrir a modal (3 minutos). */\r\nconst ONLINE_DELAY_MS = 3 * 60 * 1000;\r\n\r\n/**\r\n * TESTE: quando `true`, a modal abre imediatamente ao carregar o app, ignorando\r\n * trial / whitelabel / timer de 3 min / cookies. Manter `false` em produção.\r\n */\r\nconst FORCE_OPEN_FOR_TEST = false;\r\n\r\n/**\r\n * Dispara a modal \"Rumo ao Hexa\" quando um usuário em **trial** da **whitelabel 1** fica\r\n * 3 minutos online. A janela é cumulativa entre gapps e gpages (timestamp compartilhado em\r\n * cookie no domínio pai) e a modal abre **uma única vez** — reabrindo só no dia seguinte ou\r\n * após logout/login. Montar este componente uma vez no layout de cada app consumidor.\r\n */\r\nexport default function HexaPromoModalGate() {\r\n const { isAuthenticated } = useAuth();\r\n const { whitelabel } = useWhitelabel();\r\n const { activeModal, openModal } = useModalManager();\r\n const { data } = useActiveSubscription();\r\n\r\n const subscription = data?.data?.[0] ?? null;\r\n const eligible =\r\n isAuthenticated && whitelabel?.id === 1 && subscription?.type === 'trial';\r\n\r\n const forcedRef = useRef(false);\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n // TESTE: abre uma vez ao carregar, sem nenhuma condição.\r\n if (FORCE_OPEN_FOR_TEST) {\r\n if (forcedRef.current || activeModal) return;\r\n forcedRef.current = true;\r\n openModal('hexaPromoModal');\r\n return;\r\n }\r\n\r\n if (!eligible) return;\r\n // Outra modal aberta: não empilha em cima. Reavalia quando ela fechar (dep `activeModal`).\r\n if (activeModal) return;\r\n\r\n const todayKey = hexaPromoDayKey();\r\n if (getHexaPromoSeenDay() === todayKey) return; // já exibida hoje/nesta sessão\r\n\r\n // Início da janela compartilhado entre os apps; reinicia a cada novo dia.\r\n let since = getHexaPromoSince();\r\n if (!since || since.day !== todayKey) {\r\n since = { day: todayKey, ms: Date.now() };\r\n setHexaPromoSince(since.day, since.ms);\r\n }\r\n\r\n const remaining = Math.max(0, since.ms + ONLINE_DELAY_MS - Date.now());\r\n const timer = setTimeout(() => {\r\n // Recheca o cookie no disparo: se o outro app já abriu, não reabre aqui.\r\n if (getHexaPromoSeenDay() === todayKey) return;\r\n setHexaPromoSeenDay(todayKey);\r\n openModal('hexaPromoModal');\r\n }, remaining);\r\n\r\n return () => clearTimeout(timer);\r\n }, [eligible, activeModal, openModal]);\r\n\r\n return null;\r\n}\r\n"],"mappings":";AAEA,SAAS,WAAW,cAAc;AAClC,SAAS,6BAA6B;AACtC,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,MAAM,kBAAkB,IAAI,KAAK;AAMjC,MAAM,sBAAsB;AAQb,SAAR,qBAAsC;AAC3C,QAAM,EAAE,gBAAgB,IAAI,QAAQ;AACpC,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,QAAM,EAAE,aAAa,UAAU,IAAI,gBAAgB;AACnD,QAAM,EAAE,KAAK,IAAI,sBAAsB;AAEvC,QAAM,eAAe,MAAM,OAAO,CAAC,KAAK;AACxC,QAAM,WACJ,mBAAmB,YAAY,OAAO,KAAK,cAAc,SAAS;AAEpE,QAAM,YAAY,OAAO,KAAK;AAE9B,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AAGnC,QAAI,qBAAqB;AACvB,UAAI,UAAU,WAAW,YAAa;AACtC,gBAAU,UAAU;AACpB,gBAAU,gBAAgB;AAC1B;AAAA,IACF;AAEA,QAAI,CAAC,SAAU;AAEf,QAAI,YAAa;AAEjB,UAAM,WAAW,gBAAgB;AACjC,QAAI,oBAAoB,MAAM,SAAU;AAGxC,QAAI,QAAQ,kBAAkB;AAC9B,QAAI,CAAC,SAAS,MAAM,QAAQ,UAAU;AACpC,cAAQ,EAAE,KAAK,UAAU,IAAI,KAAK,IAAI,EAAE;AACxC,wBAAkB,MAAM,KAAK,MAAM,EAAE;AAAA,IACvC;AAEA,UAAM,YAAY,KAAK,IAAI,GAAG,MAAM,KAAK,kBAAkB,KAAK,IAAI,CAAC;AACrE,UAAM,QAAQ,WAAW,MAAM;AAE7B,UAAI,oBAAoB,MAAM,SAAU;AACxC,0BAAoB,QAAQ;AAC5B,gBAAU,gBAAgB;AAAA,IAC5B,GAAG,SAAS;AAEZ,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,UAAU,aAAa,SAAS,CAAC;AAErC,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modals/HexaPromoModalGate.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useAuth } from '../../providers/auth.provider';\nimport { useWhitelabel } from '../../providers/whitelabel.provider';\nimport { useModalManager } from '../../store/useModalManager';\nimport {\n getHexaPromoSeenDay,\n getHexaPromoSince,\n hexaPromoDayKey,\n setHexaPromoSeenDay,\n setHexaPromoSince,\n} from '../../utils/cookies/hexa-promo';\n\n/** Janela de tempo online antes de abrir a modal (3 minutos). */\nconst ONLINE_DELAY_MS = 3 * 60 * 1000;\n\n/**\n * TESTE: quando `true`, a modal abre imediatamente ao carregar o app, ignorando\n * trial / whitelabel / timer de 3 min / cookies. Manter `false` em produção.\n */\nconst FORCE_OPEN_FOR_TEST = false;\n\n/**\n * Dispara a modal \"Rumo ao Hexa\" quando um usuário em **trial** da **whitelabel 1** fica\n * 3 minutos online. A janela é cumulativa entre gapps e gpages (timestamp compartilhado em\n * cookie no domínio pai) e a modal abre **uma única vez** — reabrindo só no dia seguinte ou\n * após logout/login. Montar este componente uma vez no layout de cada app consumidor.\n */\nexport default function HexaPromoModalGate() {\n const { isAuthenticated } = useAuth();\n const { whitelabel } = useWhitelabel();\n const { activeModal, openModal } = useModalManager();\n const { data } = useActiveSubscription();\n\n const subscription = data?.data?.[0] ?? null;\n const eligible =\n isAuthenticated && whitelabel?.id === 1 && subscription?.type === 'trial';\n\n const forcedRef = useRef(false);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // TESTE: abre uma vez ao carregar, sem nenhuma condição.\n if (FORCE_OPEN_FOR_TEST) {\n if (forcedRef.current || activeModal) return;\n forcedRef.current = true;\n openModal('hexaPromoModal');\n return;\n }\n\n if (!eligible) return;\n // Outra modal aberta: não empilha em cima. Reavalia quando ela fechar (dep `activeModal`).\n if (activeModal) return;\n\n const todayKey = hexaPromoDayKey();\n if (getHexaPromoSeenDay() === todayKey) return; // já exibida hoje/nesta sessão\n\n // Início da janela compartilhado entre os apps; reinicia a cada novo dia.\n let since = getHexaPromoSince();\n if (!since || since.day !== todayKey) {\n since = { day: todayKey, ms: Date.now() };\n setHexaPromoSince(since.day, since.ms);\n }\n\n const remaining = Math.max(0, since.ms + ONLINE_DELAY_MS - Date.now());\n const timer = setTimeout(() => {\n // Recheca o cookie no disparo: se o outro app já abriu, não reabre aqui.\n if (getHexaPromoSeenDay() === todayKey) return;\n setHexaPromoSeenDay(todayKey);\n openModal('hexaPromoModal');\n }, remaining);\n\n return () => clearTimeout(timer);\n }, [eligible, activeModal, openModal]);\n\n return null;\n}\n"],"mappings":";AAEA,SAAS,WAAW,cAAc;AAClC,SAAS,6BAA6B;AACtC,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,MAAM,kBAAkB,IAAI,KAAK;AAMjC,MAAM,sBAAsB;AAQb,SAAR,qBAAsC;AAC3C,QAAM,EAAE,gBAAgB,IAAI,QAAQ;AACpC,QAAM,EAAE,WAAW,IAAI,cAAc;AACrC,QAAM,EAAE,aAAa,UAAU,IAAI,gBAAgB;AACnD,QAAM,EAAE,KAAK,IAAI,sBAAsB;AAEvC,QAAM,eAAe,MAAM,OAAO,CAAC,KAAK;AACxC,QAAM,WACJ,mBAAmB,YAAY,OAAO,KAAK,cAAc,SAAS;AAEpE,QAAM,YAAY,OAAO,KAAK;AAE9B,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AAGnC,QAAI,qBAAqB;AACvB,UAAI,UAAU,WAAW,YAAa;AACtC,gBAAU,UAAU;AACpB,gBAAU,gBAAgB;AAC1B;AAAA,IACF;AAEA,QAAI,CAAC,SAAU;AAEf,QAAI,YAAa;AAEjB,UAAM,WAAW,gBAAgB;AACjC,QAAI,oBAAoB,MAAM,SAAU;AAGxC,QAAI,QAAQ,kBAAkB;AAC9B,QAAI,CAAC,SAAS,MAAM,QAAQ,UAAU;AACpC,cAAQ,EAAE,KAAK,UAAU,IAAI,KAAK,IAAI,EAAE;AACxC,wBAAkB,MAAM,KAAK,MAAM,EAAE;AAAA,IACvC;AAEA,UAAM,YAAY,KAAK,IAAI,GAAG,MAAM,KAAK,kBAAkB,KAAK,IAAI,CAAC;AACrE,UAAM,QAAQ,WAAW,MAAM;AAE7B,UAAI,oBAAoB,MAAM,SAAU;AACxC,0BAAoB,QAAQ;AAC5B,gBAAU,gBAAgB;AAAA,IAC5B,GAAG,SAAS;AAEZ,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,UAAU,aAAa,SAAS,CAAC;AAErC,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modals/Modals.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { ComponentType, useEffect } from 'react';\r\nimport AccountModals from '../account/AccountModals';\r\nimport { ModalManager } from './ModalManager';\r\nimport { useAccountModals } from '../../store/useAccountModals';\r\ninterface ModalsProps {\r\n registry: Record<string, ComponentType>;\r\n onGoToSubscription?: () => void;\r\n}\r\n\r\nexport function Modals({ registry, onGoToSubscription }: ModalsProps) {\r\n const { updateConfig } = useAccountModals();\r\n\r\n useEffect(() => {\r\n updateConfig({ onGoToSubscription });\r\n }, [onGoToSubscription, updateConfig]);\r\n\r\n return (\r\n <>\r\n <AccountModals />\r\n <ModalManager registry={registry} />\r\n </>\r\n );\r\n}\r\n"],"mappings":";AAmBI,mBACE,KADF;AAjBJ,SAAwB,iBAAiB;AACzC,OAAO,mBAAmB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAM1B,SAAS,OAAO,EAAE,UAAU,mBAAmB,GAAgB;AACpE,QAAM,EAAE,aAAa,IAAI,iBAAiB;AAE1C,YAAU,MAAM;AACd,iBAAa,EAAE,mBAAmB,CAAC;AAAA,EACrC,GAAG,CAAC,oBAAoB,YAAY,CAAC;AAErC,SACE,iCACE;AAAA,wBAAC,iBAAc;AAAA,IACf,oBAAC,gBAAa,UAAoB;AAAA,KACpC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modals/Modals.tsx"],"sourcesContent":["'use client';\n\nimport { ComponentType, useEffect } from 'react';\nimport AccountModals from '../account/AccountModals';\nimport { ModalManager } from './ModalManager';\nimport { useAccountModals } from '../../store/useAccountModals';\ninterface ModalsProps {\n registry: Record<string, ComponentType>;\n onGoToSubscription?: () => void;\n}\n\nexport function Modals({ registry, onGoToSubscription }: ModalsProps) {\n const { updateConfig } = useAccountModals();\n\n useEffect(() => {\n updateConfig({ onGoToSubscription });\n }, [onGoToSubscription, updateConfig]);\n\n return (\n <>\n <AccountModals />\n <ModalManager registry={registry} />\n </>\n );\n}\n"],"mappings":";AAmBI,mBACE,KADF;AAjBJ,SAAwB,iBAAiB;AACzC,OAAO,mBAAmB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAM1B,SAAS,OAAO,EAAE,UAAU,mBAAmB,GAAgB;AACpE,QAAM,EAAE,aAAa,IAAI,iBAAiB;AAE1C,YAAU,MAAM;AACd,iBAAa,EAAE,mBAAmB,CAAC;AAAA,EACrC,GAAG,CAAC,oBAAoB,YAAY,CAAC;AAErC,SACE,iCACE;AAAA,wBAAC,iBAAc;AAAA,IACf,oBAAC,gBAAa,UAAoB;AAAA,KACpC;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modals/PaidPlanRequiredModal.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { IconLock } from '@tabler/icons-react';\r\nimport { useTranslations } from 'next-intl';\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, useExternalContracting } 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 translate = useTranslations();\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 const { redirectToExternal } = useExternalContracting();\r\n\r\n const title = (data.title as string) ?? translate('common.credits.paidPlanRequired.defaultTitle');\r\n const description = (data.description as string) ?? translate('common.credits.paidPlanRequired.defaultDescription');\r\n\r\n const handleKnowPlans = () => {\r\n if (redirectToExternal('plans')) return;\r\n window.location.href = `${accountsUrl}/subscriptions?tab=plans`;\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 {translate('common.credits.paidPlanRequired.knowPlans')}\r\n </Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":";AAqCwB,cAEJ,YAFI;AAnCxB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,mBAAmB,8BAA8B;AAC1D,SAAS,uBAAuB;AAGjB,SAAR,wBAAyC;AAC5C,QAAM,YAAY,gBAAgB;AAClC,QAAM,EAAE,aAAa,WAAW,WAAW,IAAI,gBAAgB;AAC/D,QAAM,SAAS,gBAAgB;AAC/B,QAAM,OAAO;AACb,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,QAAM,EAAE,mBAAmB,IAAI,uBAAuB;AAEtD,QAAM,QAAS,KAAK,SAAoB,UAAU,8CAA8C;AAChG,QAAM,cAAe,KAAK,eAA0B,UAAU,oDAAoD;AAElH,QAAM,kBAAkB,MAAM;AAC1B,QAAI,mBAAmB,OAAO,EAAG;AACjC,WAAO,SAAS,OAAO,GAAG,WAAW;AAAA,EACzC;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,QAER,oBAAU,2CAA2C;AAAA;AAAA,IAC1D,GACJ;AAAA,KACJ,GACJ;AAER;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modals/PaidPlanRequiredModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { IconLock } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { Button } from '../ui/buttons/Button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../ui/overlay/Dialog';\nimport { useWhitelabelUrls, useExternalContracting } from '../../providers/whitelabel.provider';\nimport { useModalManager } from '../../store/useModalManager';\nimport type { ModalData } from '../../store/useModalManager';\n\nexport default function PaidPlanRequiredModal() {\n const translate = useTranslations();\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 const { redirectToExternal } = useExternalContracting();\n\n const title = (data.title as string) ?? translate('common.credits.paidPlanRequired.defaultTitle');\n const description = (data.description as string) ?? translate('common.credits.paidPlanRequired.defaultDescription');\n\n const handleKnowPlans = () => {\n if (redirectToExternal('plans')) return;\n window.location.href = `${accountsUrl}/subscriptions?tab=plans`;\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 {translate('common.credits.paidPlanRequired.knowPlans')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AAqCwB,cAEJ,YAFI;AAnCxB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,mBAAmB,8BAA8B;AAC1D,SAAS,uBAAuB;AAGjB,SAAR,wBAAyC;AAC5C,QAAM,YAAY,gBAAgB;AAClC,QAAM,EAAE,aAAa,WAAW,WAAW,IAAI,gBAAgB;AAC/D,QAAM,SAAS,gBAAgB;AAC/B,QAAM,OAAO;AACb,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,QAAM,EAAE,mBAAmB,IAAI,uBAAuB;AAEtD,QAAM,QAAS,KAAK,SAAoB,UAAU,8CAA8C;AAChG,QAAM,cAAe,KAAK,eAA0B,UAAU,oDAAoD;AAElH,QAAM,kBAAkB,MAAM;AAC1B,QAAI,mBAAmB,OAAO,EAAG;AACjC,WAAO,SAAS,OAAO,GAAG,WAAW;AAAA,EACzC;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,QAER,oBAAU,2CAA2C;AAAA;AAAA,IAC1D,GACJ;AAAA,KACJ,GACJ;AAER;","names":[]}