@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,67 +1,67 @@
1
- 'use client';
2
-
3
- import Image from "next/image";
4
- import { useRouter } from "next/navigation";
5
- import { useWhitelabel, useIsDefaultWhitelabel } from "../../providers/whitelabel.provider";
6
- import { Button } from "../ui/buttons/Button";
7
-
8
- function GreatAppsLogo() {
9
- return (
10
- <svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 68 68" fill="none">
11
- <rect x="4.5" y="4.5" width="58.4463" height="58.4463" rx="14.2271" fill="#09090B" />
12
- <rect x="4.5" y="4.5" width="58.4463" height="58.4463" rx="14.2271" stroke="white" strokeWidth="9" />
13
- <path d="M38.0883 19.5377C38.6909 19.5377 39.1795 20.0264 39.1795 20.6289V25.5892C39.1795 25.9865 39.106 26.3827 38.9364 26.7421C38.4857 27.6992 37.5451 28.2674 36.5452 28.2674H29.9031C28.9993 28.2674 28.2663 29.0004 28.2663 29.9042V37.5427C28.2663 38.4465 28.9993 39.1795 29.9031 39.1795H37.5415C38.4453 39.1795 39.1783 38.4465 39.1783 37.5427V30.9693C39.1783 30.4522 39.3053 29.9374 39.5804 29.5009C40.0596 28.7406 40.8768 28.2899 41.7462 28.2686H46.8168C47.4193 28.2686 47.908 28.7561 47.908 29.3586V37.8238C47.908 38.692 47.5629 39.5246 46.9497 40.139L40.1379 46.9508C39.5235 47.5652 38.6909 47.9091 37.8226 47.9091H29.3587C28.7561 47.9091 28.2674 47.4205 28.2674 46.8179L28.2674 41.8126C28.2674 41.114 27.9899 40.4439 27.4965 39.9504C27.0031 39.457 26.3329 39.1795 25.6343 39.1795H20.629C20.0265 39.1795 19.5378 38.6908 19.5378 38.0883L19.5378 29.6231C19.5378 28.7549 19.8829 27.9222 20.4961 27.3078L27.468 20.3371C27.9792 19.8259 28.6731 19.5377 29.3966 19.5377H38.0871H38.0883Z" fill="white" />
14
- </svg>
15
- );
16
- }
17
-
18
- export function NotFoundPage() {
19
- const router = useRouter();
20
- const { whitelabel } = useWhitelabel();
21
- const isGreatApps = useIsDefaultWhitelabel();
22
- const whitelabelLogo = whitelabel?.logo
23
- ? `${process.env.NEXT_PUBLIC_STORAGE_URL}/${whitelabel.logo}`
24
- : null;
25
-
26
- return (
27
- <div className="relative flex min-h-screen w-full flex-col items-center justify-center overflow-hidden bg-white">
28
- <div className="flex flex-col items-center gap-[22px] text-center">
29
- <div className="relative flex flex-col items-center">
30
- <Image src="/images/404.svg" alt="404" width={440} height={173} priority unoptimized />
31
-
32
- <div className="-mt-1 w-full border-t border-zinc-100" />
33
-
34
- <div className="-mt-[25px]">
35
- {isGreatApps ? (
36
- <GreatAppsLogo />
37
- ) : whitelabelLogo ? (
38
- <Image src={whitelabelLogo} alt={whitelabel?.name || ''} width={50} height={50} className="rounded-xl object-contain" />
39
- ) : null}
40
- </div>
41
- </div>
42
-
43
- <h1 className="max-w-[554px] px-6 font-[family-name:var(--font-outfit)] text-[32px] leading-[36px] font-semibold text-zinc-950 sm:px-0 sm:text-[56px] sm:leading-[56px]">
44
- Página não foi encontrada!
45
- </h1>
46
-
47
- <p className="max-w-[496px] px-6 paragraph-medium-medium text-zinc-950 sm:px-0">
48
- A página que você está procurando não existe. Verifique se digitou corretamente o link que está procurando.
49
- </p>
50
-
51
- <Button
52
- variant="secondary"
53
- className="h-10!"
54
- onClick={() => {
55
- if (window.history.length > 1) {
56
- router.back();
57
- } else {
58
- router.push('/');
59
- }
60
- }}
61
- >
62
- Voltar para o início
63
- </Button>
64
- </div>
65
- </div>
66
- );
67
- }
1
+ 'use client';
2
+
3
+ import Image from "next/image";
4
+ import { useRouter } from "next/navigation";
5
+ import { useWhitelabel, useIsDefaultWhitelabel } from "../../providers/whitelabel.provider";
6
+ import { Button } from "../ui/buttons/Button";
7
+
8
+ function GreatAppsLogo() {
9
+ return (
10
+ <svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 68 68" fill="none">
11
+ <rect x="4.5" y="4.5" width="58.4463" height="58.4463" rx="14.2271" fill="#09090B" />
12
+ <rect x="4.5" y="4.5" width="58.4463" height="58.4463" rx="14.2271" stroke="white" strokeWidth="9" />
13
+ <path d="M38.0883 19.5377C38.6909 19.5377 39.1795 20.0264 39.1795 20.6289V25.5892C39.1795 25.9865 39.106 26.3827 38.9364 26.7421C38.4857 27.6992 37.5451 28.2674 36.5452 28.2674H29.9031C28.9993 28.2674 28.2663 29.0004 28.2663 29.9042V37.5427C28.2663 38.4465 28.9993 39.1795 29.9031 39.1795H37.5415C38.4453 39.1795 39.1783 38.4465 39.1783 37.5427V30.9693C39.1783 30.4522 39.3053 29.9374 39.5804 29.5009C40.0596 28.7406 40.8768 28.2899 41.7462 28.2686H46.8168C47.4193 28.2686 47.908 28.7561 47.908 29.3586V37.8238C47.908 38.692 47.5629 39.5246 46.9497 40.139L40.1379 46.9508C39.5235 47.5652 38.6909 47.9091 37.8226 47.9091H29.3587C28.7561 47.9091 28.2674 47.4205 28.2674 46.8179L28.2674 41.8126C28.2674 41.114 27.9899 40.4439 27.4965 39.9504C27.0031 39.457 26.3329 39.1795 25.6343 39.1795H20.629C20.0265 39.1795 19.5378 38.6908 19.5378 38.0883L19.5378 29.6231C19.5378 28.7549 19.8829 27.9222 20.4961 27.3078L27.468 20.3371C27.9792 19.8259 28.6731 19.5377 29.3966 19.5377H38.0871H38.0883Z" fill="white" />
14
+ </svg>
15
+ );
16
+ }
17
+
18
+ export function NotFoundPage() {
19
+ const router = useRouter();
20
+ const { whitelabel } = useWhitelabel();
21
+ const isGreatApps = useIsDefaultWhitelabel();
22
+ const whitelabelLogo = whitelabel?.logo
23
+ ? `${process.env.NEXT_PUBLIC_STORAGE_URL}/${whitelabel.logo}`
24
+ : null;
25
+
26
+ return (
27
+ <div className="relative flex min-h-screen w-full flex-col items-center justify-center overflow-hidden bg-white">
28
+ <div className="flex flex-col items-center gap-[22px] text-center">
29
+ <div className="relative flex flex-col items-center">
30
+ <Image src="/images/404.svg" alt="404" width={440} height={173} priority unoptimized />
31
+
32
+ <div className="-mt-1 w-full border-t border-zinc-100" />
33
+
34
+ <div className="-mt-[25px]">
35
+ {isGreatApps ? (
36
+ <GreatAppsLogo />
37
+ ) : whitelabelLogo ? (
38
+ <Image src={whitelabelLogo} alt={whitelabel?.name || ''} width={50} height={50} className="rounded-xl object-contain" />
39
+ ) : null}
40
+ </div>
41
+ </div>
42
+
43
+ <h1 className="max-w-[554px] px-6 font-[family-name:var(--font-outfit)] text-[32px] leading-[36px] font-semibold text-zinc-950 sm:px-0 sm:text-[56px] sm:leading-[56px]">
44
+ Página não foi encontrada!
45
+ </h1>
46
+
47
+ <p className="max-w-[496px] px-6 paragraph-medium-medium text-zinc-950 sm:px-0">
48
+ A página que você está procurando não existe. Verifique se digitou corretamente o link que está procurando.
49
+ </p>
50
+
51
+ <Button
52
+ variant="secondary"
53
+ className="h-10!"
54
+ onClick={() => {
55
+ if (window.history.length > 1) {
56
+ router.back();
57
+ } else {
58
+ router.push('/');
59
+ }
60
+ }}
61
+ >
62
+ Voltar para o início
63
+ </Button>
64
+ </div>
65
+ </div>
66
+ );
67
+ }
@@ -1,187 +1,187 @@
1
- 'use client';
2
-
3
- import { IconBell, IconCheck, IconLoader2 } from '@tabler/icons-react';
4
- import { Button } from "../../ui/buttons/Button";
5
- import {
6
- Tabs,
7
- TabsContent,
8
- TabsList,
9
- TabsTrigger,
10
- } from "../../ui/data-display/Tabs";
11
- import { useInfiniteMessages, useMarkAllMessagesAsRead } from "../../../modules/users/hooks/messages.hook";
12
- import NotificationCard from "../../widgets/notifications/NotificationCard";
13
- import { Toast } from "../../ui/feedback/Toast";
14
- import { formatDistanceToNow } from "date-fns";
15
- import { ptBR } from "date-fns/locale";
16
- import { toast } from "sonner";
17
- import React from "react";
18
- import Link from "next/link";
19
-
20
- function parseNotificationUrl(raw: string): string | null {
21
- if (!raw) return null;
22
- const match = raw.match(/href="([^"]+)"/);
23
- return match ? match[1] : raw.startsWith('/') ? raw : null;
24
- }
25
-
26
- function NotificationsList({
27
- pages,
28
- isFetchingNextPage,
29
- hasNextPage,
30
- fetchNextPage,
31
- }: {
32
- pages: ReturnType<typeof useInfiniteMessages>["data"];
33
- isFetchingNextPage: boolean;
34
- hasNextPage: boolean;
35
- fetchNextPage: () => void;
36
- }) {
37
- const notifications = pages?.pages.flatMap((p) => p.data) ?? [];
38
-
39
- const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
40
- const target = e.currentTarget;
41
- const nearBottom =
42
- target.scrollTop + target.clientHeight >= target.scrollHeight - 50;
43
- if (!nearBottom) return;
44
- if (hasNextPage && !isFetchingNextPage) {
45
- fetchNextPage();
46
- }
47
- };
48
-
49
- if (notifications.length === 0 && !isFetchingNextPage) {
50
- return (
51
- <div className="rounded-lg border border-zinc-200 bg-white">
52
- <div className="flex flex-col items-center justify-center py-16 gap-2">
53
- <span className="paragraph-medium-regular text-zinc-500">Nenhuma notificação encontrada.</span>
54
- </div>
55
- </div>
56
- );
57
- }
58
-
59
- return (
60
- <div
61
- className="flex flex-col border border-gray-200 rounded-lg w-full bg-white max-h-[70vh] overflow-y-auto custom-scrollbar"
62
- onScroll={handleScroll}
63
- >
64
- {notifications.map((notification, index) => {
65
- const detailsUrl = parseNotificationUrl(notification.url);
66
- return (
67
- <NotificationCard
68
- key={notification.id}
69
- icon={<IconBell size={20} className="text-pages-600" />}
70
- iconBgColor="bg-zinc-50"
71
- title={notification.subject}
72
- description={notification.message}
73
- gapPx={8}
74
- time={formatDistanceToNow(new Date(notification.datetime_add), {
75
- addSuffix: true,
76
- locale: ptBR,
77
- })}
78
- isUnread={notification.status === 1}
79
- showBorder={index < notifications.length - 1}
80
- actions={
81
- detailsUrl ? (
82
- <Button asChild variant="secondary" className="h-8! px-3! paragraph-small-semibold">
83
- <Link href={detailsUrl}>Detalhes</Link>
84
- </Button>
85
- ) : undefined
86
- }
87
- />
88
- );
89
- })}
90
- {isFetchingNextPage && (
91
- <div className="flex items-center justify-center py-4">
92
- <IconLoader2 size={20} className="animate-spin text-gray-400" />
93
- </div>
94
- )}
95
- </div>
96
- );
97
- }
98
-
99
- export function NotificationPageContent() {
100
- const unreadNotifications = useInfiniteMessages({
101
- readed: false,
102
- type: "notification",
103
- order: "desc",
104
- });
105
- const allNotifications = useInfiniteMessages({
106
- type: "notification",
107
- order: "desc",
108
- });
109
-
110
- const totalAll = allNotifications.data?.pages[0]?.total ?? 0;
111
- const totalUnread = unreadNotifications.data?.pages[0]?.total ?? 0;
112
-
113
- const { mutate: markAllAsRead, isPending: isMarkingAll } = useMarkAllMessagesAsRead();
114
-
115
- const handleMarkAllAsRead = () => {
116
- markAllAsRead(undefined, {
117
- onSuccess: () => {
118
- toast.custom((t) => (
119
- <Toast variant="success" message="Todas as notificações foram marcadas como lidas" toastId={t} />
120
- ));
121
- },
122
- onError: () => {
123
- toast.custom((t) => (
124
- <Toast variant="error" message="Erro ao marcar notificações como lidas" toastId={t} />
125
- ));
126
- },
127
- });
128
- };
129
-
130
- return (
131
- <div className="flex flex-col gap-6 lg:gap-8">
132
- <div className="flex items-center justify-between gap-4">
133
- <div className="flex flex-col gap-2">
134
- <h1 className="title-large-semibold text-gray-950">
135
- Notificações
136
- </h1>
137
- <p className="paragraph-small-regular text-gray-600 hidden lg:block">
138
- Tenha controle total sobre páginas, experiências e conversões.
139
- </p>
140
- </div>
141
- <Button
142
- variant={"secondary"}
143
- className="h-10! lg:h-12! shrink-0"
144
- onClick={handleMarkAllAsRead}
145
- disabled={isMarkingAll || totalUnread === 0}
146
- >
147
- {isMarkingAll ? <IconLoader2 size={20} className="animate-spin" /> : <IconCheck size={20} />}
148
- <span className="lg:block hidden">Marcar todos como lidos</span>
149
- <span className="lg:hidden">Marcar como lidos</span>
150
- </Button>
151
- </div>
152
- <Tabs
153
- defaultValue="all"
154
- className="flex flex-col w-full bg-transparent gap-6 lg:gap-8"
155
- >
156
- <TabsList className="h-auto pb-0 bg-transparent">
157
- <TabsTrigger className="gap-2" value="all">
158
- Todas as notificações{" "}
159
- <span className="text-gray-500">({totalAll})</span>
160
- </TabsTrigger>
161
- <TabsTrigger className="gap-2" value="unreads" disabled={totalUnread === 0}>
162
- Não lidas{" "}
163
- <span className="text-gray-500">({totalUnread})</span>
164
- </TabsTrigger>
165
- </TabsList>
166
-
167
- <TabsContent value="all">
168
- <NotificationsList
169
- pages={allNotifications.data}
170
- isFetchingNextPage={allNotifications.isFetchingNextPage}
171
- hasNextPage={allNotifications.hasNextPage}
172
- fetchNextPage={allNotifications.fetchNextPage}
173
- />
174
- </TabsContent>
175
-
176
- <TabsContent value="unreads">
177
- <NotificationsList
178
- pages={unreadNotifications.data}
179
- isFetchingNextPage={unreadNotifications.isFetchingNextPage}
180
- hasNextPage={unreadNotifications.hasNextPage}
181
- fetchNextPage={unreadNotifications.fetchNextPage}
182
- />
183
- </TabsContent>
184
- </Tabs>
185
- </div>
186
- );
187
- }
1
+ 'use client';
2
+
3
+ import { IconBell, IconCheck, IconLoader2 } from '@tabler/icons-react';
4
+ import { Button } from "../../ui/buttons/Button";
5
+ import {
6
+ Tabs,
7
+ TabsContent,
8
+ TabsList,
9
+ TabsTrigger,
10
+ } from "../../ui/data-display/Tabs";
11
+ import { useInfiniteMessages, useMarkAllMessagesAsRead } from "../../../modules/users/hooks/messages.hook";
12
+ import NotificationCard from "../../widgets/notifications/NotificationCard";
13
+ import { Toast } from "../../ui/feedback/Toast";
14
+ import { formatDistanceToNow } from "date-fns";
15
+ import { ptBR } from "date-fns/locale";
16
+ import { toast } from "sonner";
17
+ import React from "react";
18
+ import Link from "next/link";
19
+
20
+ function parseNotificationUrl(raw: string): string | null {
21
+ if (!raw) return null;
22
+ const match = raw.match(/href="([^"]+)"/);
23
+ return match ? match[1] : raw.startsWith('/') ? raw : null;
24
+ }
25
+
26
+ function NotificationsList({
27
+ pages,
28
+ isFetchingNextPage,
29
+ hasNextPage,
30
+ fetchNextPage,
31
+ }: {
32
+ pages: ReturnType<typeof useInfiniteMessages>["data"];
33
+ isFetchingNextPage: boolean;
34
+ hasNextPage: boolean;
35
+ fetchNextPage: () => void;
36
+ }) {
37
+ const notifications = pages?.pages.flatMap((p) => p.data) ?? [];
38
+
39
+ const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
40
+ const target = e.currentTarget;
41
+ const nearBottom =
42
+ target.scrollTop + target.clientHeight >= target.scrollHeight - 50;
43
+ if (!nearBottom) return;
44
+ if (hasNextPage && !isFetchingNextPage) {
45
+ fetchNextPage();
46
+ }
47
+ };
48
+
49
+ if (notifications.length === 0 && !isFetchingNextPage) {
50
+ return (
51
+ <div className="rounded-lg border border-zinc-200 bg-white">
52
+ <div className="flex flex-col items-center justify-center py-16 gap-2">
53
+ <span className="paragraph-medium-regular text-zinc-500">Nenhuma notificação encontrada.</span>
54
+ </div>
55
+ </div>
56
+ );
57
+ }
58
+
59
+ return (
60
+ <div
61
+ className="flex flex-col border border-gray-200 rounded-lg w-full bg-white max-h-[70vh] overflow-y-auto custom-scrollbar"
62
+ onScroll={handleScroll}
63
+ >
64
+ {notifications.map((notification, index) => {
65
+ const detailsUrl = parseNotificationUrl(notification.url);
66
+ return (
67
+ <NotificationCard
68
+ key={notification.id}
69
+ icon={<IconBell size={20} className="text-pages-600" />}
70
+ iconBgColor="bg-zinc-50"
71
+ title={notification.subject}
72
+ description={notification.message}
73
+ gapPx={8}
74
+ time={formatDistanceToNow(new Date(notification.datetime_add), {
75
+ addSuffix: true,
76
+ locale: ptBR,
77
+ })}
78
+ isUnread={notification.status === 1}
79
+ showBorder={index < notifications.length - 1}
80
+ actions={
81
+ detailsUrl ? (
82
+ <Button asChild variant="secondary" className="h-8! px-3! paragraph-small-semibold">
83
+ <Link href={detailsUrl}>Detalhes</Link>
84
+ </Button>
85
+ ) : undefined
86
+ }
87
+ />
88
+ );
89
+ })}
90
+ {isFetchingNextPage && (
91
+ <div className="flex items-center justify-center py-4">
92
+ <IconLoader2 size={20} className="animate-spin text-gray-400" />
93
+ </div>
94
+ )}
95
+ </div>
96
+ );
97
+ }
98
+
99
+ export function NotificationPageContent() {
100
+ const unreadNotifications = useInfiniteMessages({
101
+ readed: false,
102
+ type: "notification",
103
+ order: "desc",
104
+ });
105
+ const allNotifications = useInfiniteMessages({
106
+ type: "notification",
107
+ order: "desc",
108
+ });
109
+
110
+ const totalAll = allNotifications.data?.pages[0]?.total ?? 0;
111
+ const totalUnread = unreadNotifications.data?.pages[0]?.total ?? 0;
112
+
113
+ const { mutate: markAllAsRead, isPending: isMarkingAll } = useMarkAllMessagesAsRead();
114
+
115
+ const handleMarkAllAsRead = () => {
116
+ markAllAsRead(undefined, {
117
+ onSuccess: () => {
118
+ toast.custom((t) => (
119
+ <Toast variant="success" message="Todas as notificações foram marcadas como lidas" toastId={t} />
120
+ ));
121
+ },
122
+ onError: () => {
123
+ toast.custom((t) => (
124
+ <Toast variant="error" message="Erro ao marcar notificações como lidas" toastId={t} />
125
+ ));
126
+ },
127
+ });
128
+ };
129
+
130
+ return (
131
+ <div className="flex flex-col gap-6 lg:gap-8">
132
+ <div className="flex items-center justify-between gap-4">
133
+ <div className="flex flex-col gap-2">
134
+ <h1 className="title-large-semibold text-gray-950">
135
+ Notificações
136
+ </h1>
137
+ <p className="paragraph-small-regular text-gray-600 hidden lg:block">
138
+ Tenha controle total sobre páginas, experiências e conversões.
139
+ </p>
140
+ </div>
141
+ <Button
142
+ variant={"secondary"}
143
+ className="h-10! lg:h-12! shrink-0"
144
+ onClick={handleMarkAllAsRead}
145
+ disabled={isMarkingAll || totalUnread === 0}
146
+ >
147
+ {isMarkingAll ? <IconLoader2 size={20} className="animate-spin" /> : <IconCheck size={20} />}
148
+ <span className="lg:block hidden">Marcar todos como lidos</span>
149
+ <span className="lg:hidden">Marcar como lidos</span>
150
+ </Button>
151
+ </div>
152
+ <Tabs
153
+ defaultValue="all"
154
+ className="flex flex-col w-full bg-transparent gap-6 lg:gap-8"
155
+ >
156
+ <TabsList className="h-auto pb-0 bg-transparent">
157
+ <TabsTrigger className="gap-2" value="all">
158
+ Todas as notificações{" "}
159
+ <span className="text-gray-500">({totalAll})</span>
160
+ </TabsTrigger>
161
+ <TabsTrigger className="gap-2" value="unreads" disabled={totalUnread === 0}>
162
+ Não lidas{" "}
163
+ <span className="text-gray-500">({totalUnread})</span>
164
+ </TabsTrigger>
165
+ </TabsList>
166
+
167
+ <TabsContent value="all">
168
+ <NotificationsList
169
+ pages={allNotifications.data}
170
+ isFetchingNextPage={allNotifications.isFetchingNextPage}
171
+ hasNextPage={allNotifications.hasNextPage}
172
+ fetchNextPage={allNotifications.fetchNextPage}
173
+ />
174
+ </TabsContent>
175
+
176
+ <TabsContent value="unreads">
177
+ <NotificationsList
178
+ pages={unreadNotifications.data}
179
+ isFetchingNextPage={unreadNotifications.isFetchingNextPage}
180
+ hasNextPage={unreadNotifications.hasNextPage}
181
+ fetchNextPage={unreadNotifications.fetchNextPage}
182
+ />
183
+ </TabsContent>
184
+ </Tabs>
185
+ </div>
186
+ );
187
+ }
@@ -1,62 +1,62 @@
1
- 'use client';
2
-
3
- import * as React from "react"
4
- import { Slot } from "@radix-ui/react-slot"
5
- import { cva, type VariantProps } from "class-variance-authority"
6
- import { cn } from "../../../infra/utils/clsx"
7
- import { useIsDefaultWhitelabel } from "../../../providers/whitelabel.provider"
8
-
9
- const buttonVariants = cva(
10
- "paragraph-small-semibold cursor-pointer flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
11
- {
12
- variants: {
13
- variant: {
14
- default: " bg-gray-950 text-white hover:bg-gray-950/90",
15
- secondary:
16
- "bg-white text-gray-950 border-gray-200 hover:border-gray-400 border",
17
- ghost:
18
- "text-gray-600 hover:bg-accent hover:text-gray-950 dark:hover:bg-accent/50",
19
- brand: "text-gray-950",
20
- },
21
- size: {
22
- default: "h-12 px-4 py-2 has-[>svg]:px-3",
23
- sm: "rounded-md gap-1.5 px-2 py-2 has-[>svg]:px-2.5",
24
- lg: "rounded-md px-6 has-[>svg]:px-4",
25
- icon: "size-9",
26
- "icon-sm": "size-8",
27
- "icon-lg": "size-10",
28
- },
29
- },
30
- defaultVariants: {
31
- variant: "default",
32
- size: "default",
33
- },
34
- }
35
- )
36
-
37
- function Button({
38
- className,
39
- variant,
40
- size,
41
- asChild = false,
42
- ...props
43
- }: React.ComponentProps<"button"> &
44
- VariantProps<typeof buttonVariants> & {
45
- asChild?: boolean
46
- }) {
47
- const isDefaultWl = useIsDefaultWhitelabel();
48
- const Comp = asChild ? Slot : "button"
49
-
50
- return (
51
- <Comp
52
- data-slot="button"
53
- className={cn(
54
- buttonVariants({ variant, size, className }),
55
- variant === "brand" && (isDefaultWl ? "bg-cyan-300 hover:bg-cyan-200" : "bg-zinc-300 hover:bg-zinc-200")
56
- )}
57
- {...props}
58
- />
59
- )
60
- }
61
-
62
- export { Button, buttonVariants }
1
+ 'use client';
2
+
3
+ import * as React from "react"
4
+ import { Slot } from "@radix-ui/react-slot"
5
+ import { cva, type VariantProps } from "class-variance-authority"
6
+ import { cn } from "../../../infra/utils/clsx"
7
+ import { useIsDefaultWhitelabel } from "../../../providers/whitelabel.provider"
8
+
9
+ const buttonVariants = cva(
10
+ "paragraph-small-semibold cursor-pointer flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: " bg-gray-950 text-white hover:bg-gray-950/90",
15
+ secondary:
16
+ "bg-white text-gray-950 border-gray-200 hover:border-gray-400 border",
17
+ ghost:
18
+ "text-gray-600 hover:bg-accent hover:text-gray-950 dark:hover:bg-accent/50",
19
+ brand: "text-gray-950",
20
+ },
21
+ size: {
22
+ default: "h-12 px-4 py-2 has-[>svg]:px-3",
23
+ sm: "rounded-md gap-1.5 px-2 py-2 has-[>svg]:px-2.5",
24
+ lg: "rounded-md px-6 has-[>svg]:px-4",
25
+ icon: "size-9",
26
+ "icon-sm": "size-8",
27
+ "icon-lg": "size-10",
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ variant: "default",
32
+ size: "default",
33
+ },
34
+ }
35
+ )
36
+
37
+ function Button({
38
+ className,
39
+ variant,
40
+ size,
41
+ asChild = false,
42
+ ...props
43
+ }: React.ComponentProps<"button"> &
44
+ VariantProps<typeof buttonVariants> & {
45
+ asChild?: boolean
46
+ }) {
47
+ const isDefaultWl = useIsDefaultWhitelabel();
48
+ const Comp = asChild ? Slot : "button"
49
+
50
+ return (
51
+ <Comp
52
+ data-slot="button"
53
+ className={cn(
54
+ buttonVariants({ variant, size, className }),
55
+ variant === "brand" && (isDefaultWl ? "bg-cyan-300 hover:bg-cyan-200" : "bg-zinc-300 hover:bg-zinc-200")
56
+ )}
57
+ {...props}
58
+ />
59
+ )
60
+ }
61
+
62
+ export { Button, buttonVariants }