@greatapps/common 1.1.697 → 1.1.699

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 (557) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  18. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  20. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  21. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  22. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  24. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  25. package/dist/components/layouts/NavBar.mjs.map +1 -1
  26. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  27. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  28. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  29. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  30. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  31. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  32. package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
  33. package/dist/components/modals/Modals.mjs.map +1 -1
  34. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  35. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  36. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
  37. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  38. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
  39. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  40. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  41. package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
  42. package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
  43. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  44. package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
  45. package/dist/components/navigation/TrialBanner.mjs.map +1 -1
  46. package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
  47. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  48. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  49. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  50. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  51. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  52. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  53. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  54. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  55. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  58. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  59. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  60. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  61. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  62. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  63. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  64. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  65. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  66. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  67. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  68. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  69. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  70. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  71. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  72. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  73. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  74. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  75. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  76. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  77. package/dist/components/ui/form/FormField.mjs.map +1 -1
  78. package/dist/components/ui/form/Input.mjs.map +1 -1
  79. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  80. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  81. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  82. package/dist/components/ui/form/Select.mjs +1 -1
  83. package/dist/components/ui/form/Select.mjs.map +1 -1
  84. package/dist/components/ui/form/Switch.mjs.map +1 -1
  85. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  86. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  87. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  88. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  89. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  90. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  91. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  92. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  93. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  94. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  95. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  96. package/dist/handlers.mjs.map +1 -1
  97. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  98. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  99. package/dist/hooks/useBrandLoadingIcon.mjs.map +1 -1
  100. package/dist/hooks/useRouter.mjs.map +1 -1
  101. package/dist/http.mjs.map +1 -1
  102. package/dist/i18n/config.mjs.map +1 -1
  103. package/dist/i18n/country-language.mjs.map +1 -1
  104. package/dist/i18n/messages/en-us.mjs.map +1 -1
  105. package/dist/i18n/messages/es-es.mjs.map +1 -1
  106. package/dist/i18n/messages/index.mjs.map +1 -1
  107. package/dist/i18n/messages/pt-br.mjs.map +1 -1
  108. package/dist/i18n/normalize.mjs.map +1 -1
  109. package/dist/i18n/resolve-locale.mjs.map +1 -1
  110. package/dist/i18n.mjs.map +1 -1
  111. package/dist/index.mjs.map +1 -1
  112. package/dist/infra/http/api-fetch.mjs.map +1 -1
  113. package/dist/infra/route/parse-id.mjs.map +1 -1
  114. package/dist/infra/route/parse-numeric.mjs.map +1 -1
  115. package/dist/infra/route/safe-route-handler.mjs.map +1 -1
  116. package/dist/infra/route/search-params.mjs.map +1 -1
  117. package/dist/infra/utils/array.mjs.map +1 -1
  118. package/dist/infra/utils/date.mjs.map +1 -1
  119. package/dist/middleware.mjs.map +1 -1
  120. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  121. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  122. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  123. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  124. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  125. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  126. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  127. package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -1
  128. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  129. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  130. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  131. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  132. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  133. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  134. package/dist/modules/auth/actions/social-google-login.action.mjs.map +1 -1
  135. package/dist/modules/auth/actions/social-google-onboarding.action.mjs.map +1 -1
  136. package/dist/modules/auth/actions/unlink-google.action.mjs.map +1 -1
  137. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  138. package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
  139. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  140. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  141. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  142. package/dist/modules/auth/hooks/social-google-login.hook.mjs.map +1 -1
  143. package/dist/modules/auth/hooks/social-google-onboarding.hook.mjs.map +1 -1
  144. package/dist/modules/auth/hooks/unlink-google.hook.mjs.map +1 -1
  145. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  146. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  147. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  148. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  149. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  150. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  151. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  152. package/dist/modules/auth/utils/require-token-not-expired.mjs.map +1 -1
  153. package/dist/modules/auth/utils/require-valid-session.mjs.map +1 -1
  154. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  155. package/dist/modules/cards/actions/create-setup-intent.action.mjs.map +1 -1
  156. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  157. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  158. package/dist/modules/cards/handlers/find-card-by-id.handler.mjs.map +1 -1
  159. package/dist/modules/cards/handlers/list-cards.handler.mjs.map +1 -1
  160. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  161. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  162. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  163. package/dist/modules/cards/hooks/create-setup-intent.hook.mjs.map +1 -1
  164. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  165. package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -1
  166. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
  167. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  168. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  169. package/dist/modules/cards/types.mjs.map +1 -1
  170. package/dist/modules/charges/actions/charge-action.action.mjs.map +1 -1
  171. package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs.map +1 -1
  172. package/dist/modules/charges/handlers/list-charges.handler.mjs.map +1 -1
  173. package/dist/modules/charges/hooks/charge-action.hook.mjs.map +1 -1
  174. package/dist/modules/charges/hooks/charge-by-id.hook.mjs.map +1 -1
  175. package/dist/modules/charges/hooks/charges.hook.mjs.map +1 -1
  176. package/dist/modules/charges/services/charges.service.mjs.map +1 -1
  177. package/dist/modules/charges/types/charge.type.mjs.map +1 -1
  178. package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs.map +1 -1
  179. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  180. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  181. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  182. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  183. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  184. package/dist/modules/images/utils/base64.mjs.map +1 -1
  185. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  186. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  187. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  188. package/dist/modules/pages/constants/query-keys.constants.mjs.map +1 -1
  189. package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -1
  190. package/dist/modules/pages/hooks/count-pages.hook.mjs.map +1 -1
  191. package/dist/modules/pages/services/pages.service.mjs.map +1 -1
  192. package/dist/modules/plans/handlers/find-plan-by-id.handler.mjs.map +1 -1
  193. package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -1
  194. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  195. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  196. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  197. package/dist/modules/plans/services/plans.service.mjs +1 -1
  198. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  199. package/dist/modules/plans/types/plan.type.mjs +5 -1
  200. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  201. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  202. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  203. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  204. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  205. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  206. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  207. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  208. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  209. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  210. package/dist/modules/projects/handlers/find-project.handler.mjs.map +1 -1
  211. package/dist/modules/projects/handlers/list-all-account-users.handler.mjs.map +1 -1
  212. package/dist/modules/projects/handlers/list-available-users.handler.mjs.map +1 -1
  213. package/dist/modules/projects/handlers/list-project-users.handler.mjs.map +1 -1
  214. package/dist/modules/projects/handlers/list-projects.handler.mjs.map +1 -1
  215. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  216. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  217. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  218. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  219. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  220. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  221. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  222. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  223. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  224. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  225. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  226. package/dist/modules/projects/services/project-users.service.mjs +2 -2
  227. package/dist/modules/projects/services/project-users.service.mjs.map +1 -1
  228. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  229. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  230. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  231. package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -1
  232. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  233. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  234. package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
  235. package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs.map +1 -1
  236. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  237. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  238. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  239. package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -1
  240. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  241. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  242. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  243. package/dist/modules/subscriptions/types/pix-pending.type.mjs.map +1 -1
  244. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  245. package/dist/modules/subscriptions/utils/get-subscription-cancellation-state.mjs.map +1 -1
  246. package/dist/modules/subscriptions/utils/get-subscription-expiry-date.mjs.map +1 -1
  247. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  248. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  249. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  250. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  251. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  252. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  253. package/dist/modules/users/handlers/list-messages.handler.mjs.map +1 -1
  254. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  255. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  256. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  257. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  258. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  259. package/dist/providers/auth.provider.mjs.map +1 -1
  260. package/dist/providers/navigation.provider.mjs.map +1 -1
  261. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  262. package/dist/route.mjs.map +1 -1
  263. package/dist/store/useAccountModals.mjs.map +1 -1
  264. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  265. package/dist/store/useCreditsDisabledModal.mjs.map +1 -1
  266. package/dist/store/useDesktopSidebarStore.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/countries.mjs.map +1 -1
  271. package/dist/utils/format/currency.mjs.map +1 -1
  272. package/dist/utils/intl/cookie-domain.mjs.map +1 -1
  273. package/dist/utils/intl/locale-cookie.mjs.map +1 -1
  274. package/dist/utils/next-navigation.mjs.map +1 -1
  275. package/dist/utils/redirect.mjs.map +1 -1
  276. package/dist/utils/safeMutationAction.mjs.map +1 -1
  277. package/dist/utils/safeServerAction.mjs.map +1 -1
  278. package/dist/utils/withAction.mjs.map +1 -1
  279. package/package.json +115 -115
  280. package/src/components/account/ConfigurationsMyAccountModal.tsx +179 -179
  281. package/src/components/account/ConfirmDeleteAccountModal.tsx +110 -110
  282. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +68 -68
  283. package/src/components/account/DeleteAccountModal.tsx +160 -160
  284. package/src/components/account/DisableTwoFactorAuthModal.tsx +92 -92
  285. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +51 -51
  286. package/src/components/account/TwoFactorAuthModal.tsx +220 -220
  287. package/src/components/account/hooks/useChangePhoneForm.tsx +113 -113
  288. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +116 -116
  289. package/src/components/account/sections/ChangeEmailModal.tsx +239 -239
  290. package/src/components/account/sections/ChangePasswordSection.tsx +68 -68
  291. package/src/components/account/sections/ChangePhoneModal.tsx +273 -273
  292. package/src/components/account/sections/MyProfileSection.tsx +276 -276
  293. package/src/components/account/sections/PreferencesSection.tsx +278 -278
  294. package/src/components/account/sections/SecuritySection.tsx +102 -102
  295. package/src/components/account/sections/TokenSection.tsx +85 -85
  296. package/src/components/embeds/ClarityEmbed.tsx +70 -70
  297. package/src/components/embeds/CrispEmbed.tsx +195 -195
  298. package/src/components/embeds/EmbedWidgets.tsx +62 -62
  299. package/src/components/embeds/FrillEmbed.tsx +146 -146
  300. package/src/components/layouts/AppMobileNavBar.tsx +214 -214
  301. package/src/components/layouts/AppNavBar.tsx +40 -40
  302. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  303. package/src/components/layouts/NavBar.tsx +228 -228
  304. package/src/components/layouts/NotificationsPopover.tsx +120 -120
  305. package/src/components/layouts/ProfilePopover.tsx +191 -191
  306. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  307. package/src/components/layouts/UsersSelectorPopover.tsx +236 -236
  308. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  309. package/src/components/modals/BuyCreditsModal.tsx +390 -390
  310. package/src/components/modals/CreditsDisabledModal.tsx +62 -62
  311. package/src/components/modals/Modals.tsx +25 -25
  312. package/src/components/modals/PaidPlanRequiredModal.tsx +60 -60
  313. package/src/components/modals/cards/AddCardModal.tsx +420 -420
  314. package/src/components/modals/cards/CannotDeleteCardModal.tsx +124 -124
  315. package/src/components/modals/cards/CardFormFields.tsx +363 -363
  316. package/src/components/modals/cards/DeleteCardModal.tsx +136 -136
  317. package/src/components/navigation/CancelledSubscriptionBanner.tsx +62 -62
  318. package/src/components/navigation/NavItemsContext.ts +20 -20
  319. package/src/components/navigation/OverdueInvoiceBanner.tsx +51 -51
  320. package/src/components/navigation/PendingCancellationBanner.tsx +60 -60
  321. package/src/components/navigation/ProjectSelectorPopover.tsx +180 -180
  322. package/src/components/navigation/SubscriptionBanner.tsx +94 -94
  323. package/src/components/navigation/TrialBanner.tsx +54 -54
  324. package/src/components/navigation/UpcomingInvoiceBanner.tsx +55 -55
  325. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  326. package/src/components/navigation/subcomponents/BottomLinks.tsx +85 -85
  327. package/src/components/navigation/subcomponents/ProjectSelector.tsx +184 -184
  328. package/src/components/pages/NotFoundPage.tsx +75 -75
  329. package/src/components/pages/notifications/Notifications.tsx +190 -190
  330. package/src/components/ui/buttons/Button.tsx +77 -77
  331. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  332. package/src/components/ui/buttons/CopyButton.tsx +59 -59
  333. package/src/components/ui/data-display/Accordion.tsx +81 -81
  334. package/src/components/ui/data-display/Badge.tsx +47 -47
  335. package/src/components/ui/data-display/Card.tsx +93 -93
  336. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  337. package/src/components/ui/data-display/CardItem.tsx +135 -135
  338. package/src/components/ui/data-display/Pagination.tsx +126 -126
  339. package/src/components/ui/data-display/PaymentInfoCard.tsx +193 -193
  340. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  341. package/src/components/ui/data-display/Separator.tsx +29 -29
  342. package/src/components/ui/data-display/Table.tsx +117 -117
  343. package/src/components/ui/data-display/Tabs.tsx +67 -67
  344. package/src/components/ui/feedback/CircularProgress.tsx +79 -79
  345. package/src/components/ui/feedback/DefaultCircularProgress.tsx +67 -67
  346. package/src/components/ui/feedback/LoadingOverlay.tsx +30 -30
  347. package/src/components/ui/feedback/Progress.tsx +40 -40
  348. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  349. package/src/components/ui/feedback/Toast.tsx +104 -104
  350. package/src/components/ui/form/Calendar.tsx +228 -228
  351. package/src/components/ui/form/Checkbox.tsx +31 -31
  352. package/src/components/ui/form/ComboboxField.tsx +159 -159
  353. package/src/components/ui/form/DatePicker.tsx +100 -100
  354. package/src/components/ui/form/DateRangePicker.tsx +111 -111
  355. package/src/components/ui/form/FormField.tsx +133 -133
  356. package/src/components/ui/form/Input.tsx +20 -20
  357. package/src/components/ui/form/InputOtp.tsx +80 -80
  358. package/src/components/ui/form/PhoneInput.tsx +210 -210
  359. package/src/components/ui/form/RadioGroup.tsx +45 -45
  360. package/src/components/ui/form/Select.tsx +200 -200
  361. package/src/components/ui/form/Switch.tsx +32 -32
  362. package/src/components/ui/form/Textarea.tsx +19 -19
  363. package/src/components/ui/overlay/Command.tsx +185 -185
  364. package/src/components/ui/overlay/Dialog.tsx +153 -153
  365. package/src/components/ui/overlay/Popover.tsx +49 -49
  366. package/src/components/ui/overlay/Sheet.tsx +170 -170
  367. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  368. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +392 -392
  369. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +62 -62
  370. package/src/components/widgets/ImageUpload/ImageUpload.tsx +131 -131
  371. package/src/components/widgets/ImageUpload/index.ts +3 -3
  372. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  373. package/src/handlers.ts +22 -22
  374. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  375. package/src/hooks/useAuthQueryKey.ts +32 -32
  376. package/src/hooks/useBrandLoadingIcon.tsx +18 -18
  377. package/src/hooks/useRouter.ts +38 -38
  378. package/src/http.ts +1 -1
  379. package/src/i18n/config.ts +17 -17
  380. package/src/i18n/country-language.ts +60 -60
  381. package/src/i18n/messages/en-us.ts +519 -519
  382. package/src/i18n/messages/es-es.ts +520 -520
  383. package/src/i18n/messages/index.ts +24 -24
  384. package/src/i18n/messages/pt-br.ts +543 -543
  385. package/src/i18n/normalize.ts +15 -15
  386. package/src/i18n/resolve-locale.ts +77 -77
  387. package/src/i18n.ts +10 -10
  388. package/src/index.ts +584 -584
  389. package/src/infra/http/api-fetch.ts +39 -39
  390. package/src/infra/route/parse-id.ts +9 -9
  391. package/src/infra/route/parse-numeric.ts +16 -16
  392. package/src/infra/route/safe-route-handler.ts +16 -16
  393. package/src/infra/route/search-params.ts +9 -9
  394. package/src/infra/utils/array.ts +167 -167
  395. package/src/infra/utils/date.ts +59 -59
  396. package/src/middleware.ts +4 -4
  397. package/src/modules/accounts/actions/account-management.action.ts +109 -109
  398. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  399. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  400. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  401. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  402. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  403. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  404. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -32
  405. package/src/modules/accounts/hooks/useAccountManagement.ts +95 -95
  406. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  407. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  408. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  409. package/src/modules/accounts/services/account-token.service.ts +52 -52
  410. package/src/modules/accounts/services/account.service.ts +243 -243
  411. package/src/modules/accounts/types.ts +230 -230
  412. package/src/modules/auth/actions/social-google-login.action.ts +12 -12
  413. package/src/modules/auth/actions/social-google-onboarding.action.ts +13 -13
  414. package/src/modules/auth/actions/unlink-google.action.ts +8 -8
  415. package/src/modules/auth/actions/validate-session.action.ts +70 -70
  416. package/src/modules/auth/actions/verify-two-factor.action.ts +19 -19
  417. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  418. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  419. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  420. package/src/modules/auth/hooks/social-google-login.hook.tsx +13 -13
  421. package/src/modules/auth/hooks/social-google-onboarding.hook.tsx +13 -13
  422. package/src/modules/auth/hooks/unlink-google.hook.tsx +13 -13
  423. package/src/modules/auth/hooks/useManagementPermissions.ts +52 -52
  424. package/src/modules/auth/hooks/useUserQuery.ts +103 -103
  425. package/src/modules/auth/types/management-permission.type.ts +14 -14
  426. package/src/modules/auth/utils/assert-management-permission.ts +56 -56
  427. package/src/modules/auth/utils/assert-management-subscription.ts +38 -38
  428. package/src/modules/auth/utils/assert-paid-subscription.ts +47 -47
  429. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  430. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  431. package/src/modules/auth/utils/require-token-not-expired.ts +53 -53
  432. package/src/modules/auth/utils/require-valid-session.ts +35 -35
  433. package/src/modules/cards/actions/create-card.action.ts +9 -9
  434. package/src/modules/cards/actions/create-setup-intent.action.ts +8 -8
  435. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  436. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  437. package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -15
  438. package/src/modules/cards/handlers/list-cards.handler.ts +10 -10
  439. package/src/modules/cards/hooks/card-by-id.hook.ts +17 -17
  440. package/src/modules/cards/hooks/cards.hook.ts +22 -22
  441. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  442. package/src/modules/cards/hooks/create-setup-intent.hook.ts +11 -11
  443. package/src/modules/cards/hooks/delete-card.hook.ts +52 -52
  444. package/src/modules/cards/hooks/delete-confirmation.hook.ts +40 -40
  445. package/src/modules/cards/hooks/handle-delete-card.hook.ts +47 -47
  446. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  447. package/src/modules/cards/services/cards.service.ts +136 -136
  448. package/src/modules/cards/types.ts +52 -52
  449. package/src/modules/charges/actions/charge-action.action.ts +13 -13
  450. package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -14
  451. package/src/modules/charges/handlers/list-charges.handler.ts +15 -15
  452. package/src/modules/charges/hooks/charge-action.hook.ts +24 -24
  453. package/src/modules/charges/hooks/charge-by-id.hook.ts +19 -19
  454. package/src/modules/charges/hooks/charges.hook.ts +19 -19
  455. package/src/modules/charges/services/charges.service.ts +63 -63
  456. package/src/modules/charges/types/charge.type.ts +68 -68
  457. package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -14
  458. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +103 -103
  459. package/src/modules/images/actions/process-image.action.ts +40 -40
  460. package/src/modules/images/constants/image.constants.ts +11 -11
  461. package/src/modules/images/hooks/use-image-upload.hook.ts +153 -153
  462. package/src/modules/images/services/image-processing.service.ts +75 -75
  463. package/src/modules/images/types/image.type.ts +54 -54
  464. package/src/modules/images/utils/base64.ts +26 -26
  465. package/src/modules/images/utils/compress-image.ts +20 -20
  466. package/src/modules/images/utils/crop-image.ts +68 -68
  467. package/src/modules/images/utils/validate-image.ts +86 -86
  468. package/src/modules/pages/constants/query-keys.constants.ts +1 -1
  469. package/src/modules/pages/handlers/count-pages.handler.ts +12 -12
  470. package/src/modules/pages/hooks/count-pages.hook.ts +21 -21
  471. package/src/modules/pages/services/pages.service.ts +27 -27
  472. package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -14
  473. package/src/modules/plans/handlers/list-plans.handler.ts +22 -22
  474. package/src/modules/plans/hooks/list-plans.hook.ts +23 -23
  475. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  476. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +39 -39
  477. package/src/modules/plans/services/plans.service.ts +136 -135
  478. package/src/modules/plans/types/plan.type.ts +79 -75
  479. package/src/modules/plans/utils/map-api-plan-to-ui.ts +167 -167
  480. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  481. package/src/modules/projects/actions/create-project.action.ts +9 -9
  482. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  483. package/src/modules/projects/actions/find-project.action.ts +8 -8
  484. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  485. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  486. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  487. package/src/modules/projects/actions/update-project.action.ts +9 -9
  488. package/src/modules/projects/handlers/find-project.handler.ts +15 -15
  489. package/src/modules/projects/handlers/list-all-account-users.handler.ts +23 -23
  490. package/src/modules/projects/handlers/list-available-users.handler.ts +26 -26
  491. package/src/modules/projects/handlers/list-project-users.handler.ts +26 -26
  492. package/src/modules/projects/handlers/list-projects.handler.ts +23 -23
  493. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  494. package/src/modules/projects/hooks/create-project.hook.ts +120 -120
  495. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  496. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  497. package/src/modules/projects/hooks/list-all-account-users.hook.ts +40 -40
  498. package/src/modules/projects/hooks/list-available-users.hook.ts +39 -39
  499. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +44 -44
  500. package/src/modules/projects/hooks/list-project-users.hook.ts +39 -39
  501. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  502. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  503. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  504. package/src/modules/projects/services/project-users.service.ts +3 -2
  505. package/src/modules/projects/services/projects.service.ts +156 -156
  506. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  507. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  508. package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -13
  509. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  510. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  511. package/src/modules/subscriptions/constants/subscription.constants.ts +1 -1
  512. package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -17
  513. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  514. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +22 -22
  515. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +22 -22
  516. package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -25
  517. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  518. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +44 -44
  519. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  520. package/src/modules/subscriptions/types/calculate-subscription.type.ts +116 -116
  521. package/src/modules/subscriptions/types/pix-pending.type.ts +38 -38
  522. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  523. package/src/modules/subscriptions/utils/get-subscription-cancellation-state.ts +37 -37
  524. package/src/modules/subscriptions/utils/get-subscription-expiry-date.ts +33 -33
  525. package/src/modules/subscriptions/utils/has-subscription-expired.ts +11 -11
  526. package/src/modules/subscriptions/utils/periodicity.ts +79 -79
  527. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  528. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  529. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  530. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  531. package/src/modules/users/handlers/list-messages.handler.ts +39 -39
  532. package/src/modules/users/hooks/messages.hook.ts +69 -69
  533. package/src/modules/users/services/messages.service.ts +49 -49
  534. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  535. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  536. package/src/modules/whitelabel/schema.ts +84 -84
  537. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  538. package/src/providers/auth.provider.tsx +264 -264
  539. package/src/providers/navigation.provider.tsx +99 -99
  540. package/src/providers/whitelabel.provider.tsx +90 -90
  541. package/src/route.ts +4 -4
  542. package/src/store/useAccountModals.ts +85 -85
  543. package/src/store/useBuyCreditsModal.ts +21 -21
  544. package/src/store/useCreditsDisabledModal.ts +11 -11
  545. package/src/store/useDesktopSidebarStore.ts +47 -47
  546. package/src/store/useMdSidebarStore.ts +34 -34
  547. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  548. package/src/utils/constants/br-states.ts +29 -29
  549. package/src/utils/countries.ts +224 -224
  550. package/src/utils/format/currency.ts +70 -70
  551. package/src/utils/intl/cookie-domain.ts +29 -29
  552. package/src/utils/intl/locale-cookie.ts +18 -18
  553. package/src/utils/next-navigation.ts +7 -7
  554. package/src/utils/redirect.ts +78 -78
  555. package/src/utils/safeMutationAction.ts +24 -24
  556. package/src/utils/safeServerAction.ts +21 -21
  557. package/src/utils/withAction.ts +13 -13
@@ -1,68 +1,68 @@
1
- import type { Crop } from 'react-image-crop'
2
-
3
- export async function cropImageToCanvas(
4
- image: HTMLImageElement,
5
- crop: Crop,
6
- targetWidth: number,
7
- targetHeight: number,
8
- /**
9
- * MIME de saída. Use 'image/png' para preservar transparência (PNG/WebP/GIF
10
- * de origem). JPEG não tem canal alpha — pixels transparentes viram preto.
11
- */
12
- outputType: 'image/jpeg' | 'image/png' = 'image/jpeg'
13
- ): Promise<string> {
14
- const canvas = document.createElement('canvas')
15
- const ctx = canvas.getContext('2d')
16
-
17
- if (!ctx) throw new Error('Canvas não suportado')
18
-
19
- // Escala entre tamanho renderizado e natural (imagem pode estar reduzida com CSS)
20
- const scaleX = image.naturalWidth / image.width
21
- const scaleY = image.naturalHeight / image.height
22
-
23
- // Converte coordenadas do crop para pixels naturais da imagem
24
- const pixelCrop = {
25
- x: crop.unit === '%'
26
- ? (crop.x / 100) * image.naturalWidth
27
- : crop.x * scaleX,
28
- y: crop.unit === '%'
29
- ? (crop.y / 100) * image.naturalHeight
30
- : crop.y * scaleY,
31
- width: crop.unit === '%'
32
- ? (crop.width / 100) * image.naturalWidth
33
- : crop.width * scaleX,
34
- height: crop.unit === '%'
35
- ? (crop.height / 100) * image.naturalHeight
36
- : crop.height * scaleY,
37
- }
38
-
39
- canvas.width = targetWidth
40
- canvas.height = targetHeight
41
-
42
- // JPEG não tem canal alpha: sem fundo, pixels transparentes da origem viram
43
- // PRETO no encode. Preenchemos com branco antes de desenhar para que a
44
- // transparência degrade para branco (neutro), nunca preto. No caminho PNG
45
- // não pintamos nada — o canvas fica transparente e a transparência é mantida.
46
- if (outputType === 'image/jpeg') {
47
- ctx.fillStyle = '#ffffff'
48
- ctx.fillRect(0, 0, targetWidth, targetHeight)
49
- }
50
-
51
- ctx.drawImage(
52
- image,
53
- pixelCrop.x,
54
- pixelCrop.y,
55
- pixelCrop.width,
56
- pixelCrop.height,
57
- 0,
58
- 0,
59
- targetWidth,
60
- targetHeight
61
- )
62
-
63
- // PNG preserva transparência; JPEG (0.92) para fotos opacas, mais leve.
64
- // Safari tem problemas com WebP, por isso não é usado aqui.
65
- return outputType === 'image/png'
66
- ? canvas.toDataURL('image/png')
67
- : canvas.toDataURL('image/jpeg', 0.92)
68
- }
1
+ import type { Crop } from 'react-image-crop'
2
+
3
+ export async function cropImageToCanvas(
4
+ image: HTMLImageElement,
5
+ crop: Crop,
6
+ targetWidth: number,
7
+ targetHeight: number,
8
+ /**
9
+ * MIME de saída. Use 'image/png' para preservar transparência (PNG/WebP/GIF
10
+ * de origem). JPEG não tem canal alpha — pixels transparentes viram preto.
11
+ */
12
+ outputType: 'image/jpeg' | 'image/png' = 'image/jpeg'
13
+ ): Promise<string> {
14
+ const canvas = document.createElement('canvas')
15
+ const ctx = canvas.getContext('2d')
16
+
17
+ if (!ctx) throw new Error('Canvas não suportado')
18
+
19
+ // Escala entre tamanho renderizado e natural (imagem pode estar reduzida com CSS)
20
+ const scaleX = image.naturalWidth / image.width
21
+ const scaleY = image.naturalHeight / image.height
22
+
23
+ // Converte coordenadas do crop para pixels naturais da imagem
24
+ const pixelCrop = {
25
+ x: crop.unit === '%'
26
+ ? (crop.x / 100) * image.naturalWidth
27
+ : crop.x * scaleX,
28
+ y: crop.unit === '%'
29
+ ? (crop.y / 100) * image.naturalHeight
30
+ : crop.y * scaleY,
31
+ width: crop.unit === '%'
32
+ ? (crop.width / 100) * image.naturalWidth
33
+ : crop.width * scaleX,
34
+ height: crop.unit === '%'
35
+ ? (crop.height / 100) * image.naturalHeight
36
+ : crop.height * scaleY,
37
+ }
38
+
39
+ canvas.width = targetWidth
40
+ canvas.height = targetHeight
41
+
42
+ // JPEG não tem canal alpha: sem fundo, pixels transparentes da origem viram
43
+ // PRETO no encode. Preenchemos com branco antes de desenhar para que a
44
+ // transparência degrade para branco (neutro), nunca preto. No caminho PNG
45
+ // não pintamos nada — o canvas fica transparente e a transparência é mantida.
46
+ if (outputType === 'image/jpeg') {
47
+ ctx.fillStyle = '#ffffff'
48
+ ctx.fillRect(0, 0, targetWidth, targetHeight)
49
+ }
50
+
51
+ ctx.drawImage(
52
+ image,
53
+ pixelCrop.x,
54
+ pixelCrop.y,
55
+ pixelCrop.width,
56
+ pixelCrop.height,
57
+ 0,
58
+ 0,
59
+ targetWidth,
60
+ targetHeight
61
+ )
62
+
63
+ // PNG preserva transparência; JPEG (0.92) para fotos opacas, mais leve.
64
+ // Safari tem problemas com WebP, por isso não é usado aqui.
65
+ return outputType === 'image/png'
66
+ ? canvas.toDataURL('image/png')
67
+ : canvas.toDataURL('image/jpeg', 0.92)
68
+ }
@@ -1,86 +1,86 @@
1
- import {
2
- ACCEPTED_IMAGE_FORMATS,
3
- MAX_FILE_SIZE_MB,
4
- } from '../constants/image.constants'
5
-
6
- type TranslateFn = (key: any, values?: Record<string, string | number>) => string;
7
-
8
- export interface ImageValidationResult {
9
- valid: boolean
10
- error?: string
11
- }
12
-
13
- export function validateImageFormat(
14
- file: File,
15
- translate?: TranslateFn
16
- ): ImageValidationResult {
17
- // Bloqueia SVG explicitamente (segurança + não funciona com crop)
18
- if (file.type === 'image/svg+xml' || file.name.toLowerCase().endsWith('.svg')) {
19
- return {
20
- valid: false,
21
- error: translate
22
- ? translate('common.imageUpload.errorSvg')
23
- : 'Formato SVG não é suportado. Use PNG, JPEG, WebP ou GIF.',
24
- }
25
- }
26
-
27
- if (
28
- !ACCEPTED_IMAGE_FORMATS.includes(
29
- file.type as (typeof ACCEPTED_IMAGE_FORMATS)[number]
30
- )
31
- ) {
32
- return {
33
- valid: false,
34
- error: translate
35
- ? translate('common.imageUpload.errorFormat')
36
- : 'Formato não suportado. Use PNG, JPEG, WebP ou GIF.',
37
- }
38
- }
39
- return { valid: true }
40
- }
41
-
42
- export function validateImageSize(
43
- file: File,
44
- maxSizeMB: number = MAX_FILE_SIZE_MB,
45
- translate?: TranslateFn
46
- ): ImageValidationResult {
47
- if (file.size > maxSizeMB * 1024 * 1024) {
48
- return {
49
- valid: false,
50
- error: translate
51
- ? translate('common.imageUpload.errorTooLarge', { maxSize: maxSizeMB })
52
- : `Arquivo muito grande. Máximo ${maxSizeMB}MB.`,
53
- }
54
- }
55
- return { valid: true }
56
- }
57
-
58
- export function validateImage(
59
- file: File,
60
- translate?: TranslateFn
61
- ): ImageValidationResult {
62
- const formatValidation = validateImageFormat(file, translate)
63
- if (!formatValidation.valid) return formatValidation
64
-
65
- const sizeValidation = validateImageSize(file, MAX_FILE_SIZE_MB, translate)
66
- if (!sizeValidation.valid) return sizeValidation
67
-
68
- return { valid: true }
69
- }
70
-
71
- export async function getImageDimensions(
72
- file: File
73
- ): Promise<{ width: number; height: number }> {
74
- return new Promise((resolve, reject) => {
75
- const img = new Image()
76
- img.onload = () => {
77
- resolve({ width: img.naturalWidth, height: img.naturalHeight })
78
- URL.revokeObjectURL(img.src)
79
- }
80
- img.onerror = () => {
81
- reject(new Error('Falha ao carregar imagem'))
82
- URL.revokeObjectURL(img.src)
83
- }
84
- img.src = URL.createObjectURL(file)
85
- })
86
- }
1
+ import {
2
+ ACCEPTED_IMAGE_FORMATS,
3
+ MAX_FILE_SIZE_MB,
4
+ } from '../constants/image.constants'
5
+
6
+ type TranslateFn = (key: any, values?: Record<string, string | number>) => string;
7
+
8
+ export interface ImageValidationResult {
9
+ valid: boolean
10
+ error?: string
11
+ }
12
+
13
+ export function validateImageFormat(
14
+ file: File,
15
+ translate?: TranslateFn
16
+ ): ImageValidationResult {
17
+ // Bloqueia SVG explicitamente (segurança + não funciona com crop)
18
+ if (file.type === 'image/svg+xml' || file.name.toLowerCase().endsWith('.svg')) {
19
+ return {
20
+ valid: false,
21
+ error: translate
22
+ ? translate('common.imageUpload.errorSvg')
23
+ : 'Formato SVG não é suportado. Use PNG, JPEG, WebP ou GIF.',
24
+ }
25
+ }
26
+
27
+ if (
28
+ !ACCEPTED_IMAGE_FORMATS.includes(
29
+ file.type as (typeof ACCEPTED_IMAGE_FORMATS)[number]
30
+ )
31
+ ) {
32
+ return {
33
+ valid: false,
34
+ error: translate
35
+ ? translate('common.imageUpload.errorFormat')
36
+ : 'Formato não suportado. Use PNG, JPEG, WebP ou GIF.',
37
+ }
38
+ }
39
+ return { valid: true }
40
+ }
41
+
42
+ export function validateImageSize(
43
+ file: File,
44
+ maxSizeMB: number = MAX_FILE_SIZE_MB,
45
+ translate?: TranslateFn
46
+ ): ImageValidationResult {
47
+ if (file.size > maxSizeMB * 1024 * 1024) {
48
+ return {
49
+ valid: false,
50
+ error: translate
51
+ ? translate('common.imageUpload.errorTooLarge', { maxSize: maxSizeMB })
52
+ : `Arquivo muito grande. Máximo ${maxSizeMB}MB.`,
53
+ }
54
+ }
55
+ return { valid: true }
56
+ }
57
+
58
+ export function validateImage(
59
+ file: File,
60
+ translate?: TranslateFn
61
+ ): ImageValidationResult {
62
+ const formatValidation = validateImageFormat(file, translate)
63
+ if (!formatValidation.valid) return formatValidation
64
+
65
+ const sizeValidation = validateImageSize(file, MAX_FILE_SIZE_MB, translate)
66
+ if (!sizeValidation.valid) return sizeValidation
67
+
68
+ return { valid: true }
69
+ }
70
+
71
+ export async function getImageDimensions(
72
+ file: File
73
+ ): Promise<{ width: number; height: number }> {
74
+ return new Promise((resolve, reject) => {
75
+ const img = new Image()
76
+ img.onload = () => {
77
+ resolve({ width: img.naturalWidth, height: img.naturalHeight })
78
+ URL.revokeObjectURL(img.src)
79
+ }
80
+ img.onerror = () => {
81
+ reject(new Error('Falha ao carregar imagem'))
82
+ URL.revokeObjectURL(img.src)
83
+ }
84
+ img.src = URL.createObjectURL(file)
85
+ })
86
+ }
@@ -1 +1 @@
1
- export const PAGES_QUERY_KEY = ['pages'] as const;
1
+ export const PAGES_QUERY_KEY = ['pages'] as const;
@@ -1,12 +1,12 @@
1
- import 'server-only';
2
-
3
- import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
4
- import { pagesService } from '../services/pages.service';
5
-
6
- export function createCountPagesHandler() {
7
- return async function GET() {
8
- return safeRouteHandler(async () => ({
9
- total: await pagesService.countPages(),
10
- }));
11
- };
12
- }
1
+ import 'server-only';
2
+
3
+ import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
4
+ import { pagesService } from '../services/pages.service';
5
+
6
+ export function createCountPagesHandler() {
7
+ return async function GET() {
8
+ return safeRouteHandler(async () => ({
9
+ total: await pagesService.countPages(),
10
+ }));
11
+ };
12
+ }
@@ -1,21 +1,21 @@
1
- 'use client';
2
-
3
- import { useQuery } from '@tanstack/react-query';
4
- import { apiFetch } from '../../../infra/http/api-fetch';
5
- import { PAGES_QUERY_KEY } from '../constants/query-keys.constants';
6
- import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
7
-
8
- export const COUNT_PAGES_QUERY_KEY = [...PAGES_QUERY_KEY, 'count'] as const;
9
-
10
- export function useCountPages() {
11
- const queryKey = useAuthQueryKey([...COUNT_PAGES_QUERY_KEY]);
12
-
13
- return useQuery({
14
- queryKey,
15
- queryFn: async ({ signal }) => {
16
- const result = await apiFetch<{ total: number }>('/api/pages/count', { signal });
17
- return result.total;
18
- },
19
- staleTime: 30_000,
20
- });
21
- }
1
+ 'use client';
2
+
3
+ import { useQuery } from '@tanstack/react-query';
4
+ import { apiFetch } from '../../../infra/http/api-fetch';
5
+ import { PAGES_QUERY_KEY } from '../constants/query-keys.constants';
6
+ import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
7
+
8
+ export const COUNT_PAGES_QUERY_KEY = [...PAGES_QUERY_KEY, 'count'] as const;
9
+
10
+ export function useCountPages() {
11
+ const queryKey = useAuthQueryKey([...COUNT_PAGES_QUERY_KEY]);
12
+
13
+ return useQuery({
14
+ queryKey,
15
+ queryFn: async ({ signal }) => {
16
+ const result = await apiFetch<{ total: number }>('/api/pages/count', { signal });
17
+ return result.total;
18
+ },
19
+ staleTime: 30_000,
20
+ });
21
+ }
@@ -1,27 +1,27 @@
1
- import 'server-only';
2
-
3
- import { api } from '../../../infra/api/client';
4
- import { ApiError, ApiPaginatedActionResult } from '../../../infra/api/types';
5
- import { getUserContext } from '../../auth/utils/get-user-context';
6
-
7
- class PagesService {
8
- async countPages(): Promise<number> {
9
- const { id_account } = await getUserContext();
10
-
11
- const url = `/account/${id_account}/pages?limit=1`;
12
-
13
- const response = await api.pages.get<ApiPaginatedActionResult<unknown>>(url);
14
-
15
- if (response.status === 0) {
16
- throw new ApiError(
17
- response.message || 'Erro ao contar páginas',
18
- 'COUNT_PAGES_FAILED',
19
- 400,
20
- );
21
- }
22
-
23
- return response.total;
24
- }
25
- }
26
-
27
- export const pagesService = new PagesService();
1
+ import 'server-only';
2
+
3
+ import { api } from '../../../infra/api/client';
4
+ import { ApiError, ApiPaginatedActionResult } from '../../../infra/api/types';
5
+ import { getUserContext } from '../../auth/utils/get-user-context';
6
+
7
+ class PagesService {
8
+ async countPages(): Promise<number> {
9
+ const { id_account } = await getUserContext();
10
+
11
+ const url = `/account/${id_account}/pages?limit=1`;
12
+
13
+ const response = await api.pages.get<ApiPaginatedActionResult<unknown>>(url);
14
+
15
+ if (response.status === 0) {
16
+ throw new ApiError(
17
+ response.message || 'Erro ao contar páginas',
18
+ 'COUNT_PAGES_FAILED',
19
+ 400,
20
+ );
21
+ }
22
+
23
+ return response.total;
24
+ }
25
+ }
26
+
27
+ export const pagesService = new PagesService();
@@ -1,14 +1,14 @@
1
- import 'server-only';
2
-
3
- import type { NextRequest } from 'next/server';
4
- import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
5
- import { plansService } from '../services/plans.service';
6
-
7
- export function createFindPlanByIdHandler() {
8
- return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
9
- return safeRouteHandler(async () => {
10
- const { id } = await params;
11
- return plansService.findById(id);
12
- });
13
- };
14
- }
1
+ import 'server-only';
2
+
3
+ import type { NextRequest } from 'next/server';
4
+ import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
5
+ import { plansService } from '../services/plans.service';
6
+
7
+ export function createFindPlanByIdHandler() {
8
+ return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
9
+ return safeRouteHandler(async () => {
10
+ const { id } = await params;
11
+ return plansService.findById(id);
12
+ });
13
+ };
14
+ }
@@ -1,22 +1,22 @@
1
- import 'server-only';
2
-
3
- import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
4
- import { plansService } from '../services/plans.service';
5
-
6
- export function createListPlansHandler() {
7
- return async function GET() {
8
- return safeRouteHandler(async () => {
9
- const { data: apiPlans } = await plansService.listPlans({
10
- active: true,
11
- search: 'client',
12
- sort: 'id:ASC',
13
- });
14
-
15
- if (!apiPlans?.length) return [];
16
-
17
- // null/undefined (USD price não configurado) ordena por último — evita aparecer como "o mais barato"
18
- const sortValue = (v: number | null | undefined) => (v == null ? Number.POSITIVE_INFINITY : v);
19
- return [...apiPlans].sort((a, b) => sortValue(a.value) - sortValue(b.value));
20
- });
21
- };
22
- }
1
+ import 'server-only';
2
+
3
+ import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
4
+ import { plansService } from '../services/plans.service';
5
+
6
+ export function createListPlansHandler() {
7
+ return async function GET() {
8
+ return safeRouteHandler(async () => {
9
+ const { data: apiPlans } = await plansService.listPlans({
10
+ active: true,
11
+ search: 'client',
12
+ sort: 'id:ASC',
13
+ });
14
+
15
+ if (!apiPlans?.length) return [];
16
+
17
+ // null/undefined (USD price não configurado) ordena por último — evita aparecer como "o mais barato"
18
+ const sortValue = (v: number | null | undefined) => (v == null ? Number.POSITIVE_INFINITY : v);
19
+ return [...apiPlans].sort((a, b) => sortValue(a.value) - sortValue(b.value));
20
+ });
21
+ };
22
+ }
@@ -1,23 +1,23 @@
1
- 'use client';
2
-
3
- import { useQuery } from '@tanstack/react-query';
4
- import { apiFetch } from '../../../infra/http/api-fetch';
5
- import type { Plan } from '../types/plan.type';
6
- import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
7
-
8
- export const PLANS_QUERY_KEY = ['plans'] as const;
9
-
10
- export function usePlans() {
11
- const queryKey = useAuthQueryKey([...PLANS_QUERY_KEY]);
12
-
13
- return useQuery<Plan[]>({
14
- queryKey,
15
- queryFn: ({ signal }) => apiFetch<Plan[]>('/api/plans', { signal }),
16
- staleTime: 60 * 1000,
17
- gcTime: Infinity,
18
- refetchOnWindowFocus: false,
19
- refetchOnReconnect: false,
20
- refetchOnMount: true,
21
- retry: 1,
22
- });
23
- }
1
+ 'use client';
2
+
3
+ import { useQuery } from '@tanstack/react-query';
4
+ import { apiFetch } from '../../../infra/http/api-fetch';
5
+ import type { Plan } from '../types/plan.type';
6
+ import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
7
+
8
+ export const PLANS_QUERY_KEY = ['plans'] as const;
9
+
10
+ export function usePlans() {
11
+ const queryKey = useAuthQueryKey([...PLANS_QUERY_KEY]);
12
+
13
+ return useQuery<Plan[]>({
14
+ queryKey,
15
+ queryFn: ({ signal }) => apiFetch<Plan[]>('/api/plans', { signal }),
16
+ staleTime: 60 * 1000,
17
+ gcTime: Infinity,
18
+ refetchOnWindowFocus: false,
19
+ refetchOnReconnect: false,
20
+ refetchOnMount: true,
21
+ retry: 1,
22
+ });
23
+ }
@@ -1,14 +1,14 @@
1
- 'use client';
2
-
3
- import type { AddonKindEnum } from '../../subscriptions/constants/addons.constants';
4
- import { useActiveSubscription } from '../../subscriptions/hooks/find-active-subscription.hook';
5
-
6
- export function useHasPlanAddon(addonId: AddonKindEnum) {
7
- const { data: subscriptionData, isLoading: isLoadingSubscription } = useActiveSubscription();
8
- const activeSubscription = subscriptionData?.data?.[0] ?? null;
9
-
10
- const hasAddon = !!activeSubscription?.items?.find((i) => i.id_addon === addonId);
11
- const isLoading = isLoadingSubscription;
12
-
13
- return { hasAddon, isLoading };
14
- }
1
+ 'use client';
2
+
3
+ import type { AddonKindEnum } from '../../subscriptions/constants/addons.constants';
4
+ import { useActiveSubscription } from '../../subscriptions/hooks/find-active-subscription.hook';
5
+
6
+ export function useHasPlanAddon(addonId: AddonKindEnum) {
7
+ const { data: subscriptionData, isLoading: isLoadingSubscription } = useActiveSubscription();
8
+ const activeSubscription = subscriptionData?.data?.[0] ?? null;
9
+
10
+ const hasAddon = !!activeSubscription?.items?.find((i) => i.id_addon === addonId);
11
+ const isLoading = isLoadingSubscription;
12
+
13
+ return { hasAddon, isLoading };
14
+ }