@greatapps/common 1.1.517 → 1.1.519

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/account/sections/TokenSection.mjs +7 -1
  18. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  19. package/dist/components/embeds/ClarityEmbed.mjs +55 -0
  20. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -0
  21. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  22. package/dist/components/embeds/EmbedWidgets.mjs +3 -1
  23. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  24. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  25. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  26. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  27. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  28. package/dist/components/layouts/NavBar.mjs.map +1 -1
  29. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  30. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  31. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  32. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  33. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  34. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  35. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  36. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  37. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  38. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  39. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  40. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  41. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  42. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  43. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  44. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  45. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  46. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  47. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  48. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  51. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  52. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  53. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  54. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  55. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  56. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  60. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  61. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  62. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  63. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  64. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  65. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  66. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  67. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  68. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  69. package/dist/components/ui/form/DatePicker.mjs +2 -2
  70. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  71. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  72. package/dist/components/ui/form/FormField.mjs.map +1 -1
  73. package/dist/components/ui/form/Input.mjs.map +1 -1
  74. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  75. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  76. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  77. package/dist/components/ui/form/Select.mjs +1 -1
  78. package/dist/components/ui/form/Select.mjs.map +1 -1
  79. package/dist/components/ui/form/Switch.mjs.map +1 -1
  80. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  83. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  84. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  85. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  86. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  87. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  88. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  89. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  90. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  91. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  92. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  93. package/dist/index.mjs +2 -0
  94. package/dist/index.mjs.map +1 -1
  95. package/dist/infra/utils/array.mjs.map +1 -1
  96. package/dist/infra/utils/date.mjs.map +1 -1
  97. package/dist/middleware.mjs.map +1 -1
  98. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  99. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  100. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  101. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  102. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  104. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  105. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  106. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  107. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  108. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  109. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  110. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  111. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  112. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  113. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  114. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  115. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  116. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  117. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  118. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  119. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  120. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  121. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  122. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  123. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  124. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  125. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  126. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  127. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  128. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  129. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  130. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  131. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  132. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  133. package/dist/modules/cards/types.mjs.map +1 -1
  134. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  135. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  136. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  137. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  138. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  139. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  140. package/dist/modules/images/utils/base64.mjs.map +1 -1
  141. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  142. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  143. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  144. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  145. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  146. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  147. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  148. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  149. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  150. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  151. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  152. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  157. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  158. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  159. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  160. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  161. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  168. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  169. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  170. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  171. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  172. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  173. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  174. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  175. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  176. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  177. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  178. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  179. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  180. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  181. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  182. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  183. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  184. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  185. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  186. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  187. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  188. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  189. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  190. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  191. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  192. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  193. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  194. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  195. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  196. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  197. package/dist/providers/auth.provider.mjs.map +1 -1
  198. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  199. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  200. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  201. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  202. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  203. package/dist/utils/constants/br-states.mjs.map +1 -1
  204. package/dist/utils/countries.mjs.map +1 -1
  205. package/dist/utils/format/currency.mjs.map +1 -1
  206. package/dist/utils/safeServerAction.mjs.map +1 -1
  207. package/dist/utils/withAction.mjs.map +1 -1
  208. package/package.json +92 -92
  209. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  210. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  211. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  212. package/src/components/account/DeleteAccountModal.tsx +130 -130
  213. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  214. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  215. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  216. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  217. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  218. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  219. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  220. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  221. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  222. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  223. package/src/components/account/sections/SecuritySection.tsx +46 -46
  224. package/src/components/account/sections/TokenSection.tsx +73 -64
  225. package/src/components/embeds/ClarityEmbed.tsx +70 -0
  226. package/src/components/embeds/CrispEmbed.tsx +156 -156
  227. package/src/components/embeds/EmbedWidgets.tsx +52 -50
  228. package/src/components/embeds/FrillEmbed.tsx +129 -129
  229. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  230. package/src/components/layouts/AppNavBar.tsx +40 -40
  231. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  232. package/src/components/layouts/NavBar.tsx +175 -175
  233. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  234. package/src/components/layouts/ProfilePopover.tsx +176 -176
  235. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  236. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  237. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  238. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  239. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  240. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  241. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  242. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  243. package/src/components/navigation/NavItemsContext.ts +20 -20
  244. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  245. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  246. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  247. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  248. package/src/components/pages/NotFoundPage.tsx +67 -67
  249. package/src/components/pages/notifications/Notifications.tsx +187 -187
  250. package/src/components/ui/buttons/Button.tsx +62 -62
  251. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  252. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  253. package/src/components/ui/data-display/Accordion.tsx +81 -81
  254. package/src/components/ui/data-display/Badge.tsx +47 -47
  255. package/src/components/ui/data-display/Card.tsx +93 -93
  256. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  257. package/src/components/ui/data-display/CardItem.tsx +75 -75
  258. package/src/components/ui/data-display/Pagination.tsx +126 -126
  259. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  260. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  261. package/src/components/ui/data-display/Separator.tsx +29 -29
  262. package/src/components/ui/data-display/Table.tsx +117 -117
  263. package/src/components/ui/data-display/Tabs.tsx +67 -67
  264. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  265. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  266. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  267. package/src/components/ui/feedback/Progress.tsx +40 -40
  268. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  269. package/src/components/ui/feedback/Toast.tsx +104 -104
  270. package/src/components/ui/form/Calendar.tsx +228 -228
  271. package/src/components/ui/form/Checkbox.tsx +31 -31
  272. package/src/components/ui/form/ComboboxField.tsx +154 -154
  273. package/src/components/ui/form/DatePicker.tsx +97 -98
  274. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  275. package/src/components/ui/form/FormField.tsx +133 -133
  276. package/src/components/ui/form/Input.tsx +20 -20
  277. package/src/components/ui/form/InputOtp.tsx +80 -80
  278. package/src/components/ui/form/PhoneInput.tsx +208 -208
  279. package/src/components/ui/form/RadioGroup.tsx +45 -45
  280. package/src/components/ui/form/Select.tsx +200 -200
  281. package/src/components/ui/form/Switch.tsx +32 -32
  282. package/src/components/ui/form/Textarea.tsx +19 -19
  283. package/src/components/ui/overlay/Command.tsx +185 -185
  284. package/src/components/ui/overlay/Dialog.tsx +153 -153
  285. package/src/components/ui/overlay/Popover.tsx +49 -49
  286. package/src/components/ui/overlay/Sheet.tsx +170 -170
  287. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  288. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  289. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  290. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  291. package/src/components/widgets/ImageUpload/index.ts +3 -3
  292. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  293. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  294. package/src/hooks/useAuthQueryKey.ts +32 -32
  295. package/src/index.ts +507 -506
  296. package/src/infra/utils/array.ts +54 -54
  297. package/src/infra/utils/date.ts +18 -18
  298. package/src/middleware.ts +4 -4
  299. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  300. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  301. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  302. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  303. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  304. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  305. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  306. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  307. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  308. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  309. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  310. package/src/modules/accounts/services/account-token.service.ts +52 -52
  311. package/src/modules/accounts/services/account.service.ts +239 -239
  312. package/src/modules/accounts/types.ts +225 -225
  313. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  314. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  315. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  316. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  317. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  318. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  319. package/src/modules/auth/types/management-permission.type.ts +7 -7
  320. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  321. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  322. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  323. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  324. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  325. package/src/modules/cards/actions/create-card.action.ts +9 -9
  326. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  327. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  328. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  329. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  330. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  331. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  332. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  333. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  334. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  335. package/src/modules/cards/services/cards.service.ts +108 -108
  336. package/src/modules/cards/types.ts +42 -42
  337. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  338. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  339. package/src/modules/images/actions/process-image.action.ts +40 -40
  340. package/src/modules/images/constants/image.constants.ts +11 -11
  341. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  342. package/src/modules/images/services/image-processing.service.ts +75 -75
  343. package/src/modules/images/types/image.type.ts +54 -54
  344. package/src/modules/images/utils/base64.ts +26 -26
  345. package/src/modules/images/utils/compress-image.ts +20 -20
  346. package/src/modules/images/utils/crop-image.ts +51 -51
  347. package/src/modules/images/utils/validate-image.ts +71 -71
  348. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  349. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  350. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  351. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  352. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  353. package/src/modules/plans/services/plans.service.ts +133 -133
  354. package/src/modules/plans/types/plan.type.ts +67 -67
  355. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  356. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  357. package/src/modules/projects/actions/create-project.action.ts +9 -9
  358. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  359. package/src/modules/projects/actions/find-project.action.ts +8 -8
  360. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  361. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  362. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  363. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  364. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  365. package/src/modules/projects/actions/update-project.action.ts +9 -9
  366. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  367. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  368. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  369. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  370. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  371. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  372. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  373. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  374. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  375. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  376. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  377. package/src/modules/projects/services/projects.service.ts +144 -144
  378. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  379. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  380. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  381. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  382. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  383. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  384. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  385. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  386. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  387. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  388. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  389. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  390. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  391. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  392. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  393. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  394. package/src/modules/users/action/list-messages.action.ts +26 -26
  395. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  396. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  397. package/src/modules/users/hooks/messages.hook.ts +67 -67
  398. package/src/modules/users/services/messages.service.ts +49 -49
  399. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  400. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  401. package/src/modules/whitelabel/schema.ts +84 -84
  402. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  403. package/src/providers/auth.provider.tsx +162 -162
  404. package/src/providers/whitelabel.provider.tsx +59 -59
  405. package/src/store/useBuyCreditsModal.ts +21 -21
  406. package/src/store/useDesktopSidebarStore.ts +47 -47
  407. package/src/store/useMdSidebarStore.ts +34 -34
  408. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  409. package/src/utils/constants/br-states.ts +29 -29
  410. package/src/utils/countries.ts +224 -224
  411. package/src/utils/format/currency.ts +15 -15
  412. package/src/utils/safeServerAction.ts +21 -21
  413. package/src/utils/withAction.ts +13 -13
@@ -1,133 +1,133 @@
1
- import "server-only";
2
-
3
- import { api, apiClient, getUserContext } from "@greatapps/common/server";
4
- import { ApiError, buildQueryParams, PlanSchema } from "@greatapps/common";
5
- import type {
6
- ApiPaginatedActionResult,
7
- PaginatedSuccessResult,
8
- Plan,
9
- SuccessResult,
10
- } from "@greatapps/common";
11
- import greatCache from "@greatapps/cache";
12
-
13
- export type ListPlansParams = {
14
- sort?: string;
15
- active?: boolean;
16
- search?: string;
17
- };
18
-
19
- const PLANS_CACHE_TTL = 604800;
20
-
21
- class PlansService {
22
- private cache = new greatCache({
23
- service: "plans",
24
- version: "1.0.2",
25
- domain: "whitelabel-cache.greatapps.com.br",
26
- ambient: process.env.NODE_ENV || "development",
27
- });
28
-
29
- private buildCacheKey(key: string, params?: Record<string, unknown>): string {
30
- const sort = params?.sort ?? "id:ASC";
31
- const active = params?.active ?? "";
32
- const search = params?.search ?? "";
33
- return `${key}-${sort}-${active}-${search}-v2`;
34
- }
35
-
36
- /**
37
- * Lista planos do whitelabel.
38
- * Exemplo:
39
- * GET /{id_wl}/plans?active=true&search=client&sort=id:ASC
40
- */
41
- async listPlans(
42
- params?: ListPlansParams,
43
- ): Promise<PaginatedSuccessResult<Plan>> {
44
- const { id_wl, id_account } = await getUserContext();
45
- const cacheKey = this.buildCacheKey("plans", {
46
- ...params,
47
- id_wl,
48
- id_account,
49
- });
50
-
51
- const cachedData = await this.cache.select(cacheKey);
52
-
53
- if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
54
- const data = JSON.parse(cachedData.data) as Plan[];
55
- return { data, total: data.length, success: true };
56
- }
57
-
58
- const query = buildQueryParams({
59
- sort: params?.sort ?? "id:ASC",
60
- active: params?.active,
61
- search: params?.search,
62
- id_account: id_account,
63
- });
64
- const url = `/plans${query ? `?${query}` : ""}`;
65
-
66
- const response = await api.apps.get<ApiPaginatedActionResult<Plan[]>>(url);
67
-
68
- if (response.status === 0) {
69
- throw new ApiError(
70
- (response as { message?: string }).message || "Erro ao listar planos",
71
- "LIST_PLANS_FAILED",
72
- 400,
73
- );
74
- }
75
-
76
- const rawData = (response as { data?: unknown }).data;
77
- const data = Array.isArray(rawData)
78
- ? rawData.map((item) => PlanSchema.parse(item))
79
- : [];
80
-
81
- await this.cache.insert(cacheKey, JSON.stringify(data), PLANS_CACHE_TTL);
82
-
83
- return {
84
- data,
85
- total: response.total,
86
- success: true,
87
- } satisfies PaginatedSuccessResult<Plan>;
88
- }
89
-
90
- async findById(idPlan: number | string): Promise<SuccessResult<Plan>> {
91
- const { id_wl, id_account } = await getUserContext();
92
- const cacheKey = this.buildCacheKey(`plan-${idPlan}`, {
93
- id_wl,
94
- id_account: String(id_account),
95
- });
96
-
97
- const cachedData = await this.cache.select(cacheKey);
98
-
99
- if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
100
- const data = JSON.parse(cachedData.data) as Plan;
101
- return { data, success: true };
102
- }
103
-
104
- const query = buildQueryParams({ type: "client", id_account });
105
-
106
- const response = await api.apps.get<ApiPaginatedActionResult<Plan>>(
107
- `/plans/${idPlan}?${query}`,
108
- );
109
-
110
- if (response.status === 0) {
111
- throw new ApiError(
112
- response.message || "Erro ao buscar plano",
113
- "FIND_PLAN_FAILED",
114
- 400,
115
- );
116
- }
117
-
118
- if (!response.data?.length) {
119
- throw new ApiError("Plano não encontrado", "PLAN_NOT_FOUND", 404);
120
- }
121
-
122
- const plan = PlanSchema.parse(response.data[0]);
123
-
124
- await this.cache.insert(cacheKey, JSON.stringify(plan), PLANS_CACHE_TTL);
125
-
126
- return {
127
- success: true,
128
- data: plan,
129
- };
130
- }
131
- }
132
-
133
- export const plansService = new PlansService();
1
+ import "server-only";
2
+
3
+ import { api, apiClient, getUserContext } from "@greatapps/common/server";
4
+ import { ApiError, buildQueryParams, PlanSchema } from "@greatapps/common";
5
+ import type {
6
+ ApiPaginatedActionResult,
7
+ PaginatedSuccessResult,
8
+ Plan,
9
+ SuccessResult,
10
+ } from "@greatapps/common";
11
+ import greatCache from "@greatapps/cache";
12
+
13
+ export type ListPlansParams = {
14
+ sort?: string;
15
+ active?: boolean;
16
+ search?: string;
17
+ };
18
+
19
+ const PLANS_CACHE_TTL = 604800;
20
+
21
+ class PlansService {
22
+ private cache = new greatCache({
23
+ service: "plans",
24
+ version: "1.0.2",
25
+ domain: "whitelabel-cache.greatapps.com.br",
26
+ ambient: process.env.NODE_ENV || "development",
27
+ });
28
+
29
+ private buildCacheKey(key: string, params?: Record<string, unknown>): string {
30
+ const sort = params?.sort ?? "id:ASC";
31
+ const active = params?.active ?? "";
32
+ const search = params?.search ?? "";
33
+ return `${key}-${sort}-${active}-${search}-v2`;
34
+ }
35
+
36
+ /**
37
+ * Lista planos do whitelabel.
38
+ * Exemplo:
39
+ * GET /{id_wl}/plans?active=true&search=client&sort=id:ASC
40
+ */
41
+ async listPlans(
42
+ params?: ListPlansParams,
43
+ ): Promise<PaginatedSuccessResult<Plan>> {
44
+ const { id_wl, id_account } = await getUserContext();
45
+ const cacheKey = this.buildCacheKey("plans", {
46
+ ...params,
47
+ id_wl,
48
+ id_account,
49
+ });
50
+
51
+ const cachedData = await this.cache.select(cacheKey);
52
+
53
+ if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
54
+ const data = JSON.parse(cachedData.data) as Plan[];
55
+ return { data, total: data.length, success: true };
56
+ }
57
+
58
+ const query = buildQueryParams({
59
+ sort: params?.sort ?? "id:ASC",
60
+ active: params?.active,
61
+ search: params?.search,
62
+ id_account: id_account,
63
+ });
64
+ const url = `/plans${query ? `?${query}` : ""}`;
65
+
66
+ const response = await api.apps.get<ApiPaginatedActionResult<Plan[]>>(url);
67
+
68
+ if (response.status === 0) {
69
+ throw new ApiError(
70
+ (response as { message?: string }).message || "Erro ao listar planos",
71
+ "LIST_PLANS_FAILED",
72
+ 400,
73
+ );
74
+ }
75
+
76
+ const rawData = (response as { data?: unknown }).data;
77
+ const data = Array.isArray(rawData)
78
+ ? rawData.map((item) => PlanSchema.parse(item))
79
+ : [];
80
+
81
+ await this.cache.insert(cacheKey, JSON.stringify(data), PLANS_CACHE_TTL);
82
+
83
+ return {
84
+ data,
85
+ total: response.total,
86
+ success: true,
87
+ } satisfies PaginatedSuccessResult<Plan>;
88
+ }
89
+
90
+ async findById(idPlan: number | string): Promise<SuccessResult<Plan>> {
91
+ const { id_wl, id_account } = await getUserContext();
92
+ const cacheKey = this.buildCacheKey(`plan-${idPlan}`, {
93
+ id_wl,
94
+ id_account: String(id_account),
95
+ });
96
+
97
+ const cachedData = await this.cache.select(cacheKey);
98
+
99
+ if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
100
+ const data = JSON.parse(cachedData.data) as Plan;
101
+ return { data, success: true };
102
+ }
103
+
104
+ const query = buildQueryParams({ type: "client", id_account });
105
+
106
+ const response = await api.apps.get<ApiPaginatedActionResult<Plan>>(
107
+ `/plans/${idPlan}?${query}`,
108
+ );
109
+
110
+ if (response.status === 0) {
111
+ throw new ApiError(
112
+ response.message || "Erro ao buscar plano",
113
+ "FIND_PLAN_FAILED",
114
+ 400,
115
+ );
116
+ }
117
+
118
+ if (!response.data?.length) {
119
+ throw new ApiError("Plano não encontrado", "PLAN_NOT_FOUND", 404);
120
+ }
121
+
122
+ const plan = PlanSchema.parse(response.data[0]);
123
+
124
+ await this.cache.insert(cacheKey, JSON.stringify(plan), PLANS_CACHE_TTL);
125
+
126
+ return {
127
+ success: true,
128
+ data: plan,
129
+ };
130
+ }
131
+ }
132
+
133
+ export const plansService = new PlansService();
@@ -1,67 +1,67 @@
1
- import z from 'zod';
2
- import type { BillingPeriod } from '../../subscriptions/types/billing-period.type';
3
-
4
- export const PlanItemSchema = z.object({
5
- id_addon: z.number(),
6
- quantity: z.number(),
7
- value: z.number(),
8
- });
9
-
10
- export type PlanItem = z.infer<typeof PlanItemSchema>;
11
-
12
- export const PlanSchema = z.object({
13
- id: z.number(),
14
- id_plan: z.number().optional(),
15
- name: z.string(),
16
- value: z.number().default(0),
17
- type: z.string().optional(),
18
- discount_semester: z.number().default(0),
19
- discount_annual: z.number().default(0),
20
- items: z.array(PlanItemSchema).optional().default([]),
21
- });
22
-
23
- export type Plan = z.infer<typeof PlanSchema>;
24
-
25
- // ── UI Plan types (used by list-plans action and consumers) ──
26
-
27
- export type PlanFeature = {
28
- icon: 'check' | 'x';
29
- text: string;
30
- disabled?: boolean;
31
- tooltip?: keyof PlanTooltips;
32
- };
33
-
34
- export type PlanMainFeatures = {
35
- pages: string;
36
- domains: string;
37
- users: string;
38
- };
39
-
40
- /** Preços mensais equivalentes por período de cobrança (já com desconto aplicado). */
41
- export type PlanPricingByPeriod = {
42
- monthly: number;
43
- semiannual: number;
44
- annual: number;
45
- };
46
-
47
- export type UiPlan = {
48
- planId: number;
49
- name: string;
50
- isPopular?: boolean;
51
- isCurrentPlan?: boolean;
52
- currentPeriodicity?: BillingPeriod | null;
53
- mainFeatures: PlanMainFeatures;
54
- features: PlanFeature[];
55
- originalPrice: string;
56
- price: string;
57
- pricingByPeriod?: PlanPricingByPeriod;
58
- buttonVariant?: 'brand' | 'default';
59
- items: PlanItem[];
60
- };
61
-
62
- export type PlanTooltips = {
63
- domains: string;
64
- users: string;
65
- sharePages: string;
66
- projectManagement: string;
67
- };
1
+ import z from 'zod';
2
+ import type { BillingPeriod } from '../../subscriptions/types/billing-period.type';
3
+
4
+ export const PlanItemSchema = z.object({
5
+ id_addon: z.number(),
6
+ quantity: z.number(),
7
+ value: z.number(),
8
+ });
9
+
10
+ export type PlanItem = z.infer<typeof PlanItemSchema>;
11
+
12
+ export const PlanSchema = z.object({
13
+ id: z.number(),
14
+ id_plan: z.number().optional(),
15
+ name: z.string(),
16
+ value: z.number().default(0),
17
+ type: z.string().optional(),
18
+ discount_semester: z.number().default(0),
19
+ discount_annual: z.number().default(0),
20
+ items: z.array(PlanItemSchema).optional().default([]),
21
+ });
22
+
23
+ export type Plan = z.infer<typeof PlanSchema>;
24
+
25
+ // ── UI Plan types (used by list-plans action and consumers) ──
26
+
27
+ export type PlanFeature = {
28
+ icon: 'check' | 'x';
29
+ text: string;
30
+ disabled?: boolean;
31
+ tooltip?: keyof PlanTooltips;
32
+ };
33
+
34
+ export type PlanMainFeatures = {
35
+ pages: string;
36
+ domains: string;
37
+ users: string;
38
+ };
39
+
40
+ /** Preços mensais equivalentes por período de cobrança (já com desconto aplicado). */
41
+ export type PlanPricingByPeriod = {
42
+ monthly: number;
43
+ semiannual: number;
44
+ annual: number;
45
+ };
46
+
47
+ export type UiPlan = {
48
+ planId: number;
49
+ name: string;
50
+ isPopular?: boolean;
51
+ isCurrentPlan?: boolean;
52
+ currentPeriodicity?: BillingPeriod | null;
53
+ mainFeatures: PlanMainFeatures;
54
+ features: PlanFeature[];
55
+ originalPrice: string;
56
+ price: string;
57
+ pricingByPeriod?: PlanPricingByPeriod;
58
+ buttonVariant?: 'brand' | 'default';
59
+ items: PlanItem[];
60
+ };
61
+
62
+ export type PlanTooltips = {
63
+ domains: string;
64
+ users: string;
65
+ sharePages: string;
66
+ projectManagement: string;
67
+ };
@@ -1,98 +1,98 @@
1
- import type {
2
- Plan,
3
- PlanFeature,
4
- PlanMainFeatures,
5
- PlanPricingByPeriod,
6
- UiPlan,
7
- } from "../types/plan.type";
8
- import { ADDON_IDS } from "../../subscriptions/constants/addons.constants";
9
- import { formatCurrencyNumber } from "../../../utils/format/currency";
10
-
11
- export type PlanBillingPeriod = "monthly" | "semiannual" | "annual";
12
-
13
- const BASE_FEATURES: PlanFeature[] = [
14
- { icon: "check", text: "Visitas ilimitadas" },
15
- { icon: "check", text: "Leads ilimitadas" },
16
- { icon: "check", text: "Compartilhar páginas", tooltip: "sharePages" },
17
- { icon: "check", text: "Hospedagem inclusa" },
18
- { icon: "check", text: "SSL (HTTPS) + CDN" },
19
- { icon: "check", text: "Templates Free" },
20
- ];
21
-
22
- function buildMainFeaturesFromItems(items: Plan["items"]): PlanMainFeatures {
23
- const pagesItem = items.find((i) => i.id_addon === ADDON_IDS.PAGES);
24
- const domainsItem = items.find((i) => i.id_addon === ADDON_IDS.DOMAINS);
25
-
26
- const pagesQty = pagesItem?.quantity ?? 0;
27
- const domainsQty = domainsItem?.quantity ?? 1;
28
-
29
- return {
30
- pages:
31
- pagesQty === 0
32
- ? "Páginas ilimitadas"
33
- : pagesQty === 1
34
- ? "1 página"
35
- : `${pagesQty} páginas`,
36
- domains:
37
- domainsQty >= 999
38
- ? "Domínios ilimitados"
39
- : domainsQty === 1
40
- ? "1 domínio externo"
41
- : `${domainsQty} domínios externos`,
42
- users: "Usuários ilimitados",
43
- };
44
- }
45
-
46
- function computePricingByPeriod(apiPlan: Plan): PlanPricingByPeriod {
47
- const monthly = apiPlan.value;
48
- const round2 = (n: number) => Math.round(n * 100) / 100;
49
- return {
50
- monthly,
51
- semiannual: round2(monthly * (1 - apiPlan.discount_semester / 100)),
52
- annual: round2(monthly * (1 - apiPlan.discount_annual / 100)),
53
- };
54
- }
55
-
56
- export function mapApiPlanToUiPlan(plan: Plan): UiPlan {
57
- const popular = plan.id === 2 || plan.id_plan === 2;
58
- const buttonVariant = popular ? "brand" : "default";
59
-
60
- const pricingByPeriod = computePricingByPeriod(plan);
61
- const monthlyFinal = pricingByPeriod.monthly;
62
-
63
- const lowerName = plan.name.toLowerCase();
64
- const hasProjectAndOnboarding =
65
- lowerName.includes("agência") || lowerName.includes("agencia");
66
-
67
- const features: PlanFeature[] = [
68
- ...BASE_FEATURES,
69
- hasProjectAndOnboarding
70
- ? { icon: "check", text: "Reunião de Onboarding" }
71
- : { icon: "x", text: "Reunião de Onboarding", disabled: true },
72
- hasProjectAndOnboarding
73
- ? {
74
- icon: "check",
75
- text: "Gestão de projetos",
76
- tooltip: "projectManagement",
77
- }
78
- : {
79
- icon: "x",
80
- text: "Gestão de projetos",
81
- disabled: true,
82
- tooltip: "projectManagement",
83
- },
84
- ];
85
-
86
- return {
87
- planId: plan.id,
88
- name: plan.name,
89
- isPopular: popular,
90
- buttonVariant,
91
- mainFeatures: buildMainFeaturesFromItems(plan.items),
92
- features,
93
- originalPrice: formatCurrencyNumber(monthlyFinal),
94
- price: formatCurrencyNumber(monthlyFinal),
95
- pricingByPeriod,
96
- items: plan.items,
97
- };
98
- }
1
+ import type {
2
+ Plan,
3
+ PlanFeature,
4
+ PlanMainFeatures,
5
+ PlanPricingByPeriod,
6
+ UiPlan,
7
+ } from "../types/plan.type";
8
+ import { ADDON_IDS } from "../../subscriptions/constants/addons.constants";
9
+ import { formatCurrencyNumber } from "../../../utils/format/currency";
10
+
11
+ export type PlanBillingPeriod = "monthly" | "semiannual" | "annual";
12
+
13
+ const BASE_FEATURES: PlanFeature[] = [
14
+ { icon: "check", text: "Visitas ilimitadas" },
15
+ { icon: "check", text: "Leads ilimitadas" },
16
+ { icon: "check", text: "Compartilhar páginas", tooltip: "sharePages" },
17
+ { icon: "check", text: "Hospedagem inclusa" },
18
+ { icon: "check", text: "SSL (HTTPS) + CDN" },
19
+ { icon: "check", text: "Templates Free" },
20
+ ];
21
+
22
+ function buildMainFeaturesFromItems(items: Plan["items"]): PlanMainFeatures {
23
+ const pagesItem = items.find((i) => i.id_addon === ADDON_IDS.PAGES);
24
+ const domainsItem = items.find((i) => i.id_addon === ADDON_IDS.DOMAINS);
25
+
26
+ const pagesQty = pagesItem?.quantity ?? 0;
27
+ const domainsQty = domainsItem?.quantity ?? 1;
28
+
29
+ return {
30
+ pages:
31
+ pagesQty === 0
32
+ ? "Páginas ilimitadas"
33
+ : pagesQty === 1
34
+ ? "1 página"
35
+ : `${pagesQty} páginas`,
36
+ domains:
37
+ domainsQty >= 999
38
+ ? "Domínios ilimitados"
39
+ : domainsQty === 1
40
+ ? "1 domínio externo"
41
+ : `${domainsQty} domínios externos`,
42
+ users: "Usuários ilimitados",
43
+ };
44
+ }
45
+
46
+ function computePricingByPeriod(apiPlan: Plan): PlanPricingByPeriod {
47
+ const monthly = apiPlan.value;
48
+ const round2 = (n: number) => Math.round(n * 100) / 100;
49
+ return {
50
+ monthly,
51
+ semiannual: round2(monthly * (1 - apiPlan.discount_semester / 100)),
52
+ annual: round2(monthly * (1 - apiPlan.discount_annual / 100)),
53
+ };
54
+ }
55
+
56
+ export function mapApiPlanToUiPlan(plan: Plan): UiPlan {
57
+ const popular = plan.id === 2 || plan.id_plan === 2;
58
+ const buttonVariant = popular ? "brand" : "default";
59
+
60
+ const pricingByPeriod = computePricingByPeriod(plan);
61
+ const monthlyFinal = pricingByPeriod.monthly;
62
+
63
+ const lowerName = plan.name.toLowerCase();
64
+ const hasProjectAndOnboarding =
65
+ lowerName.includes("agência") || lowerName.includes("agencia");
66
+
67
+ const features: PlanFeature[] = [
68
+ ...BASE_FEATURES,
69
+ hasProjectAndOnboarding
70
+ ? { icon: "check", text: "Reunião de Onboarding" }
71
+ : { icon: "x", text: "Reunião de Onboarding", disabled: true },
72
+ hasProjectAndOnboarding
73
+ ? {
74
+ icon: "check",
75
+ text: "Gestão de projetos",
76
+ tooltip: "projectManagement",
77
+ }
78
+ : {
79
+ icon: "x",
80
+ text: "Gestão de projetos",
81
+ disabled: true,
82
+ tooltip: "projectManagement",
83
+ },
84
+ ];
85
+
86
+ return {
87
+ planId: plan.id,
88
+ name: plan.name,
89
+ isPopular: popular,
90
+ buttonVariant,
91
+ mainFeatures: buildMainFeaturesFromItems(plan.items),
92
+ features,
93
+ originalPrice: formatCurrencyNumber(monthlyFinal),
94
+ price: formatCurrencyNumber(monthlyFinal),
95
+ pricingByPeriod,
96
+ items: plan.items,
97
+ };
98
+ }
@@ -1,9 +1,9 @@
1
- 'use server';
2
-
3
- import { safeServerAction } from '../../../utils/safeServerAction';
4
- import { projectUsersService } from '../services/project-users.service';
5
- import type { AddRemoveProjectUsersParams } from '../types';
6
-
7
- export async function addProjectUserAction(params: AddRemoveProjectUsersParams) {
8
- return safeServerAction(() => projectUsersService.addToProject(params));
9
- }
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectUsersService } from '../services/project-users.service';
5
+ import type { AddRemoveProjectUsersParams } from '../types';
6
+
7
+ export async function addProjectUserAction(params: AddRemoveProjectUsersParams) {
8
+ return safeServerAction(() => projectUsersService.addToProject(params));
9
+ }
@@ -1,9 +1,9 @@
1
- 'use server';
2
-
3
- import { safeServerAction } from '../../../utils/safeServerAction';
4
- import { projectsService } from '../services/projects.service';
5
- import type { CreateProjectRequest } from '../types';
6
-
7
- export async function createProjectAction(data: CreateProjectRequest) {
8
- return safeServerAction(() => projectsService.create(data));
9
- }
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectsService } from '../services/projects.service';
5
+ import type { CreateProjectRequest } from '../types';
6
+
7
+ export async function createProjectAction(data: CreateProjectRequest) {
8
+ return safeServerAction(() => projectsService.create(data));
9
+ }
@@ -1,8 +1,8 @@
1
- 'use server';
2
-
3
- import { safeServerAction } from '../../../utils/safeServerAction';
4
- import { projectsService } from '../services/projects.service';
5
-
6
- export async function deleteProjectAction(projectId: number, moveToProjectId: number) {
7
- return safeServerAction(() => projectsService.delete(projectId, moveToProjectId));
8
- }
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectsService } from '../services/projects.service';
5
+
6
+ export async function deleteProjectAction(projectId: number, moveToProjectId: number) {
7
+ return safeServerAction(() => projectsService.delete(projectId, moveToProjectId));
8
+ }
@@ -1,8 +1,8 @@
1
- 'use server';
2
-
3
- import { safeServerAction } from '../../../utils/safeServerAction';
4
- import { projectsService } from '../services/projects.service';
5
-
6
- export async function findProjectAction(projectId: number) {
7
- return safeServerAction(() => projectsService.findById(projectId));
8
- }
1
+ 'use server';
2
+
3
+ import { safeServerAction } from '../../../utils/safeServerAction';
4
+ import { projectsService } from '../services/projects.service';
5
+
6
+ export async function findProjectAction(projectId: number) {
7
+ return safeServerAction(() => projectsService.findById(projectId));
8
+ }