@greatapps/common 1.1.697 → 1.1.698

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 (554) 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/projects.service.mjs.map +1 -1
  227. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  228. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  229. package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -1
  230. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  231. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  232. package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
  233. package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs.map +1 -1
  234. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  235. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  236. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  237. package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -1
  238. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  239. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  240. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  241. package/dist/modules/subscriptions/types/pix-pending.type.mjs.map +1 -1
  242. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  243. package/dist/modules/subscriptions/utils/get-subscription-cancellation-state.mjs.map +1 -1
  244. package/dist/modules/subscriptions/utils/get-subscription-expiry-date.mjs.map +1 -1
  245. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  246. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  247. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  248. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  249. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  250. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  251. package/dist/modules/users/handlers/list-messages.handler.mjs.map +1 -1
  252. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  253. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  254. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  255. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  256. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  257. package/dist/providers/auth.provider.mjs.map +1 -1
  258. package/dist/providers/navigation.provider.mjs.map +1 -1
  259. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  260. package/dist/route.mjs.map +1 -1
  261. package/dist/store/useAccountModals.mjs.map +1 -1
  262. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  263. package/dist/store/useCreditsDisabledModal.mjs.map +1 -1
  264. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  265. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  266. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  267. package/dist/utils/constants/br-states.mjs.map +1 -1
  268. package/dist/utils/countries.mjs.map +1 -1
  269. package/dist/utils/format/currency.mjs.map +1 -1
  270. package/dist/utils/intl/cookie-domain.mjs.map +1 -1
  271. package/dist/utils/intl/locale-cookie.mjs.map +1 -1
  272. package/dist/utils/next-navigation.mjs.map +1 -1
  273. package/dist/utils/redirect.mjs.map +1 -1
  274. package/dist/utils/safeMutationAction.mjs.map +1 -1
  275. package/dist/utils/safeServerAction.mjs.map +1 -1
  276. package/dist/utils/withAction.mjs.map +1 -1
  277. package/package.json +115 -115
  278. package/src/components/account/ConfigurationsMyAccountModal.tsx +179 -179
  279. package/src/components/account/ConfirmDeleteAccountModal.tsx +110 -110
  280. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +68 -68
  281. package/src/components/account/DeleteAccountModal.tsx +160 -160
  282. package/src/components/account/DisableTwoFactorAuthModal.tsx +92 -92
  283. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +51 -51
  284. package/src/components/account/TwoFactorAuthModal.tsx +220 -220
  285. package/src/components/account/hooks/useChangePhoneForm.tsx +113 -113
  286. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +116 -116
  287. package/src/components/account/sections/ChangeEmailModal.tsx +239 -239
  288. package/src/components/account/sections/ChangePasswordSection.tsx +68 -68
  289. package/src/components/account/sections/ChangePhoneModal.tsx +273 -273
  290. package/src/components/account/sections/MyProfileSection.tsx +276 -276
  291. package/src/components/account/sections/PreferencesSection.tsx +278 -278
  292. package/src/components/account/sections/SecuritySection.tsx +102 -102
  293. package/src/components/account/sections/TokenSection.tsx +85 -85
  294. package/src/components/embeds/ClarityEmbed.tsx +70 -70
  295. package/src/components/embeds/CrispEmbed.tsx +195 -195
  296. package/src/components/embeds/EmbedWidgets.tsx +62 -62
  297. package/src/components/embeds/FrillEmbed.tsx +146 -146
  298. package/src/components/layouts/AppMobileNavBar.tsx +214 -214
  299. package/src/components/layouts/AppNavBar.tsx +40 -40
  300. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  301. package/src/components/layouts/NavBar.tsx +228 -228
  302. package/src/components/layouts/NotificationsPopover.tsx +120 -120
  303. package/src/components/layouts/ProfilePopover.tsx +191 -191
  304. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  305. package/src/components/layouts/UsersSelectorPopover.tsx +236 -236
  306. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  307. package/src/components/modals/BuyCreditsModal.tsx +390 -390
  308. package/src/components/modals/CreditsDisabledModal.tsx +62 -62
  309. package/src/components/modals/Modals.tsx +25 -25
  310. package/src/components/modals/PaidPlanRequiredModal.tsx +60 -60
  311. package/src/components/modals/cards/AddCardModal.tsx +420 -420
  312. package/src/components/modals/cards/CannotDeleteCardModal.tsx +124 -124
  313. package/src/components/modals/cards/CardFormFields.tsx +363 -363
  314. package/src/components/modals/cards/DeleteCardModal.tsx +136 -136
  315. package/src/components/navigation/CancelledSubscriptionBanner.tsx +62 -62
  316. package/src/components/navigation/NavItemsContext.ts +20 -20
  317. package/src/components/navigation/OverdueInvoiceBanner.tsx +51 -51
  318. package/src/components/navigation/PendingCancellationBanner.tsx +60 -60
  319. package/src/components/navigation/ProjectSelectorPopover.tsx +180 -180
  320. package/src/components/navigation/SubscriptionBanner.tsx +94 -94
  321. package/src/components/navigation/TrialBanner.tsx +54 -54
  322. package/src/components/navigation/UpcomingInvoiceBanner.tsx +55 -55
  323. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  324. package/src/components/navigation/subcomponents/BottomLinks.tsx +85 -85
  325. package/src/components/navigation/subcomponents/ProjectSelector.tsx +184 -184
  326. package/src/components/pages/NotFoundPage.tsx +75 -75
  327. package/src/components/pages/notifications/Notifications.tsx +190 -190
  328. package/src/components/ui/buttons/Button.tsx +77 -77
  329. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  330. package/src/components/ui/buttons/CopyButton.tsx +59 -59
  331. package/src/components/ui/data-display/Accordion.tsx +81 -81
  332. package/src/components/ui/data-display/Badge.tsx +47 -47
  333. package/src/components/ui/data-display/Card.tsx +93 -93
  334. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  335. package/src/components/ui/data-display/CardItem.tsx +135 -135
  336. package/src/components/ui/data-display/Pagination.tsx +126 -126
  337. package/src/components/ui/data-display/PaymentInfoCard.tsx +193 -193
  338. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  339. package/src/components/ui/data-display/Separator.tsx +29 -29
  340. package/src/components/ui/data-display/Table.tsx +117 -117
  341. package/src/components/ui/data-display/Tabs.tsx +67 -67
  342. package/src/components/ui/feedback/CircularProgress.tsx +79 -79
  343. package/src/components/ui/feedback/DefaultCircularProgress.tsx +67 -67
  344. package/src/components/ui/feedback/LoadingOverlay.tsx +30 -30
  345. package/src/components/ui/feedback/Progress.tsx +40 -40
  346. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  347. package/src/components/ui/feedback/Toast.tsx +104 -104
  348. package/src/components/ui/form/Calendar.tsx +228 -228
  349. package/src/components/ui/form/Checkbox.tsx +31 -31
  350. package/src/components/ui/form/ComboboxField.tsx +159 -159
  351. package/src/components/ui/form/DatePicker.tsx +100 -100
  352. package/src/components/ui/form/DateRangePicker.tsx +111 -111
  353. package/src/components/ui/form/FormField.tsx +133 -133
  354. package/src/components/ui/form/Input.tsx +20 -20
  355. package/src/components/ui/form/InputOtp.tsx +80 -80
  356. package/src/components/ui/form/PhoneInput.tsx +210 -210
  357. package/src/components/ui/form/RadioGroup.tsx +45 -45
  358. package/src/components/ui/form/Select.tsx +200 -200
  359. package/src/components/ui/form/Switch.tsx +32 -32
  360. package/src/components/ui/form/Textarea.tsx +19 -19
  361. package/src/components/ui/overlay/Command.tsx +185 -185
  362. package/src/components/ui/overlay/Dialog.tsx +153 -153
  363. package/src/components/ui/overlay/Popover.tsx +49 -49
  364. package/src/components/ui/overlay/Sheet.tsx +170 -170
  365. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  366. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +392 -392
  367. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +62 -62
  368. package/src/components/widgets/ImageUpload/ImageUpload.tsx +131 -131
  369. package/src/components/widgets/ImageUpload/index.ts +3 -3
  370. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  371. package/src/handlers.ts +22 -22
  372. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  373. package/src/hooks/useAuthQueryKey.ts +32 -32
  374. package/src/hooks/useBrandLoadingIcon.tsx +18 -18
  375. package/src/hooks/useRouter.ts +38 -38
  376. package/src/http.ts +1 -1
  377. package/src/i18n/config.ts +17 -17
  378. package/src/i18n/country-language.ts +60 -60
  379. package/src/i18n/messages/en-us.ts +519 -519
  380. package/src/i18n/messages/es-es.ts +520 -520
  381. package/src/i18n/messages/index.ts +24 -24
  382. package/src/i18n/messages/pt-br.ts +543 -543
  383. package/src/i18n/normalize.ts +15 -15
  384. package/src/i18n/resolve-locale.ts +77 -77
  385. package/src/i18n.ts +10 -10
  386. package/src/index.ts +584 -584
  387. package/src/infra/http/api-fetch.ts +39 -39
  388. package/src/infra/route/parse-id.ts +9 -9
  389. package/src/infra/route/parse-numeric.ts +16 -16
  390. package/src/infra/route/safe-route-handler.ts +16 -16
  391. package/src/infra/route/search-params.ts +9 -9
  392. package/src/infra/utils/array.ts +167 -167
  393. package/src/infra/utils/date.ts +59 -59
  394. package/src/middleware.ts +4 -4
  395. package/src/modules/accounts/actions/account-management.action.ts +109 -109
  396. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  397. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  398. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  399. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  400. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  401. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  402. package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -32
  403. package/src/modules/accounts/hooks/useAccountManagement.ts +95 -95
  404. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  405. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  406. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  407. package/src/modules/accounts/services/account-token.service.ts +52 -52
  408. package/src/modules/accounts/services/account.service.ts +243 -243
  409. package/src/modules/accounts/types.ts +230 -230
  410. package/src/modules/auth/actions/social-google-login.action.ts +12 -12
  411. package/src/modules/auth/actions/social-google-onboarding.action.ts +13 -13
  412. package/src/modules/auth/actions/unlink-google.action.ts +8 -8
  413. package/src/modules/auth/actions/validate-session.action.ts +70 -70
  414. package/src/modules/auth/actions/verify-two-factor.action.ts +19 -19
  415. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  416. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  417. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  418. package/src/modules/auth/hooks/social-google-login.hook.tsx +13 -13
  419. package/src/modules/auth/hooks/social-google-onboarding.hook.tsx +13 -13
  420. package/src/modules/auth/hooks/unlink-google.hook.tsx +13 -13
  421. package/src/modules/auth/hooks/useManagementPermissions.ts +52 -52
  422. package/src/modules/auth/hooks/useUserQuery.ts +103 -103
  423. package/src/modules/auth/types/management-permission.type.ts +14 -14
  424. package/src/modules/auth/utils/assert-management-permission.ts +56 -56
  425. package/src/modules/auth/utils/assert-management-subscription.ts +38 -38
  426. package/src/modules/auth/utils/assert-paid-subscription.ts +47 -47
  427. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  428. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  429. package/src/modules/auth/utils/require-token-not-expired.ts +53 -53
  430. package/src/modules/auth/utils/require-valid-session.ts +35 -35
  431. package/src/modules/cards/actions/create-card.action.ts +9 -9
  432. package/src/modules/cards/actions/create-setup-intent.action.ts +8 -8
  433. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  434. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  435. package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -15
  436. package/src/modules/cards/handlers/list-cards.handler.ts +10 -10
  437. package/src/modules/cards/hooks/card-by-id.hook.ts +17 -17
  438. package/src/modules/cards/hooks/cards.hook.ts +22 -22
  439. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  440. package/src/modules/cards/hooks/create-setup-intent.hook.ts +11 -11
  441. package/src/modules/cards/hooks/delete-card.hook.ts +52 -52
  442. package/src/modules/cards/hooks/delete-confirmation.hook.ts +40 -40
  443. package/src/modules/cards/hooks/handle-delete-card.hook.ts +47 -47
  444. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  445. package/src/modules/cards/services/cards.service.ts +136 -136
  446. package/src/modules/cards/types.ts +52 -52
  447. package/src/modules/charges/actions/charge-action.action.ts +13 -13
  448. package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -14
  449. package/src/modules/charges/handlers/list-charges.handler.ts +15 -15
  450. package/src/modules/charges/hooks/charge-action.hook.ts +24 -24
  451. package/src/modules/charges/hooks/charge-by-id.hook.ts +19 -19
  452. package/src/modules/charges/hooks/charges.hook.ts +19 -19
  453. package/src/modules/charges/services/charges.service.ts +63 -63
  454. package/src/modules/charges/types/charge.type.ts +68 -68
  455. package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -14
  456. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +103 -103
  457. package/src/modules/images/actions/process-image.action.ts +40 -40
  458. package/src/modules/images/constants/image.constants.ts +11 -11
  459. package/src/modules/images/hooks/use-image-upload.hook.ts +153 -153
  460. package/src/modules/images/services/image-processing.service.ts +75 -75
  461. package/src/modules/images/types/image.type.ts +54 -54
  462. package/src/modules/images/utils/base64.ts +26 -26
  463. package/src/modules/images/utils/compress-image.ts +20 -20
  464. package/src/modules/images/utils/crop-image.ts +68 -68
  465. package/src/modules/images/utils/validate-image.ts +86 -86
  466. package/src/modules/pages/constants/query-keys.constants.ts +1 -1
  467. package/src/modules/pages/handlers/count-pages.handler.ts +12 -12
  468. package/src/modules/pages/hooks/count-pages.hook.ts +21 -21
  469. package/src/modules/pages/services/pages.service.ts +27 -27
  470. package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -14
  471. package/src/modules/plans/handlers/list-plans.handler.ts +22 -22
  472. package/src/modules/plans/hooks/list-plans.hook.ts +23 -23
  473. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  474. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +39 -39
  475. package/src/modules/plans/services/plans.service.ts +136 -135
  476. package/src/modules/plans/types/plan.type.ts +79 -75
  477. package/src/modules/plans/utils/map-api-plan-to-ui.ts +167 -167
  478. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  479. package/src/modules/projects/actions/create-project.action.ts +9 -9
  480. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  481. package/src/modules/projects/actions/find-project.action.ts +8 -8
  482. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  483. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  484. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  485. package/src/modules/projects/actions/update-project.action.ts +9 -9
  486. package/src/modules/projects/handlers/find-project.handler.ts +15 -15
  487. package/src/modules/projects/handlers/list-all-account-users.handler.ts +23 -23
  488. package/src/modules/projects/handlers/list-available-users.handler.ts +26 -26
  489. package/src/modules/projects/handlers/list-project-users.handler.ts +26 -26
  490. package/src/modules/projects/handlers/list-projects.handler.ts +23 -23
  491. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  492. package/src/modules/projects/hooks/create-project.hook.ts +120 -120
  493. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  494. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  495. package/src/modules/projects/hooks/list-all-account-users.hook.ts +40 -40
  496. package/src/modules/projects/hooks/list-available-users.hook.ts +39 -39
  497. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +44 -44
  498. package/src/modules/projects/hooks/list-project-users.hook.ts +39 -39
  499. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  500. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  501. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  502. package/src/modules/projects/services/projects.service.ts +156 -156
  503. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  504. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  505. package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -13
  506. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  507. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  508. package/src/modules/subscriptions/constants/subscription.constants.ts +1 -1
  509. package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -17
  510. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  511. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +22 -22
  512. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +22 -22
  513. package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -25
  514. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  515. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +44 -44
  516. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  517. package/src/modules/subscriptions/types/calculate-subscription.type.ts +116 -116
  518. package/src/modules/subscriptions/types/pix-pending.type.ts +38 -38
  519. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  520. package/src/modules/subscriptions/utils/get-subscription-cancellation-state.ts +37 -37
  521. package/src/modules/subscriptions/utils/get-subscription-expiry-date.ts +33 -33
  522. package/src/modules/subscriptions/utils/has-subscription-expired.ts +11 -11
  523. package/src/modules/subscriptions/utils/periodicity.ts +79 -79
  524. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  525. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  526. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  527. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  528. package/src/modules/users/handlers/list-messages.handler.ts +39 -39
  529. package/src/modules/users/hooks/messages.hook.ts +69 -69
  530. package/src/modules/users/services/messages.service.ts +49 -49
  531. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  532. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  533. package/src/modules/whitelabel/schema.ts +84 -84
  534. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  535. package/src/providers/auth.provider.tsx +264 -264
  536. package/src/providers/navigation.provider.tsx +99 -99
  537. package/src/providers/whitelabel.provider.tsx +90 -90
  538. package/src/route.ts +4 -4
  539. package/src/store/useAccountModals.ts +85 -85
  540. package/src/store/useBuyCreditsModal.ts +21 -21
  541. package/src/store/useCreditsDisabledModal.ts +11 -11
  542. package/src/store/useDesktopSidebarStore.ts +47 -47
  543. package/src/store/useMdSidebarStore.ts +34 -34
  544. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  545. package/src/utils/constants/br-states.ts +29 -29
  546. package/src/utils/countries.ts +224 -224
  547. package/src/utils/format/currency.ts +70 -70
  548. package/src/utils/intl/cookie-domain.ts +29 -29
  549. package/src/utils/intl/locale-cookie.ts +18 -18
  550. package/src/utils/next-navigation.ts +7 -7
  551. package/src/utils/redirect.ts +78 -78
  552. package/src/utils/safeMutationAction.ts +24 -24
  553. package/src/utils/safeServerAction.ts +21 -21
  554. 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
+ }