@greatapps/common 1.1.517 → 1.1.519

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 (413) 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 +7 -1
  18. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  19. package/dist/components/embeds/ClarityEmbed.mjs +55 -0
  20. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -0
  21. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  22. package/dist/components/embeds/EmbedWidgets.mjs +3 -1
  23. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  24. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  25. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  26. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  27. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  28. package/dist/components/layouts/NavBar.mjs.map +1 -1
  29. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  30. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  31. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  32. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  33. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  34. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  35. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  36. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  37. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  38. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  39. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  40. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  41. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  42. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  43. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  44. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  45. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  46. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  47. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  48. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  51. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  52. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  53. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  54. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  55. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  56. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  60. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  61. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  62. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  63. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  64. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  65. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  66. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  67. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  68. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  69. package/dist/components/ui/form/DatePicker.mjs +2 -2
  70. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  71. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  72. package/dist/components/ui/form/FormField.mjs.map +1 -1
  73. package/dist/components/ui/form/Input.mjs.map +1 -1
  74. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  75. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  76. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  77. package/dist/components/ui/form/Select.mjs +1 -1
  78. package/dist/components/ui/form/Select.mjs.map +1 -1
  79. package/dist/components/ui/form/Switch.mjs.map +1 -1
  80. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  83. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  84. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  85. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  86. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  87. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  88. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  89. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  90. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  91. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  92. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  93. package/dist/index.mjs +2 -0
  94. package/dist/index.mjs.map +1 -1
  95. package/dist/infra/utils/array.mjs.map +1 -1
  96. package/dist/infra/utils/date.mjs.map +1 -1
  97. package/dist/middleware.mjs.map +1 -1
  98. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  99. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  100. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  101. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  102. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  104. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  105. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  106. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  107. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  108. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  109. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  110. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  111. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  112. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  113. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  114. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  115. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  116. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  117. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  118. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  119. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  120. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  121. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  122. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  123. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  124. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  125. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  126. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  127. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  128. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  129. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  130. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  131. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  132. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  133. package/dist/modules/cards/types.mjs.map +1 -1
  134. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  135. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  136. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  137. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  138. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  139. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  140. package/dist/modules/images/utils/base64.mjs.map +1 -1
  141. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  142. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  143. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  144. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  145. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  146. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  147. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  148. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  149. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  150. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  151. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  152. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  157. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  158. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  159. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  160. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  161. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  168. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  169. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  170. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  171. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  172. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  173. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  174. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  175. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  176. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  177. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  178. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  179. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  180. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  181. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  182. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  183. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  184. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  185. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  186. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  187. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  188. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  189. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  190. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  191. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  192. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  193. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  194. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  195. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  196. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  197. package/dist/providers/auth.provider.mjs.map +1 -1
  198. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  199. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  200. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  201. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  202. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  203. package/dist/utils/constants/br-states.mjs.map +1 -1
  204. package/dist/utils/countries.mjs.map +1 -1
  205. package/dist/utils/format/currency.mjs.map +1 -1
  206. package/dist/utils/safeServerAction.mjs.map +1 -1
  207. package/dist/utils/withAction.mjs.map +1 -1
  208. package/package.json +92 -92
  209. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  210. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  211. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  212. package/src/components/account/DeleteAccountModal.tsx +130 -130
  213. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  214. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  215. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  216. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  217. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  218. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  219. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  220. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  221. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  222. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  223. package/src/components/account/sections/SecuritySection.tsx +46 -46
  224. package/src/components/account/sections/TokenSection.tsx +73 -64
  225. package/src/components/embeds/ClarityEmbed.tsx +70 -0
  226. package/src/components/embeds/CrispEmbed.tsx +156 -156
  227. package/src/components/embeds/EmbedWidgets.tsx +52 -50
  228. package/src/components/embeds/FrillEmbed.tsx +129 -129
  229. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  230. package/src/components/layouts/AppNavBar.tsx +40 -40
  231. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  232. package/src/components/layouts/NavBar.tsx +175 -175
  233. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  234. package/src/components/layouts/ProfilePopover.tsx +176 -176
  235. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  236. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  237. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  238. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  239. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  240. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  241. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  242. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  243. package/src/components/navigation/NavItemsContext.ts +20 -20
  244. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  245. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  246. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  247. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  248. package/src/components/pages/NotFoundPage.tsx +67 -67
  249. package/src/components/pages/notifications/Notifications.tsx +187 -187
  250. package/src/components/ui/buttons/Button.tsx +62 -62
  251. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  252. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  253. package/src/components/ui/data-display/Accordion.tsx +81 -81
  254. package/src/components/ui/data-display/Badge.tsx +47 -47
  255. package/src/components/ui/data-display/Card.tsx +93 -93
  256. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  257. package/src/components/ui/data-display/CardItem.tsx +75 -75
  258. package/src/components/ui/data-display/Pagination.tsx +126 -126
  259. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  260. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  261. package/src/components/ui/data-display/Separator.tsx +29 -29
  262. package/src/components/ui/data-display/Table.tsx +117 -117
  263. package/src/components/ui/data-display/Tabs.tsx +67 -67
  264. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  265. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  266. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  267. package/src/components/ui/feedback/Progress.tsx +40 -40
  268. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  269. package/src/components/ui/feedback/Toast.tsx +104 -104
  270. package/src/components/ui/form/Calendar.tsx +228 -228
  271. package/src/components/ui/form/Checkbox.tsx +31 -31
  272. package/src/components/ui/form/ComboboxField.tsx +154 -154
  273. package/src/components/ui/form/DatePicker.tsx +97 -98
  274. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  275. package/src/components/ui/form/FormField.tsx +133 -133
  276. package/src/components/ui/form/Input.tsx +20 -20
  277. package/src/components/ui/form/InputOtp.tsx +80 -80
  278. package/src/components/ui/form/PhoneInput.tsx +208 -208
  279. package/src/components/ui/form/RadioGroup.tsx +45 -45
  280. package/src/components/ui/form/Select.tsx +200 -200
  281. package/src/components/ui/form/Switch.tsx +32 -32
  282. package/src/components/ui/form/Textarea.tsx +19 -19
  283. package/src/components/ui/overlay/Command.tsx +185 -185
  284. package/src/components/ui/overlay/Dialog.tsx +153 -153
  285. package/src/components/ui/overlay/Popover.tsx +49 -49
  286. package/src/components/ui/overlay/Sheet.tsx +170 -170
  287. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  288. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  289. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  290. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  291. package/src/components/widgets/ImageUpload/index.ts +3 -3
  292. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  293. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  294. package/src/hooks/useAuthQueryKey.ts +32 -32
  295. package/src/index.ts +507 -506
  296. package/src/infra/utils/array.ts +54 -54
  297. package/src/infra/utils/date.ts +18 -18
  298. package/src/middleware.ts +4 -4
  299. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  300. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  301. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  302. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  303. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  304. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  305. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  306. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  307. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  308. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  309. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  310. package/src/modules/accounts/services/account-token.service.ts +52 -52
  311. package/src/modules/accounts/services/account.service.ts +239 -239
  312. package/src/modules/accounts/types.ts +225 -225
  313. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  314. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  315. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  316. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  317. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  318. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  319. package/src/modules/auth/types/management-permission.type.ts +7 -7
  320. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  321. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  322. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  323. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  324. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  325. package/src/modules/cards/actions/create-card.action.ts +9 -9
  326. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  327. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  328. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  329. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  330. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  331. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  332. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  333. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  334. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  335. package/src/modules/cards/services/cards.service.ts +108 -108
  336. package/src/modules/cards/types.ts +42 -42
  337. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  338. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  339. package/src/modules/images/actions/process-image.action.ts +40 -40
  340. package/src/modules/images/constants/image.constants.ts +11 -11
  341. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  342. package/src/modules/images/services/image-processing.service.ts +75 -75
  343. package/src/modules/images/types/image.type.ts +54 -54
  344. package/src/modules/images/utils/base64.ts +26 -26
  345. package/src/modules/images/utils/compress-image.ts +20 -20
  346. package/src/modules/images/utils/crop-image.ts +51 -51
  347. package/src/modules/images/utils/validate-image.ts +71 -71
  348. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  349. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  350. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  351. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  352. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  353. package/src/modules/plans/services/plans.service.ts +133 -133
  354. package/src/modules/plans/types/plan.type.ts +67 -67
  355. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  356. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  357. package/src/modules/projects/actions/create-project.action.ts +9 -9
  358. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  359. package/src/modules/projects/actions/find-project.action.ts +8 -8
  360. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  361. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  362. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  363. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  364. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  365. package/src/modules/projects/actions/update-project.action.ts +9 -9
  366. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  367. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  368. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  369. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  370. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  371. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  372. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  373. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  374. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  375. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  376. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  377. package/src/modules/projects/services/projects.service.ts +144 -144
  378. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  379. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  380. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  381. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  382. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  383. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  384. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  385. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  386. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  387. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  388. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  389. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  390. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  391. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  392. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  393. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  394. package/src/modules/users/action/list-messages.action.ts +26 -26
  395. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  396. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  397. package/src/modules/users/hooks/messages.hook.ts +67 -67
  398. package/src/modules/users/services/messages.service.ts +49 -49
  399. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  400. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  401. package/src/modules/whitelabel/schema.ts +84 -84
  402. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  403. package/src/providers/auth.provider.tsx +162 -162
  404. package/src/providers/whitelabel.provider.tsx +59 -59
  405. package/src/store/useBuyCreditsModal.ts +21 -21
  406. package/src/store/useDesktopSidebarStore.ts +47 -47
  407. package/src/store/useMdSidebarStore.ts +34 -34
  408. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  409. package/src/utils/constants/br-states.ts +29 -29
  410. package/src/utils/countries.ts +224 -224
  411. package/src/utils/format/currency.ts +15 -15
  412. package/src/utils/safeServerAction.ts +21 -21
  413. 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
+ }