@greatapps/common 1.1.515 → 1.1.517

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