@greatapps/common 1.1.515 → 1.1.517

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  18. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  20. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  21. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  22. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  24. package/dist/components/layouts/NavBar.mjs.map +1 -1
  25. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  26. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  27. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  28. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  29. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  30. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  31. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  32. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  33. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  34. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  35. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  36. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  37. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  38. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  39. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  40. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  41. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  42. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  43. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  44. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  45. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  46. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  47. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  48. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  49. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  51. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  52. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  53. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  54. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  55. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  56. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  57. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  58. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  59. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  60. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  61. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  62. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  63. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  64. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  65. package/dist/components/ui/form/DatePicker.mjs +2 -2
  66. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  67. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  68. package/dist/components/ui/form/FormField.mjs +1 -1
  69. package/dist/components/ui/form/FormField.mjs.map +1 -1
  70. package/dist/components/ui/form/Input.mjs.map +1 -1
  71. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  72. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  73. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  74. package/dist/components/ui/form/Select.mjs +1 -1
  75. package/dist/components/ui/form/Select.mjs.map +1 -1
  76. package/dist/components/ui/form/Switch.mjs.map +1 -1
  77. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  78. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  79. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  80. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  83. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  84. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  85. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  86. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  87. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  88. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  89. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/infra/utils/array.mjs.map +1 -1
  92. package/dist/infra/utils/date.mjs.map +1 -1
  93. package/dist/middleware.mjs.map +1 -1
  94. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  95. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  96. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  97. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  98. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  99. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  100. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  101. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  104. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  105. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  106. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  107. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  108. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  109. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  110. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  111. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  112. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  113. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  114. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  115. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  116. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  117. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  118. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  119. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  120. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  121. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  122. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  123. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  124. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  125. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  126. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  127. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  128. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  129. package/dist/modules/cards/types.mjs.map +1 -1
  130. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  131. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  132. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  133. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  134. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  135. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  136. package/dist/modules/images/utils/base64.mjs.map +1 -1
  137. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  138. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  139. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  140. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  141. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  142. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  143. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  144. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  145. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  146. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  147. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  148. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  149. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  150. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  151. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  152. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  157. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  158. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  159. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  160. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  161. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  168. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  169. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  170. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  171. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  172. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  173. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  174. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  175. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  176. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  177. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  178. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  179. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  180. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  181. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  182. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  183. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  184. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  185. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  186. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  187. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  188. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  189. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  190. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  191. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  192. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  193. package/dist/providers/auth.provider.mjs.map +1 -1
  194. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  195. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  196. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  197. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  198. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  199. package/dist/utils/constants/br-states.mjs.map +1 -1
  200. package/dist/utils/countries.mjs.map +1 -1
  201. package/dist/utils/format/currency.mjs.map +1 -1
  202. package/dist/utils/safeServerAction.mjs.map +1 -1
  203. package/dist/utils/withAction.mjs.map +1 -1
  204. package/package.json +92 -92
  205. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  206. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  207. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  208. package/src/components/account/DeleteAccountModal.tsx +130 -130
  209. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  210. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  211. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  212. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  213. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  214. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  215. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  216. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  217. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  218. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  219. package/src/components/account/sections/SecuritySection.tsx +46 -46
  220. package/src/components/account/sections/TokenSection.tsx +64 -64
  221. package/src/components/embeds/CrispEmbed.tsx +156 -156
  222. package/src/components/embeds/EmbedWidgets.tsx +50 -50
  223. package/src/components/embeds/FrillEmbed.tsx +129 -129
  224. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  225. package/src/components/layouts/AppNavBar.tsx +40 -40
  226. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  227. package/src/components/layouts/NavBar.tsx +175 -175
  228. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  229. package/src/components/layouts/ProfilePopover.tsx +176 -176
  230. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  231. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  232. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  233. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  234. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  235. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  236. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  237. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  238. package/src/components/navigation/NavItemsContext.ts +20 -20
  239. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  240. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  241. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  242. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  243. package/src/components/pages/NotFoundPage.tsx +67 -67
  244. package/src/components/pages/notifications/Notifications.tsx +187 -187
  245. package/src/components/ui/buttons/Button.tsx +62 -62
  246. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  247. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  248. package/src/components/ui/data-display/Accordion.tsx +81 -81
  249. package/src/components/ui/data-display/Badge.tsx +47 -47
  250. package/src/components/ui/data-display/Card.tsx +93 -93
  251. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  252. package/src/components/ui/data-display/CardItem.tsx +75 -75
  253. package/src/components/ui/data-display/Pagination.tsx +126 -126
  254. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  255. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  256. package/src/components/ui/data-display/Separator.tsx +29 -29
  257. package/src/components/ui/data-display/Table.tsx +117 -117
  258. package/src/components/ui/data-display/Tabs.tsx +67 -67
  259. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  260. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  261. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  262. package/src/components/ui/feedback/Progress.tsx +40 -40
  263. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  264. package/src/components/ui/feedback/Toast.tsx +104 -104
  265. package/src/components/ui/form/Calendar.tsx +228 -228
  266. package/src/components/ui/form/Checkbox.tsx +31 -31
  267. package/src/components/ui/form/ComboboxField.tsx +154 -154
  268. package/src/components/ui/form/DatePicker.tsx +98 -97
  269. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  270. package/src/components/ui/form/FormField.tsx +133 -131
  271. package/src/components/ui/form/Input.tsx +20 -20
  272. package/src/components/ui/form/InputOtp.tsx +80 -80
  273. package/src/components/ui/form/PhoneInput.tsx +208 -208
  274. package/src/components/ui/form/RadioGroup.tsx +45 -45
  275. package/src/components/ui/form/Select.tsx +200 -200
  276. package/src/components/ui/form/Switch.tsx +32 -32
  277. package/src/components/ui/form/Textarea.tsx +19 -19
  278. package/src/components/ui/overlay/Command.tsx +185 -185
  279. package/src/components/ui/overlay/Dialog.tsx +153 -153
  280. package/src/components/ui/overlay/Popover.tsx +49 -49
  281. package/src/components/ui/overlay/Sheet.tsx +170 -170
  282. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  283. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  284. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  285. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  286. package/src/components/widgets/ImageUpload/index.ts +3 -3
  287. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  288. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  289. package/src/hooks/useAuthQueryKey.ts +32 -32
  290. package/src/index.ts +506 -506
  291. package/src/infra/utils/array.ts +54 -54
  292. package/src/infra/utils/date.ts +18 -18
  293. package/src/middleware.ts +4 -4
  294. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  295. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  296. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  297. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  298. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  299. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  300. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  301. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  302. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  303. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  304. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  305. package/src/modules/accounts/services/account-token.service.ts +52 -52
  306. package/src/modules/accounts/services/account.service.ts +239 -239
  307. package/src/modules/accounts/types.ts +225 -225
  308. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  309. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  310. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  311. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  312. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  313. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  314. package/src/modules/auth/types/management-permission.type.ts +7 -7
  315. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  316. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  317. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  318. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  319. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  320. package/src/modules/cards/actions/create-card.action.ts +9 -9
  321. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  322. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  323. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  324. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  325. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  326. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  327. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  328. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  329. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  330. package/src/modules/cards/services/cards.service.ts +108 -108
  331. package/src/modules/cards/types.ts +42 -42
  332. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  333. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  334. package/src/modules/images/actions/process-image.action.ts +40 -40
  335. package/src/modules/images/constants/image.constants.ts +11 -11
  336. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  337. package/src/modules/images/services/image-processing.service.ts +75 -75
  338. package/src/modules/images/types/image.type.ts +54 -54
  339. package/src/modules/images/utils/base64.ts +26 -26
  340. package/src/modules/images/utils/compress-image.ts +20 -20
  341. package/src/modules/images/utils/crop-image.ts +51 -51
  342. package/src/modules/images/utils/validate-image.ts +71 -71
  343. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  344. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  345. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  346. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  347. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  348. package/src/modules/plans/services/plans.service.ts +133 -133
  349. package/src/modules/plans/types/plan.type.ts +67 -67
  350. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  351. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  352. package/src/modules/projects/actions/create-project.action.ts +9 -9
  353. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  354. package/src/modules/projects/actions/find-project.action.ts +8 -8
  355. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  356. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  357. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  358. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  359. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  360. package/src/modules/projects/actions/update-project.action.ts +9 -9
  361. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  362. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  363. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  364. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  365. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  366. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  367. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  368. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  369. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  370. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  371. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  372. package/src/modules/projects/services/projects.service.ts +144 -144
  373. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  374. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  375. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  376. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  377. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  378. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  379. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  380. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  381. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  382. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  383. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  384. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  385. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  386. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  387. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  388. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  389. package/src/modules/users/action/list-messages.action.ts +26 -26
  390. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  391. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  392. package/src/modules/users/hooks/messages.hook.ts +67 -67
  393. package/src/modules/users/services/messages.service.ts +49 -49
  394. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  395. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  396. package/src/modules/whitelabel/schema.ts +84 -84
  397. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  398. package/src/providers/auth.provider.tsx +162 -162
  399. package/src/providers/whitelabel.provider.tsx +59 -59
  400. package/src/store/useBuyCreditsModal.ts +21 -21
  401. package/src/store/useDesktopSidebarStore.ts +47 -47
  402. package/src/store/useMdSidebarStore.ts +34 -34
  403. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  404. package/src/utils/constants/br-states.ts +29 -29
  405. package/src/utils/countries.ts +224 -224
  406. package/src/utils/format/currency.ts +15 -15
  407. package/src/utils/safeServerAction.ts +21 -21
  408. package/src/utils/withAction.ts +13 -13
@@ -1,172 +1,172 @@
1
- 'use client'
2
-
3
- import { useState, useCallback, useRef, useEffect } from 'react'
4
- import type { Crop } from 'react-image-crop'
5
- import { cropImageToCanvas } from '../utils/crop-image'
6
- import { validateImage } from '../utils/validate-image'
7
- import type { ImageConfig } from '../types/image.type'
8
-
9
- export interface ImageTooSmallError {
10
- fileName: string
11
- minWidth: number
12
- minHeight: number
13
- }
14
-
15
- export interface UseImageUploadOptions {
16
- config: ImageConfig
17
- onSuccess?: (base64Image: string) => void
18
- onError?: (error: string) => void
19
- }
20
-
21
- export function useImageUpload(options: UseImageUploadOptions) {
22
- const { config, onSuccess, onError } = options
23
-
24
- // Refs para manter callbacks sempre atualizados (evita stale closures)
25
- const onSuccessRef = useRef(onSuccess)
26
- const onErrorRef = useRef(onError)
27
- useEffect(() => {
28
- onSuccessRef.current = onSuccess
29
- onErrorRef.current = onError
30
- }, [onSuccess, onError])
31
-
32
- const [originalImage, setOriginalImage] = useState<string | null>(null)
33
- const [croppedPreview, setCroppedPreview] = useState<string | null>(null)
34
- const [showCropModal, setShowCropModal] = useState(false)
35
- const [showTooSmallModal, setShowTooSmallModal] = useState(false)
36
- const [tooSmallError, setTooSmallError] = useState<ImageTooSmallError | null>(null)
37
- const [isProcessing, setIsProcessing] = useState(false)
38
- const fileInputRef = useRef<HTMLInputElement>(null)
39
- const currentFileName = useRef<string>('')
40
-
41
- // Verifica se a imagem cabe o crop mínimo
42
- const checkMinimumDimensions = useCallback(
43
- (naturalWidth: number, naturalHeight: number): boolean => {
44
- const { width: minW, height: minH, aspectRatio } = config
45
- const imgAspect = naturalWidth / naturalHeight
46
-
47
- if (imgAspect >= aspectRatio) {
48
- const cropHeight = naturalHeight
49
- const cropWidth = cropHeight * aspectRatio
50
- return cropWidth >= minW && cropHeight >= minH
51
- } else {
52
- const cropWidth = naturalWidth
53
- const cropHeight = cropWidth / aspectRatio
54
- return cropWidth >= minW && cropHeight >= minH
55
- }
56
- },
57
- [config]
58
- )
59
-
60
- // Valida dimensões ANTES de abrir qualquer modal
61
- const handleFileSelect = useCallback(
62
- (file: File) => {
63
- const validation = validateImage(file)
64
- if (!validation.valid) {
65
- onErrorRef.current?.(validation.error || 'Arquivo inválido')
66
- return
67
- }
68
-
69
- currentFileName.current = file.name
70
-
71
- // Converte para base64
72
- const reader = new FileReader()
73
- reader.onload = (e) => {
74
- const base64 = e.target?.result as string
75
- setOriginalImage(base64)
76
-
77
- // Carrega imagem em memória para verificar dimensões ANTES de abrir modal
78
- const img = new Image()
79
- img.onload = () => {
80
- const { naturalWidth, naturalHeight } = img
81
-
82
- if (checkMinimumDimensions(naturalWidth, naturalHeight)) {
83
- // Dimensões OK - abre modal de crop
84
- setShowCropModal(true)
85
- } else {
86
- // Imagem muito pequena - abre modal de erro diretamente
87
- setTooSmallError({
88
- fileName: currentFileName.current,
89
- minWidth: config.width,
90
- minHeight: config.height,
91
- })
92
- setShowTooSmallModal(true)
93
- }
94
- }
95
- img.src = base64
96
- }
97
- reader.readAsDataURL(file)
98
- },
99
- [config, checkMinimumDimensions]
100
- )
101
-
102
- // Mantido para compatibilidade, mas não mais necessário para validação
103
- const handleImageLoadInModal = useCallback(
104
- (_naturalWidth: number, _naturalHeight: number) => {
105
- // Validação agora é feita antes de abrir a modal
106
- // Este callback pode ser usado para outros propósitos se necessário
107
- },
108
- []
109
- )
110
-
111
- const handleSelectAnotherFile = useCallback(() => {
112
- setShowTooSmallModal(false)
113
- setTooSmallError(null)
114
- fileInputRef.current?.click()
115
- }, [])
116
-
117
- const handleCancelTooSmall = useCallback(() => {
118
- setShowTooSmallModal(false)
119
- setShowCropModal(false)
120
- setTooSmallError(null)
121
- setOriginalImage(null)
122
- }, [])
123
-
124
- const handleCropConfirm = useCallback(
125
- async (imageElement: HTMLImageElement, cropArea: Crop) => {
126
- setIsProcessing(true)
127
- try {
128
- // Crop é feito inteiramente no cliente via Canvas
129
- // Já produz imagem no tamanho final (config.width x config.height)
130
- const croppedBase64 = await cropImageToCanvas(
131
- imageElement,
132
- cropArea,
133
- config.width,
134
- config.height
135
- )
136
-
137
- setCroppedPreview(croppedBase64)
138
- setShowCropModal(false)
139
- onSuccessRef.current?.(croppedBase64)
140
- } catch {
141
- onErrorRef.current?.('Erro ao aplicar crop')
142
- } finally {
143
- setIsProcessing(false)
144
- }
145
- },
146
- [config]
147
- )
148
-
149
- const clear = useCallback(() => {
150
- setOriginalImage(null)
151
- setCroppedPreview(null)
152
- }, [])
153
-
154
- return {
155
- originalImage,
156
- croppedPreview,
157
- showCropModal,
158
- showTooSmallModal,
159
- tooSmallError,
160
- config,
161
- isProcessing,
162
- fileInputRef,
163
- handleFileSelect,
164
- handleCropConfirm,
165
- handleImageLoadInModal,
166
- handleSelectAnotherFile,
167
- handleCancelTooSmall,
168
- setShowCropModal,
169
- setShowTooSmallModal,
170
- clear,
171
- }
172
- }
1
+ 'use client'
2
+
3
+ import { useState, useCallback, useRef, useEffect } from 'react'
4
+ import type { Crop } from 'react-image-crop'
5
+ import { cropImageToCanvas } from '../utils/crop-image'
6
+ import { validateImage } from '../utils/validate-image'
7
+ import type { ImageConfig } from '../types/image.type'
8
+
9
+ export interface ImageTooSmallError {
10
+ fileName: string
11
+ minWidth: number
12
+ minHeight: number
13
+ }
14
+
15
+ export interface UseImageUploadOptions {
16
+ config: ImageConfig
17
+ onSuccess?: (base64Image: string) => void
18
+ onError?: (error: string) => void
19
+ }
20
+
21
+ export function useImageUpload(options: UseImageUploadOptions) {
22
+ const { config, onSuccess, onError } = options
23
+
24
+ // Refs para manter callbacks sempre atualizados (evita stale closures)
25
+ const onSuccessRef = useRef(onSuccess)
26
+ const onErrorRef = useRef(onError)
27
+ useEffect(() => {
28
+ onSuccessRef.current = onSuccess
29
+ onErrorRef.current = onError
30
+ }, [onSuccess, onError])
31
+
32
+ const [originalImage, setOriginalImage] = useState<string | null>(null)
33
+ const [croppedPreview, setCroppedPreview] = useState<string | null>(null)
34
+ const [showCropModal, setShowCropModal] = useState(false)
35
+ const [showTooSmallModal, setShowTooSmallModal] = useState(false)
36
+ const [tooSmallError, setTooSmallError] = useState<ImageTooSmallError | null>(null)
37
+ const [isProcessing, setIsProcessing] = useState(false)
38
+ const fileInputRef = useRef<HTMLInputElement>(null)
39
+ const currentFileName = useRef<string>('')
40
+
41
+ // Verifica se a imagem cabe o crop mínimo
42
+ const checkMinimumDimensions = useCallback(
43
+ (naturalWidth: number, naturalHeight: number): boolean => {
44
+ const { width: minW, height: minH, aspectRatio } = config
45
+ const imgAspect = naturalWidth / naturalHeight
46
+
47
+ if (imgAspect >= aspectRatio) {
48
+ const cropHeight = naturalHeight
49
+ const cropWidth = cropHeight * aspectRatio
50
+ return cropWidth >= minW && cropHeight >= minH
51
+ } else {
52
+ const cropWidth = naturalWidth
53
+ const cropHeight = cropWidth / aspectRatio
54
+ return cropWidth >= minW && cropHeight >= minH
55
+ }
56
+ },
57
+ [config]
58
+ )
59
+
60
+ // Valida dimensões ANTES de abrir qualquer modal
61
+ const handleFileSelect = useCallback(
62
+ (file: File) => {
63
+ const validation = validateImage(file)
64
+ if (!validation.valid) {
65
+ onErrorRef.current?.(validation.error || 'Arquivo inválido')
66
+ return
67
+ }
68
+
69
+ currentFileName.current = file.name
70
+
71
+ // Converte para base64
72
+ const reader = new FileReader()
73
+ reader.onload = (e) => {
74
+ const base64 = e.target?.result as string
75
+ setOriginalImage(base64)
76
+
77
+ // Carrega imagem em memória para verificar dimensões ANTES de abrir modal
78
+ const img = new Image()
79
+ img.onload = () => {
80
+ const { naturalWidth, naturalHeight } = img
81
+
82
+ if (checkMinimumDimensions(naturalWidth, naturalHeight)) {
83
+ // Dimensões OK - abre modal de crop
84
+ setShowCropModal(true)
85
+ } else {
86
+ // Imagem muito pequena - abre modal de erro diretamente
87
+ setTooSmallError({
88
+ fileName: currentFileName.current,
89
+ minWidth: config.width,
90
+ minHeight: config.height,
91
+ })
92
+ setShowTooSmallModal(true)
93
+ }
94
+ }
95
+ img.src = base64
96
+ }
97
+ reader.readAsDataURL(file)
98
+ },
99
+ [config, checkMinimumDimensions]
100
+ )
101
+
102
+ // Mantido para compatibilidade, mas não mais necessário para validação
103
+ const handleImageLoadInModal = useCallback(
104
+ (_naturalWidth: number, _naturalHeight: number) => {
105
+ // Validação agora é feita antes de abrir a modal
106
+ // Este callback pode ser usado para outros propósitos se necessário
107
+ },
108
+ []
109
+ )
110
+
111
+ const handleSelectAnotherFile = useCallback(() => {
112
+ setShowTooSmallModal(false)
113
+ setTooSmallError(null)
114
+ fileInputRef.current?.click()
115
+ }, [])
116
+
117
+ const handleCancelTooSmall = useCallback(() => {
118
+ setShowTooSmallModal(false)
119
+ setShowCropModal(false)
120
+ setTooSmallError(null)
121
+ setOriginalImage(null)
122
+ }, [])
123
+
124
+ const handleCropConfirm = useCallback(
125
+ async (imageElement: HTMLImageElement, cropArea: Crop) => {
126
+ setIsProcessing(true)
127
+ try {
128
+ // Crop é feito inteiramente no cliente via Canvas
129
+ // Já produz imagem no tamanho final (config.width x config.height)
130
+ const croppedBase64 = await cropImageToCanvas(
131
+ imageElement,
132
+ cropArea,
133
+ config.width,
134
+ config.height
135
+ )
136
+
137
+ setCroppedPreview(croppedBase64)
138
+ setShowCropModal(false)
139
+ onSuccessRef.current?.(croppedBase64)
140
+ } catch {
141
+ onErrorRef.current?.('Erro ao aplicar crop')
142
+ } finally {
143
+ setIsProcessing(false)
144
+ }
145
+ },
146
+ [config]
147
+ )
148
+
149
+ const clear = useCallback(() => {
150
+ setOriginalImage(null)
151
+ setCroppedPreview(null)
152
+ }, [])
153
+
154
+ return {
155
+ originalImage,
156
+ croppedPreview,
157
+ showCropModal,
158
+ showTooSmallModal,
159
+ tooSmallError,
160
+ config,
161
+ isProcessing,
162
+ fileInputRef,
163
+ handleFileSelect,
164
+ handleCropConfirm,
165
+ handleImageLoadInModal,
166
+ handleSelectAnotherFile,
167
+ handleCancelTooSmall,
168
+ setShowCropModal,
169
+ setShowTooSmallModal,
170
+ clear,
171
+ }
172
+ }
@@ -1,75 +1,75 @@
1
- import type { ProcessImageInput, ProcessImageOutput } from '../types/image.type'
2
-
3
- export async function processImage(input: ProcessImageInput): Promise<ProcessImageOutput> {
4
- const {
5
- imageBytes,
6
- targetWidth,
7
- targetHeight,
8
- outputFormat = 'jpeg',
9
- quality = 85,
10
- } = input
11
-
12
- // Dynamic import to avoid fs.createReadStream error in edge runtime
13
- const { PhotonImage, resize, crop, SamplingFilter } = await import(
14
- '@cf-wasm/photon/edge-light'
15
- )
16
-
17
- const image = PhotonImage.new_from_byteslice(imageBytes)
18
-
19
- try {
20
- const sourceWidth = image.get_width()
21
- const sourceHeight = image.get_height()
22
- const targetAspect = targetWidth / targetHeight
23
- const sourceAspect = sourceWidth / sourceHeight
24
-
25
- let cropX1 = 0
26
- let cropY1 = 0
27
- let cropX2 = sourceWidth
28
- let cropY2 = sourceHeight
29
-
30
- if (sourceAspect > targetAspect) {
31
- const cropWidth = Math.round(sourceHeight * targetAspect)
32
- cropX1 = Math.round((sourceWidth - cropWidth) / 2)
33
- cropX2 = cropX1 + cropWidth
34
- } else if (sourceAspect < targetAspect) {
35
- const cropHeight = Math.round(sourceWidth / targetAspect)
36
- cropY1 = Math.round((sourceHeight - cropHeight) / 2)
37
- cropY2 = cropY1 + cropHeight
38
- }
39
-
40
- const cropped = crop(image, cropX1, cropY1, cropX2, cropY2)
41
- const resized = resize(
42
- cropped,
43
- targetWidth,
44
- targetHeight,
45
- SamplingFilter.Triangle
46
- )
47
-
48
- let outputBytes: Uint8Array
49
- switch (outputFormat) {
50
- case 'jpeg':
51
- outputBytes = resized.get_bytes_jpeg(quality)
52
- break
53
- case 'png':
54
- outputBytes = resized.get_bytes()
55
- break
56
- case 'webp':
57
- outputBytes = resized.get_bytes_webp()
58
- break
59
- default:
60
- outputBytes = resized.get_bytes_jpeg(quality)
61
- }
62
-
63
- cropped.free()
64
- resized.free()
65
-
66
- return {
67
- bytes: outputBytes,
68
- width: targetWidth,
69
- height: targetHeight,
70
- format: `image/${outputFormat}`,
71
- }
72
- } finally {
73
- image.free()
74
- }
75
- }
1
+ import type { ProcessImageInput, ProcessImageOutput } from '../types/image.type'
2
+
3
+ export async function processImage(input: ProcessImageInput): Promise<ProcessImageOutput> {
4
+ const {
5
+ imageBytes,
6
+ targetWidth,
7
+ targetHeight,
8
+ outputFormat = 'jpeg',
9
+ quality = 85,
10
+ } = input
11
+
12
+ // Dynamic import to avoid fs.createReadStream error in edge runtime
13
+ const { PhotonImage, resize, crop, SamplingFilter } = await import(
14
+ '@cf-wasm/photon/edge-light'
15
+ )
16
+
17
+ const image = PhotonImage.new_from_byteslice(imageBytes)
18
+
19
+ try {
20
+ const sourceWidth = image.get_width()
21
+ const sourceHeight = image.get_height()
22
+ const targetAspect = targetWidth / targetHeight
23
+ const sourceAspect = sourceWidth / sourceHeight
24
+
25
+ let cropX1 = 0
26
+ let cropY1 = 0
27
+ let cropX2 = sourceWidth
28
+ let cropY2 = sourceHeight
29
+
30
+ if (sourceAspect > targetAspect) {
31
+ const cropWidth = Math.round(sourceHeight * targetAspect)
32
+ cropX1 = Math.round((sourceWidth - cropWidth) / 2)
33
+ cropX2 = cropX1 + cropWidth
34
+ } else if (sourceAspect < targetAspect) {
35
+ const cropHeight = Math.round(sourceWidth / targetAspect)
36
+ cropY1 = Math.round((sourceHeight - cropHeight) / 2)
37
+ cropY2 = cropY1 + cropHeight
38
+ }
39
+
40
+ const cropped = crop(image, cropX1, cropY1, cropX2, cropY2)
41
+ const resized = resize(
42
+ cropped,
43
+ targetWidth,
44
+ targetHeight,
45
+ SamplingFilter.Triangle
46
+ )
47
+
48
+ let outputBytes: Uint8Array
49
+ switch (outputFormat) {
50
+ case 'jpeg':
51
+ outputBytes = resized.get_bytes_jpeg(quality)
52
+ break
53
+ case 'png':
54
+ outputBytes = resized.get_bytes()
55
+ break
56
+ case 'webp':
57
+ outputBytes = resized.get_bytes_webp()
58
+ break
59
+ default:
60
+ outputBytes = resized.get_bytes_jpeg(quality)
61
+ }
62
+
63
+ cropped.free()
64
+ resized.free()
65
+
66
+ return {
67
+ bytes: outputBytes,
68
+ width: targetWidth,
69
+ height: targetHeight,
70
+ format: `image/${outputFormat}`,
71
+ }
72
+ } finally {
73
+ image.free()
74
+ }
75
+ }
@@ -1,54 +1,54 @@
1
- export interface ImageConfig {
2
- width: number
3
- height: number
4
- aspectRatio: number
5
- label?: string
6
- }
7
-
8
- export interface CropArea {
9
- x: number
10
- y: number
11
- width: number
12
- height: number
13
- unit?: '%' | 'px'
14
- }
15
-
16
- export interface ProcessedImage {
17
- base64: string
18
- width: number
19
- height: number
20
- format: string
21
- }
22
-
23
- export interface CompressImageOptions {
24
- maxSizeMB?: number
25
- maxWidthOrHeight?: number
26
- }
27
-
28
- export interface ProcessImageInput {
29
- imageBytes: Uint8Array
30
- targetWidth: number
31
- targetHeight: number
32
- outputFormat?: 'jpeg' | 'png' | 'webp'
33
- quality?: number
34
- }
35
-
36
- export interface ProcessImageOutput {
37
- bytes: Uint8Array
38
- width: number
39
- height: number
40
- format: string
41
- }
42
-
43
- export interface ProcessImageActionInput {
44
- base64Image: string
45
- targetWidth: number
46
- targetHeight: number
47
- cropArea?: CropArea
48
- }
49
-
50
- export interface ProcessImageActionOutput {
51
- success: boolean
52
- base64Image?: string
53
- error?: string
54
- }
1
+ export interface ImageConfig {
2
+ width: number
3
+ height: number
4
+ aspectRatio: number
5
+ label?: string
6
+ }
7
+
8
+ export interface CropArea {
9
+ x: number
10
+ y: number
11
+ width: number
12
+ height: number
13
+ unit?: '%' | 'px'
14
+ }
15
+
16
+ export interface ProcessedImage {
17
+ base64: string
18
+ width: number
19
+ height: number
20
+ format: string
21
+ }
22
+
23
+ export interface CompressImageOptions {
24
+ maxSizeMB?: number
25
+ maxWidthOrHeight?: number
26
+ }
27
+
28
+ export interface ProcessImageInput {
29
+ imageBytes: Uint8Array
30
+ targetWidth: number
31
+ targetHeight: number
32
+ outputFormat?: 'jpeg' | 'png' | 'webp'
33
+ quality?: number
34
+ }
35
+
36
+ export interface ProcessImageOutput {
37
+ bytes: Uint8Array
38
+ width: number
39
+ height: number
40
+ format: string
41
+ }
42
+
43
+ export interface ProcessImageActionInput {
44
+ base64Image: string
45
+ targetWidth: number
46
+ targetHeight: number
47
+ cropArea?: CropArea
48
+ }
49
+
50
+ export interface ProcessImageActionOutput {
51
+ success: boolean
52
+ base64Image?: string
53
+ error?: string
54
+ }
@@ -1,26 +1,26 @@
1
- /**
2
- * Converts a base64 string to a File object
3
- */
4
- export function base64ToFile(base64: string, filename: string): File {
5
- const arr = base64.split(',')
6
- const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp'
7
- const bstr = atob(arr[1])
8
- let n = bstr.length
9
- const u8arr = new Uint8Array(n)
10
- while (n--) {
11
- u8arr[n] = bstr.charCodeAt(n)
12
- }
13
- return new File([u8arr], filename, { type: mime })
14
- }
15
-
16
- /**
17
- * Converts a File to a base64 string
18
- */
19
- export function fileToBase64(file: File): Promise<string> {
20
- return new Promise((resolve, reject) => {
21
- const reader = new FileReader()
22
- reader.onload = () => resolve(reader.result as string)
23
- reader.onerror = reject
24
- reader.readAsDataURL(file)
25
- })
26
- }
1
+ /**
2
+ * Converts a base64 string to a File object
3
+ */
4
+ export function base64ToFile(base64: string, filename: string): File {
5
+ const arr = base64.split(',')
6
+ const mime = arr[0].match(/:(.*?);/)?.[1] || 'image/webp'
7
+ const bstr = atob(arr[1])
8
+ let n = bstr.length
9
+ const u8arr = new Uint8Array(n)
10
+ while (n--) {
11
+ u8arr[n] = bstr.charCodeAt(n)
12
+ }
13
+ return new File([u8arr], filename, { type: mime })
14
+ }
15
+
16
+ /**
17
+ * Converts a File to a base64 string
18
+ */
19
+ export function fileToBase64(file: File): Promise<string> {
20
+ return new Promise((resolve, reject) => {
21
+ const reader = new FileReader()
22
+ reader.onload = () => resolve(reader.result as string)
23
+ reader.onerror = reject
24
+ reader.readAsDataURL(file)
25
+ })
26
+ }