@greatapps/common 1.1.516 → 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 (407) 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.map +1 -1
  69. package/dist/components/ui/form/Input.mjs.map +1 -1
  70. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  71. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  72. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  73. package/dist/components/ui/form/Select.mjs +1 -1
  74. package/dist/components/ui/form/Select.mjs.map +1 -1
  75. package/dist/components/ui/form/Switch.mjs.map +1 -1
  76. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  77. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  78. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  79. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  80. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  82. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  83. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  84. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  85. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  86. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  87. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  88. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/infra/utils/array.mjs.map +1 -1
  91. package/dist/infra/utils/date.mjs.map +1 -1
  92. package/dist/middleware.mjs.map +1 -1
  93. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  94. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  95. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  96. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  97. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  98. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  99. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  100. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  101. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  104. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  105. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  106. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  107. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  108. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  109. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  110. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  111. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  112. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  113. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  114. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  115. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  116. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  117. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  118. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  119. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  120. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  121. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  122. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  123. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  124. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  125. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  126. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  127. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  128. package/dist/modules/cards/types.mjs.map +1 -1
  129. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  130. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  131. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  132. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  133. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  134. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  135. package/dist/modules/images/utils/base64.mjs.map +1 -1
  136. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  137. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  138. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  139. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  140. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  141. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  142. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  143. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  144. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  145. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  146. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  147. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  148. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  149. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  150. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  151. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  152. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  157. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  158. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  159. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  160. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  161. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  168. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  169. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  170. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  171. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  172. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  173. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  174. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  175. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  176. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  177. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  178. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  179. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  180. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  181. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  182. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  183. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  184. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  185. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  186. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  187. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  188. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  189. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  190. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  191. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  192. package/dist/providers/auth.provider.mjs.map +1 -1
  193. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  194. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  195. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  196. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  197. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  198. package/dist/utils/constants/br-states.mjs.map +1 -1
  199. package/dist/utils/countries.mjs.map +1 -1
  200. package/dist/utils/format/currency.mjs.map +1 -1
  201. package/dist/utils/safeServerAction.mjs.map +1 -1
  202. package/dist/utils/withAction.mjs.map +1 -1
  203. package/package.json +92 -92
  204. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  205. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  206. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  207. package/src/components/account/DeleteAccountModal.tsx +130 -130
  208. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  209. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  210. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  211. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  212. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  213. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  214. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  215. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  216. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  217. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  218. package/src/components/account/sections/SecuritySection.tsx +46 -46
  219. package/src/components/account/sections/TokenSection.tsx +64 -64
  220. package/src/components/embeds/CrispEmbed.tsx +156 -156
  221. package/src/components/embeds/EmbedWidgets.tsx +50 -50
  222. package/src/components/embeds/FrillEmbed.tsx +129 -129
  223. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  224. package/src/components/layouts/AppNavBar.tsx +40 -40
  225. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  226. package/src/components/layouts/NavBar.tsx +175 -175
  227. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  228. package/src/components/layouts/ProfilePopover.tsx +176 -176
  229. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  230. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  231. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  232. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  233. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  234. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  235. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  236. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  237. package/src/components/navigation/NavItemsContext.ts +20 -20
  238. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  239. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  240. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  241. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  242. package/src/components/pages/NotFoundPage.tsx +67 -67
  243. package/src/components/pages/notifications/Notifications.tsx +187 -187
  244. package/src/components/ui/buttons/Button.tsx +62 -62
  245. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  246. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  247. package/src/components/ui/data-display/Accordion.tsx +81 -81
  248. package/src/components/ui/data-display/Badge.tsx +47 -47
  249. package/src/components/ui/data-display/Card.tsx +93 -93
  250. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  251. package/src/components/ui/data-display/CardItem.tsx +75 -75
  252. package/src/components/ui/data-display/Pagination.tsx +126 -126
  253. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  254. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  255. package/src/components/ui/data-display/Separator.tsx +29 -29
  256. package/src/components/ui/data-display/Table.tsx +117 -117
  257. package/src/components/ui/data-display/Tabs.tsx +67 -67
  258. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  259. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  260. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  261. package/src/components/ui/feedback/Progress.tsx +40 -40
  262. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  263. package/src/components/ui/feedback/Toast.tsx +104 -104
  264. package/src/components/ui/form/Calendar.tsx +228 -228
  265. package/src/components/ui/form/Checkbox.tsx +31 -31
  266. package/src/components/ui/form/ComboboxField.tsx +154 -154
  267. package/src/components/ui/form/DatePicker.tsx +98 -97
  268. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  269. package/src/components/ui/form/FormField.tsx +133 -133
  270. package/src/components/ui/form/Input.tsx +20 -20
  271. package/src/components/ui/form/InputOtp.tsx +80 -80
  272. package/src/components/ui/form/PhoneInput.tsx +208 -208
  273. package/src/components/ui/form/RadioGroup.tsx +45 -45
  274. package/src/components/ui/form/Select.tsx +200 -200
  275. package/src/components/ui/form/Switch.tsx +32 -32
  276. package/src/components/ui/form/Textarea.tsx +19 -19
  277. package/src/components/ui/overlay/Command.tsx +185 -185
  278. package/src/components/ui/overlay/Dialog.tsx +153 -153
  279. package/src/components/ui/overlay/Popover.tsx +49 -49
  280. package/src/components/ui/overlay/Sheet.tsx +170 -170
  281. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  282. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  283. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  284. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  285. package/src/components/widgets/ImageUpload/index.ts +3 -3
  286. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  287. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  288. package/src/hooks/useAuthQueryKey.ts +32 -32
  289. package/src/index.ts +506 -506
  290. package/src/infra/utils/array.ts +54 -54
  291. package/src/infra/utils/date.ts +18 -18
  292. package/src/middleware.ts +4 -4
  293. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  294. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  295. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  296. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  297. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  298. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  299. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  300. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  301. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  302. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  303. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  304. package/src/modules/accounts/services/account-token.service.ts +52 -52
  305. package/src/modules/accounts/services/account.service.ts +239 -239
  306. package/src/modules/accounts/types.ts +225 -225
  307. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  308. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  309. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  310. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  311. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  312. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  313. package/src/modules/auth/types/management-permission.type.ts +7 -7
  314. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  315. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  316. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  317. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  318. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  319. package/src/modules/cards/actions/create-card.action.ts +9 -9
  320. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  321. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  322. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  323. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  324. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  325. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  326. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  327. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  328. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  329. package/src/modules/cards/services/cards.service.ts +108 -108
  330. package/src/modules/cards/types.ts +42 -42
  331. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  332. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  333. package/src/modules/images/actions/process-image.action.ts +40 -40
  334. package/src/modules/images/constants/image.constants.ts +11 -11
  335. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  336. package/src/modules/images/services/image-processing.service.ts +75 -75
  337. package/src/modules/images/types/image.type.ts +54 -54
  338. package/src/modules/images/utils/base64.ts +26 -26
  339. package/src/modules/images/utils/compress-image.ts +20 -20
  340. package/src/modules/images/utils/crop-image.ts +51 -51
  341. package/src/modules/images/utils/validate-image.ts +71 -71
  342. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  343. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  344. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  345. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  346. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  347. package/src/modules/plans/services/plans.service.ts +133 -133
  348. package/src/modules/plans/types/plan.type.ts +67 -67
  349. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  350. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  351. package/src/modules/projects/actions/create-project.action.ts +9 -9
  352. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  353. package/src/modules/projects/actions/find-project.action.ts +8 -8
  354. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  355. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  356. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  357. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  358. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  359. package/src/modules/projects/actions/update-project.action.ts +9 -9
  360. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  361. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  362. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  363. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  364. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  365. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  366. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  367. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  368. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  369. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  370. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  371. package/src/modules/projects/services/projects.service.ts +144 -144
  372. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  373. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  374. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  375. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  376. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  377. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  378. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  379. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  380. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  381. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  382. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  383. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  384. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  385. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  386. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  387. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  388. package/src/modules/users/action/list-messages.action.ts +26 -26
  389. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  390. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  391. package/src/modules/users/hooks/messages.hook.ts +67 -67
  392. package/src/modules/users/services/messages.service.ts +49 -49
  393. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  394. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  395. package/src/modules/whitelabel/schema.ts +84 -84
  396. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  397. package/src/providers/auth.provider.tsx +162 -162
  398. package/src/providers/whitelabel.provider.tsx +59 -59
  399. package/src/store/useBuyCreditsModal.ts +21 -21
  400. package/src/store/useDesktopSidebarStore.ts +47 -47
  401. package/src/store/useMdSidebarStore.ts +34 -34
  402. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  403. package/src/utils/constants/br-states.ts +29 -29
  404. package/src/utils/countries.ts +224 -224
  405. package/src/utils/format/currency.ts +15 -15
  406. package/src/utils/safeServerAction.ts +21 -21
  407. package/src/utils/withAction.ts +13 -13
@@ -1,108 +1,108 @@
1
- import 'server-only';
2
-
3
- import { api } from '../../../infra/api/client';
4
- import { ApiError, ApiActionResult, ApiPaginatedActionResult, PaginatedSuccessResult, SuccessResult } from '../../../infra/api/types';
5
- import { buildQueryParams } from '../../../infra/utils/params';
6
- import { getUserContext } from '../../auth/utils/get-user-context';
7
- import { Card, CardSchema, CreateCardRequest } from '../types';
8
-
9
- class CardsService {
10
- async listCards(): Promise<PaginatedSuccessResult<Card>> {
11
- const { id_account } = await getUserContext();
12
-
13
- const query = buildQueryParams({ id_account });
14
- const response = await api.apps.get<ApiPaginatedActionResult<Card>>(
15
- `/accounts/${id_account}/cards?${query}`
16
- );
17
-
18
- if (response.status === 0) {
19
- throw new ApiError(
20
- response.message || 'Erro ao listar cartões',
21
- 'LIST_CARDS_FAILED',
22
- 400
23
- );
24
- }
25
-
26
- const data = response.data.map((item) => CardSchema.parse(item));
27
-
28
- return { data, total: response.total, success: true };
29
- }
30
-
31
- async findCardById(id: number): Promise<SuccessResult<Card>> {
32
- const { id_account } = await getUserContext();
33
-
34
- const response = await api.apps.get<ApiPaginatedActionResult<Card>>(
35
- `/accounts/${id_account}/cards/${id}`
36
- );
37
-
38
- if (response.status === 0) {
39
- throw new ApiError(
40
- response.message || 'Erro ao buscar cartão',
41
- 'FIND_CARD_BY_ID_FAILED',
42
- 400
43
- );
44
- }
45
-
46
- if (!response.data?.length) {
47
- throw new ApiError('Cartão não encontrado', 'CARD_NOT_FOUND', 404);
48
- }
49
-
50
- const data = CardSchema.parse(response.data[0]);
51
-
52
- return { success: true, data };
53
- }
54
-
55
- async createCard(data: CreateCardRequest): Promise<SuccessResult<Card>> {
56
- const { id_account } = await getUserContext();
57
-
58
- const response = await api.apps.post<ApiPaginatedActionResult<Card>>(
59
- `/accounts/${id_account}/cards`,
60
- data
61
- );
62
-
63
- if (response.status === 0) {
64
- throw new ApiError(response.message || 'Erro ao criar cartão', 'CREATE_CARD_FAILED', 400);
65
- }
66
-
67
- const cardData = CardSchema.parse(response.data[0]);
68
-
69
- return { success: true, data: cardData };
70
- }
71
-
72
- async setDefaultCard(cardId: string): Promise<SuccessResult<Card>> {
73
- const { id_account } = await getUserContext();
74
-
75
- const response = await api.apps.put<ApiPaginatedActionResult<Card>>(
76
- `/accounts/${id_account}/cards/${cardId}`,
77
- { set_default: true }
78
- );
79
-
80
- if (response.status === 0) {
81
- throw new ApiError(
82
- response.message || 'Erro ao definir cartão padrão',
83
- 'SET_DEFAULT_CARD_FAILED',
84
- 400
85
- );
86
- }
87
-
88
- const data = CardSchema.parse(response.data[0]);
89
-
90
- return { success: true, data };
91
- }
92
-
93
- async deleteCard(id: string): Promise<SuccessResult<void>> {
94
- const { id_account } = await getUserContext();
95
-
96
- const response = await api.apps.delete<ApiActionResult<void>>(
97
- `/accounts/${id_account}/cards/${id}`
98
- );
99
-
100
- if (response.status === 0) {
101
- throw new ApiError(response.message || 'Erro ao excluir cartão', 'DELETE_CARD_FAILED', 400);
102
- }
103
-
104
- return { success: true };
105
- }
106
- }
107
-
108
- export const cardsService = new CardsService();
1
+ import 'server-only';
2
+
3
+ import { api } from '../../../infra/api/client';
4
+ import { ApiError, ApiActionResult, ApiPaginatedActionResult, PaginatedSuccessResult, SuccessResult } from '../../../infra/api/types';
5
+ import { buildQueryParams } from '../../../infra/utils/params';
6
+ import { getUserContext } from '../../auth/utils/get-user-context';
7
+ import { Card, CardSchema, CreateCardRequest } from '../types';
8
+
9
+ class CardsService {
10
+ async listCards(): Promise<PaginatedSuccessResult<Card>> {
11
+ const { id_account } = await getUserContext();
12
+
13
+ const query = buildQueryParams({ id_account });
14
+ const response = await api.apps.get<ApiPaginatedActionResult<Card>>(
15
+ `/accounts/${id_account}/cards?${query}`
16
+ );
17
+
18
+ if (response.status === 0) {
19
+ throw new ApiError(
20
+ response.message || 'Erro ao listar cartões',
21
+ 'LIST_CARDS_FAILED',
22
+ 400
23
+ );
24
+ }
25
+
26
+ const data = response.data.map((item) => CardSchema.parse(item));
27
+
28
+ return { data, total: response.total, success: true };
29
+ }
30
+
31
+ async findCardById(id: number): Promise<SuccessResult<Card>> {
32
+ const { id_account } = await getUserContext();
33
+
34
+ const response = await api.apps.get<ApiPaginatedActionResult<Card>>(
35
+ `/accounts/${id_account}/cards/${id}`
36
+ );
37
+
38
+ if (response.status === 0) {
39
+ throw new ApiError(
40
+ response.message || 'Erro ao buscar cartão',
41
+ 'FIND_CARD_BY_ID_FAILED',
42
+ 400
43
+ );
44
+ }
45
+
46
+ if (!response.data?.length) {
47
+ throw new ApiError('Cartão não encontrado', 'CARD_NOT_FOUND', 404);
48
+ }
49
+
50
+ const data = CardSchema.parse(response.data[0]);
51
+
52
+ return { success: true, data };
53
+ }
54
+
55
+ async createCard(data: CreateCardRequest): Promise<SuccessResult<Card>> {
56
+ const { id_account } = await getUserContext();
57
+
58
+ const response = await api.apps.post<ApiPaginatedActionResult<Card>>(
59
+ `/accounts/${id_account}/cards`,
60
+ data
61
+ );
62
+
63
+ if (response.status === 0) {
64
+ throw new ApiError(response.message || 'Erro ao criar cartão', 'CREATE_CARD_FAILED', 400);
65
+ }
66
+
67
+ const cardData = CardSchema.parse(response.data[0]);
68
+
69
+ return { success: true, data: cardData };
70
+ }
71
+
72
+ async setDefaultCard(cardId: string): Promise<SuccessResult<Card>> {
73
+ const { id_account } = await getUserContext();
74
+
75
+ const response = await api.apps.put<ApiPaginatedActionResult<Card>>(
76
+ `/accounts/${id_account}/cards/${cardId}`,
77
+ { set_default: true }
78
+ );
79
+
80
+ if (response.status === 0) {
81
+ throw new ApiError(
82
+ response.message || 'Erro ao definir cartão padrão',
83
+ 'SET_DEFAULT_CARD_FAILED',
84
+ 400
85
+ );
86
+ }
87
+
88
+ const data = CardSchema.parse(response.data[0]);
89
+
90
+ return { success: true, data };
91
+ }
92
+
93
+ async deleteCard(id: string): Promise<SuccessResult<void>> {
94
+ const { id_account } = await getUserContext();
95
+
96
+ const response = await api.apps.delete<ApiActionResult<void>>(
97
+ `/accounts/${id_account}/cards/${id}`
98
+ );
99
+
100
+ if (response.status === 0) {
101
+ throw new ApiError(response.message || 'Erro ao excluir cartão', 'DELETE_CARD_FAILED', 400);
102
+ }
103
+
104
+ return { success: true };
105
+ }
106
+ }
107
+
108
+ export const cardsService = new CardsService();
@@ -1,42 +1,42 @@
1
- import z from 'zod';
2
-
3
- export const CardSchema = z.object({
4
- id: z.union([z.number(), z.string()]),
5
- id_wl: z.number().optional(),
6
- id_account: z.union([z.number(), z.string()]).optional(),
7
- id_gateway: z.union([z.number(), z.string()]).optional(),
8
- gateway_account: z.string().optional(),
9
- gateway_card: z.string().optional(),
10
- brand: z.string(),
11
- name: z.string(),
12
- number: z.string().nullable(),
13
- date: z.string().nullable().optional(),
14
- deleted: z
15
- .number()
16
- .transform((val) => val === 1)
17
- .optional()
18
- .default(false),
19
- is_default: z.boolean().optional().default(false),
20
- datetime_add: z.union([z.date(), z.coerce.date()]).nullable().optional(),
21
- datetime_alt: z.union([z.date(), z.coerce.date()]).nullable().optional(),
22
- datetime_del: z.union([z.date(), z.coerce.date()]).nullable().optional(),
23
- });
24
-
25
- export type Card = z.infer<typeof CardSchema>;
26
-
27
- export const CreateCardRequestSchema = z.object({
28
- payment_method_id: z.string().min(1, 'payment_method_id é obrigatório'),
29
- set_default: z.boolean().optional(),
30
- });
31
-
32
- export type CreateCardRequest = z.infer<typeof CreateCardRequestSchema>;
33
-
34
- export const FindCardsParamsSchema = z.object({
35
- page: z.number().optional(),
36
- limit: z.number().optional(),
37
- search: z.string().optional(),
38
- sort: z.string().optional(),
39
- order: z.enum(['asc', 'desc']).optional(),
40
- });
41
-
42
- export type FindCardsParams = z.infer<typeof FindCardsParamsSchema>;
1
+ import z from 'zod';
2
+
3
+ export const CardSchema = z.object({
4
+ id: z.union([z.number(), z.string()]),
5
+ id_wl: z.number().optional(),
6
+ id_account: z.union([z.number(), z.string()]).optional(),
7
+ id_gateway: z.union([z.number(), z.string()]).optional(),
8
+ gateway_account: z.string().optional(),
9
+ gateway_card: z.string().optional(),
10
+ brand: z.string(),
11
+ name: z.string(),
12
+ number: z.string().nullable(),
13
+ date: z.string().nullable().optional(),
14
+ deleted: z
15
+ .number()
16
+ .transform((val) => val === 1)
17
+ .optional()
18
+ .default(false),
19
+ is_default: z.boolean().optional().default(false),
20
+ datetime_add: z.union([z.date(), z.coerce.date()]).nullable().optional(),
21
+ datetime_alt: z.union([z.date(), z.coerce.date()]).nullable().optional(),
22
+ datetime_del: z.union([z.date(), z.coerce.date()]).nullable().optional(),
23
+ });
24
+
25
+ export type Card = z.infer<typeof CardSchema>;
26
+
27
+ export const CreateCardRequestSchema = z.object({
28
+ payment_method_id: z.string().min(1, 'payment_method_id é obrigatório'),
29
+ set_default: z.boolean().optional(),
30
+ });
31
+
32
+ export type CreateCardRequest = z.infer<typeof CreateCardRequestSchema>;
33
+
34
+ export const FindCardsParamsSchema = z.object({
35
+ page: z.number().optional(),
36
+ limit: z.number().optional(),
37
+ search: z.string().optional(),
38
+ sort: z.string().optional(),
39
+ order: z.enum(['asc', 'desc']).optional(),
40
+ });
41
+
42
+ export type FindCardsParams = z.infer<typeof FindCardsParamsSchema>;
@@ -1,8 +1,8 @@
1
- 'use server';
2
-
3
- import { safeServerAction } from '../../../utils/safeServerAction';
4
- import { iaCreditsService } from '../services/ia-credits.service';
5
-
6
- export async function listIaCreditsAction(subscriptionId: number | string) {
7
- return safeServerAction(() => iaCreditsService.listOperations(subscriptionId));
8
- }
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { iaCreditsService } from '../services/ia-credits.service';
5
+
6
+ export async function listIaCreditsAction(subscriptionId: number | string) {
7
+ return safeServerAction(() => iaCreditsService.listOperations(subscriptionId));
8
+ }
@@ -1,99 +1,99 @@
1
- 'use client';
2
-
3
- import { useMemo } from 'react';
4
- import { useQuery } from '@tanstack/react-query';
5
- import { listIaCreditsAction } from '../actions/list-ia-credits.action';
6
- import type { IaCreditOperation, IaCreditsSummary } from '../types';
7
- import { useActiveSubscription } from '../../subscriptions/hooks/find-active-subscription.hook';
8
- import { withAction } from '../../../utils/withAction';
9
- import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
10
-
11
- function calculateSummary(operations: IaCreditOperation[]): IaCreditsSummary {
12
- const today = new Date();
13
- const todayDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
14
-
15
- const adds = operations.filter((op) => op.operation === 'add');
16
- const subtracts = operations.filter((op) => op.operation === 'subtract');
17
-
18
- let totalCredits = 0;
19
- let usedCredits = 0;
20
- let nextExpirationInDays: number | null = null;
21
- let nextExpiringCredits: number | null = null;
22
-
23
- for (const add of adds) {
24
- const expirationRaw = add.expiration_time;
25
- if (!expirationRaw) continue;
26
-
27
- const expiration = new Date(expirationRaw);
28
- const expirationDate = new Date(
29
- expiration.getFullYear(),
30
- expiration.getMonth(),
31
- expiration.getDate()
32
- );
33
-
34
- const expiredByDate = expirationDate.getTime() < todayDate.getTime();
35
- const hasExpired = add.has_expired || expiredByDate;
36
-
37
- if (hasExpired) continue;
38
-
39
- const addedCredits = add.operation_value;
40
-
41
- const consumedForAdd = subtracts
42
- .filter((sub) => String(sub.consumed_from_add_id) === String(add.id))
43
- .reduce((sum, sub) => sum + sub.operation_value, 0);
44
-
45
- const remainingForAdd = Math.max(0, addedCredits - consumedForAdd);
46
-
47
- totalCredits += addedCredits;
48
- usedCredits += consumedForAdd;
49
-
50
- const diffMs = expirationDate.getTime() - todayDate.getTime();
51
- const days = Math.max(0, Math.ceil(diffMs / (1000 * 60 * 60 * 24)));
52
-
53
- if (remainingForAdd > 0) {
54
- if (nextExpirationInDays === null || days < nextExpirationInDays) {
55
- nextExpirationInDays = days;
56
- nextExpiringCredits = remainingForAdd;
57
- }
58
- }
59
- }
60
-
61
- const availableCredits = Math.max(0, totalCredits - usedCredits);
62
-
63
- return {
64
- totalCredits,
65
- usedCredits,
66
- availableCredits,
67
- nextExpiringCredits,
68
- nextExpirationInDays,
69
- };
70
- }
71
-
72
- export function useIaCredits() {
73
- const { data: subscriptionData, isPending: isSubscriptionLoading } = useActiveSubscription();
74
- const subscription = subscriptionData?.data?.[0] ?? null;
75
- const subscriptionId = subscription?.id;
76
- const queryKey = useAuthQueryKey(['ia-credits', subscriptionId]);
77
-
78
- const query = useQuery({
79
- queryKey,
80
- queryFn: withAction(() => listIaCreditsAction(subscriptionId!)),
81
- enabled: subscriptionId != null,
82
- });
83
-
84
- const operations = query.data?.data ?? [];
85
-
86
- // eslint-disable-next-line react-hooks/exhaustive-deps
87
- const summary = useMemo(() => calculateSummary(operations), [operations]);
88
-
89
- return {
90
- subscription,
91
- operations,
92
- summary,
93
- isLoading: isSubscriptionLoading || query.isPending,
94
- isSubscriptionLoading,
95
- isCreditsLoading: query.isPending,
96
- isError: query.isError,
97
- error: query.error,
98
- };
99
- }
1
+ 'use client';
2
+
3
+ import { useMemo } from 'react';
4
+ import { useQuery } from '@tanstack/react-query';
5
+ import { listIaCreditsAction } from '../actions/list-ia-credits.action';
6
+ import type { IaCreditOperation, IaCreditsSummary } from '../types';
7
+ import { useActiveSubscription } from '../../subscriptions/hooks/find-active-subscription.hook';
8
+ import { withAction } from '../../../utils/withAction';
9
+ import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
10
+
11
+ function calculateSummary(operations: IaCreditOperation[]): IaCreditsSummary {
12
+ const today = new Date();
13
+ const todayDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
14
+
15
+ const adds = operations.filter((op) => op.operation === 'add');
16
+ const subtracts = operations.filter((op) => op.operation === 'subtract');
17
+
18
+ let totalCredits = 0;
19
+ let usedCredits = 0;
20
+ let nextExpirationInDays: number | null = null;
21
+ let nextExpiringCredits: number | null = null;
22
+
23
+ for (const add of adds) {
24
+ const expirationRaw = add.expiration_time;
25
+ if (!expirationRaw) continue;
26
+
27
+ const expiration = new Date(expirationRaw);
28
+ const expirationDate = new Date(
29
+ expiration.getFullYear(),
30
+ expiration.getMonth(),
31
+ expiration.getDate()
32
+ );
33
+
34
+ const expiredByDate = expirationDate.getTime() < todayDate.getTime();
35
+ const hasExpired = add.has_expired || expiredByDate;
36
+
37
+ if (hasExpired) continue;
38
+
39
+ const addedCredits = add.operation_value;
40
+
41
+ const consumedForAdd = subtracts
42
+ .filter((sub) => String(sub.consumed_from_add_id) === String(add.id))
43
+ .reduce((sum, sub) => sum + sub.operation_value, 0);
44
+
45
+ const remainingForAdd = Math.max(0, addedCredits - consumedForAdd);
46
+
47
+ totalCredits += addedCredits;
48
+ usedCredits += consumedForAdd;
49
+
50
+ const diffMs = expirationDate.getTime() - todayDate.getTime();
51
+ const days = Math.max(0, Math.ceil(diffMs / (1000 * 60 * 60 * 24)));
52
+
53
+ if (remainingForAdd > 0) {
54
+ if (nextExpirationInDays === null || days < nextExpirationInDays) {
55
+ nextExpirationInDays = days;
56
+ nextExpiringCredits = remainingForAdd;
57
+ }
58
+ }
59
+ }
60
+
61
+ const availableCredits = Math.max(0, totalCredits - usedCredits);
62
+
63
+ return {
64
+ totalCredits,
65
+ usedCredits,
66
+ availableCredits,
67
+ nextExpiringCredits,
68
+ nextExpirationInDays,
69
+ };
70
+ }
71
+
72
+ export function useIaCredits() {
73
+ const { data: subscriptionData, isPending: isSubscriptionLoading } = useActiveSubscription();
74
+ const subscription = subscriptionData?.data?.[0] ?? null;
75
+ const subscriptionId = subscription?.id;
76
+ const queryKey = useAuthQueryKey(['ia-credits', subscriptionId]);
77
+
78
+ const query = useQuery({
79
+ queryKey,
80
+ queryFn: withAction(() => listIaCreditsAction(subscriptionId!)),
81
+ enabled: subscriptionId != null,
82
+ });
83
+
84
+ const operations = query.data?.data ?? [];
85
+
86
+ // eslint-disable-next-line react-hooks/exhaustive-deps
87
+ const summary = useMemo(() => calculateSummary(operations), [operations]);
88
+
89
+ return {
90
+ subscription,
91
+ operations,
92
+ summary,
93
+ isLoading: isSubscriptionLoading || query.isPending,
94
+ isSubscriptionLoading,
95
+ isCreditsLoading: query.isPending,
96
+ isError: query.isError,
97
+ error: query.error,
98
+ };
99
+ }
@@ -1,40 +1,40 @@
1
- 'use server'
2
-
3
- import type {
4
- ProcessImageActionInput,
5
- ProcessImageActionOutput,
6
- } from '../types/image.type'
7
-
8
- export async function processImageAction(
9
- input: ProcessImageActionInput
10
- ): Promise<ProcessImageActionOutput> {
11
- try {
12
- // Import dinâmico para evitar erro de fs.createReadStream no edge runtime
13
- const { processImage } = await import('../services/image-processing.service')
14
-
15
- const base64Data = input.base64Image.replace(/^data:image\/\w+;base64,/, '')
16
- const binaryString = atob(base64Data)
17
- const bytes = new Uint8Array(binaryString.length)
18
- for (let i = 0; i < binaryString.length; i++) {
19
- bytes[i] = binaryString.charCodeAt(i)
20
- }
21
-
22
- const result = await processImage({
23
- imageBytes: bytes,
24
- targetWidth: input.targetWidth,
25
- targetHeight: input.targetHeight,
26
- })
27
-
28
- const base64Output = btoa(String.fromCharCode(...result.bytes))
29
-
30
- return {
31
- success: true,
32
- base64Image: `data:${result.format};base64,${base64Output}`,
33
- }
34
- } catch (error) {
35
- return {
36
- success: false,
37
- error: error instanceof Error ? error.message : 'Erro ao processar imagem',
38
- }
39
- }
40
- }
1
+ 'use server'
2
+
3
+ import type {
4
+ ProcessImageActionInput,
5
+ ProcessImageActionOutput,
6
+ } from '../types/image.type'
7
+
8
+ export async function processImageAction(
9
+ input: ProcessImageActionInput
10
+ ): Promise<ProcessImageActionOutput> {
11
+ try {
12
+ // Import dinâmico para evitar erro de fs.createReadStream no edge runtime
13
+ const { processImage } = await import('../services/image-processing.service')
14
+
15
+ const base64Data = input.base64Image.replace(/^data:image\/\w+;base64,/, '')
16
+ const binaryString = atob(base64Data)
17
+ const bytes = new Uint8Array(binaryString.length)
18
+ for (let i = 0; i < binaryString.length; i++) {
19
+ bytes[i] = binaryString.charCodeAt(i)
20
+ }
21
+
22
+ const result = await processImage({
23
+ imageBytes: bytes,
24
+ targetWidth: input.targetWidth,
25
+ targetHeight: input.targetHeight,
26
+ })
27
+
28
+ const base64Output = btoa(String.fromCharCode(...result.bytes))
29
+
30
+ return {
31
+ success: true,
32
+ base64Image: `data:${result.format};base64,${base64Output}`,
33
+ }
34
+ } catch (error) {
35
+ return {
36
+ success: false,
37
+ error: error instanceof Error ? error.message : 'Erro ao processar imagem',
38
+ }
39
+ }
40
+ }
@@ -1,11 +1,11 @@
1
- export const ACCEPTED_IMAGE_FORMATS = [
2
- 'image/png',
3
- 'image/jpeg',
4
- 'image/webp',
5
- 'image/gif',
6
- ] as const
7
-
8
- /** String para usar no atributo accept de inputs de arquivo */
9
- export const ACCEPTED_IMAGE_FORMATS_STRING = ACCEPTED_IMAGE_FORMATS.join(',')
10
-
11
- export const MAX_FILE_SIZE_MB = 100
1
+ export const ACCEPTED_IMAGE_FORMATS = [
2
+ 'image/png',
3
+ 'image/jpeg',
4
+ 'image/webp',
5
+ 'image/gif',
6
+ ] as const
7
+
8
+ /** String para usar no atributo accept de inputs de arquivo */
9
+ export const ACCEPTED_IMAGE_FORMATS_STRING = ACCEPTED_IMAGE_FORMATS.join(',')
10
+
11
+ export const MAX_FILE_SIZE_MB = 100