@greatapps/common 1.1.517 → 1.1.518

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