@greatapps/common 1.1.256 → 1.1.257

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 (299) hide show
  1. package/dist/components/account/AccountModals.mjs.map +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  3. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  5. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  6. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  7. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  8. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  9. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  10. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  11. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  14. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  15. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  16. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  17. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  18. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  20. package/dist/components/handlers/SearchParamsHandler.mjs.map +1 -1
  21. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  22. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  24. package/dist/components/layouts/NavBar.mjs.map +1 -1
  25. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  26. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  27. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  28. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  29. package/dist/components/modals/ModalManager.mjs.map +1 -1
  30. package/dist/components/modals/Modals.mjs.map +1 -1
  31. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  32. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  33. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  34. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  35. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  36. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  37. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  38. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  39. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  40. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  41. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  42. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  43. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  44. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  45. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  46. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  47. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  48. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  51. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  52. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  53. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  54. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  55. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  56. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  57. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  58. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  59. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  60. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  61. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  62. package/dist/components/ui/form/FormField.mjs.map +1 -1
  63. package/dist/components/ui/form/Input.mjs.map +1 -1
  64. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  65. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  66. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  67. package/dist/components/ui/form/Select.mjs +1 -1
  68. package/dist/components/ui/form/Select.mjs.map +1 -1
  69. package/dist/components/ui/form/Switch.mjs.map +1 -1
  70. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  71. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  72. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  73. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  74. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  75. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  76. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  77. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  78. package/dist/hooks/useDebounce.mjs.map +1 -1
  79. package/dist/hooks/useDebounceState.mjs.map +1 -1
  80. package/dist/hooks/useDebouncedEffect.mjs.map +1 -1
  81. package/dist/index.mjs.map +1 -1
  82. package/dist/infra/utils/clsx.mjs.map +1 -1
  83. package/dist/infra/utils/parser.mjs.map +1 -1
  84. package/dist/infra/utils/percentage.mjs.map +1 -1
  85. package/dist/middleware.mjs.map +1 -1
  86. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  87. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  88. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  89. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  90. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  91. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  92. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  93. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  94. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  95. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  96. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  97. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  98. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  99. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  100. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  101. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  102. package/dist/modules/cards/types.mjs.map +1 -1
  103. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  104. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  105. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  106. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  107. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  108. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  109. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  110. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  111. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  112. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  113. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  114. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  115. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  116. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  117. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  118. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  119. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  120. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  121. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  122. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  123. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  124. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  125. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  126. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  127. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  128. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  129. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  130. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  131. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  132. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  133. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  134. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  135. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  136. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  137. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  138. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  139. package/dist/modules/whitelabel/actions/revalidate-whitelabel-styles.action.mjs.map +1 -1
  140. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  141. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  142. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  143. package/dist/store/useAccountModals.mjs.map +1 -1
  144. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  145. package/dist/store/useModalManager.mjs.map +1 -1
  146. package/dist/utils/countries.mjs.map +1 -1
  147. package/dist/utils/safeServerAction.mjs.map +1 -1
  148. package/dist/utils/withAction.mjs.map +1 -1
  149. package/package.json +89 -89
  150. package/src/components/account/AccountModals.tsx +17 -17
  151. package/src/components/account/ConfigurationsMyAccountModal.tsx +150 -150
  152. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  153. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  154. package/src/components/account/DeleteAccountModal.tsx +130 -130
  155. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  156. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  157. package/src/components/account/TwoFactorAuthModal.tsx +223 -223
  158. package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
  159. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  160. package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
  161. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  162. package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
  163. package/src/components/account/sections/MyProfileSection.tsx +327 -327
  164. package/src/components/account/sections/PreferencesSection.tsx +273 -273
  165. package/src/components/account/sections/SecuritySection.tsx +160 -160
  166. package/src/components/embeds/CrispEmbed.tsx +101 -101
  167. package/src/components/embeds/FrillEmbed.tsx +119 -119
  168. package/src/components/handlers/SearchParamsHandler.tsx +61 -61
  169. package/src/components/layouts/AppMobileNavBar.tsx +118 -118
  170. package/src/components/layouts/AppNavBar.tsx +51 -51
  171. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  172. package/src/components/layouts/NavBar.tsx +120 -120
  173. package/src/components/layouts/NotificationsPopover.tsx +115 -115
  174. package/src/components/layouts/ProfilePopover.tsx +164 -164
  175. package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
  176. package/src/components/modals/BuyCreditsModal.tsx +301 -301
  177. package/src/components/modals/ModalManager.tsx +29 -29
  178. package/src/components/modals/Modals.tsx +26 -26
  179. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  180. package/src/components/navigation/NavItemsContext.ts +20 -20
  181. package/src/components/navigation/ProjectSelectorPopover.tsx +157 -157
  182. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  183. package/src/components/navigation/subcomponents/ProjectSelector.tsx +156 -156
  184. package/src/components/pages/notifications/Notifications.tsx +160 -160
  185. package/src/components/ui/buttons/Button.tsx +57 -57
  186. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  187. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  188. package/src/components/ui/data-display/Accordion.tsx +81 -81
  189. package/src/components/ui/data-display/Badge.tsx +47 -47
  190. package/src/components/ui/data-display/Card.tsx +93 -93
  191. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  192. package/src/components/ui/data-display/CardItem.tsx +75 -75
  193. package/src/components/ui/data-display/Pagination.tsx +126 -126
  194. package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
  195. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  196. package/src/components/ui/data-display/Separator.tsx +29 -29
  197. package/src/components/ui/data-display/Table.tsx +117 -117
  198. package/src/components/ui/data-display/Tabs.tsx +67 -67
  199. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  200. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  201. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  202. package/src/components/ui/feedback/Progress.tsx +40 -40
  203. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  204. package/src/components/ui/feedback/Toast.tsx +101 -101
  205. package/src/components/ui/form/Calendar.tsx +228 -228
  206. package/src/components/ui/form/Checkbox.tsx +31 -31
  207. package/src/components/ui/form/ComboboxField.tsx +154 -154
  208. package/src/components/ui/form/DatePicker.tsx +97 -97
  209. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  210. package/src/components/ui/form/FormField.tsx +131 -131
  211. package/src/components/ui/form/Input.tsx +20 -20
  212. package/src/components/ui/form/InputOtp.tsx +80 -80
  213. package/src/components/ui/form/PhoneInput.tsx +205 -205
  214. package/src/components/ui/form/RadioGroup.tsx +45 -45
  215. package/src/components/ui/form/Select.tsx +200 -200
  216. package/src/components/ui/form/Switch.tsx +32 -32
  217. package/src/components/ui/form/Textarea.tsx +19 -19
  218. package/src/components/ui/overlay/Command.tsx +185 -185
  219. package/src/components/ui/overlay/Dialog.tsx +151 -151
  220. package/src/components/ui/overlay/Popover.tsx +49 -49
  221. package/src/components/ui/overlay/Sheet.tsx +166 -166
  222. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  223. package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
  224. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  225. package/src/hooks/useDebounce.ts +26 -26
  226. package/src/hooks/useDebounceState.ts +11 -11
  227. package/src/hooks/useDebouncedEffect.ts +69 -69
  228. package/src/index.ts +376 -376
  229. package/src/infra/utils/clsx.ts +6 -6
  230. package/src/infra/utils/parser.ts +52 -52
  231. package/src/infra/utils/percentage.ts +42 -42
  232. package/src/middleware.ts +4 -4
  233. package/src/modules/accounts/actions/account-management.action.ts +91 -91
  234. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  235. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  236. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  237. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  238. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  239. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  240. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  241. package/src/modules/accounts/services/account.service.ts +236 -236
  242. package/src/modules/accounts/types.ts +214 -214
  243. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  244. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  245. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  246. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  247. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  248. package/src/modules/cards/hooks/cards.hook.ts +14 -14
  249. package/src/modules/cards/services/cards.service.ts +32 -32
  250. package/src/modules/cards/types.ts +32 -32
  251. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  252. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  253. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +17 -17
  254. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
  255. package/src/modules/plans/services/plans.service.ts +36 -36
  256. package/src/modules/plans/types/plan.type.ts +21 -21
  257. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  258. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  259. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  260. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  261. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  262. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  263. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  264. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  265. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  266. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  267. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  268. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  269. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +26 -26
  270. package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
  271. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  272. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  273. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
  274. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
  275. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  276. package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
  277. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  278. package/src/modules/subscriptions/utils/periodicity.ts +52 -52
  279. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  280. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  281. package/src/modules/users/action/list-messages.action.ts +12 -12
  282. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  283. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  284. package/src/modules/users/hooks/messages.hook.ts +60 -60
  285. package/src/modules/users/services/messages.service.ts +48 -48
  286. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  287. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  288. package/src/modules/whitelabel/actions/revalidate-whitelabel-styles.action.ts +10 -10
  289. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  290. package/src/modules/whitelabel/schema.ts +83 -81
  291. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +129 -129
  292. package/src/modules/whitelabel/styles-schema.ts +37 -37
  293. package/src/providers/whitelabel.provider.tsx +54 -54
  294. package/src/store/useAccountModals.ts +55 -55
  295. package/src/store/useBuyCreditsModal.ts +25 -25
  296. package/src/store/useModalManager.ts +104 -104
  297. package/src/utils/countries.ts +224 -224
  298. package/src/utils/safeServerAction.ts +21 -21
  299. package/src/utils/withAction.ts +13 -13
@@ -1,160 +1,160 @@
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
-
19
- function NotificationsList({
20
- pages,
21
- isFetchingNextPage,
22
- hasNextPage,
23
- fetchNextPage,
24
- }: {
25
- pages: ReturnType<typeof useInfiniteMessages>["data"];
26
- isFetchingNextPage: boolean;
27
- hasNextPage: boolean;
28
- fetchNextPage: () => void;
29
- }) {
30
- const notifications = pages?.pages.flatMap((p) => p.data) ?? [];
31
-
32
- const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
33
- const target = e.currentTarget;
34
- const nearBottom =
35
- target.scrollTop + target.clientHeight >= target.scrollHeight - 50;
36
- if (!nearBottom) return;
37
- if (hasNextPage && !isFetchingNextPage) {
38
- fetchNextPage();
39
- }
40
- };
41
-
42
- return (
43
- <div
44
- className="flex flex-col border border-gray-200 rounded-lg w-full bg-white max-h-[70vh] overflow-y-auto custom-scrollbar"
45
- onScroll={handleScroll}
46
- >
47
- {notifications.map((notification, index) => (
48
- <NotificationCard
49
- key={notification.id}
50
- icon={<IconBell size={20} className="text-pages-600" />}
51
- iconBgColor="bg-pages-100"
52
- title={notification.subject}
53
- description={notification.message}
54
- gapPx={8}
55
- time={formatDistanceToNow(new Date(notification.datetime_add), {
56
- addSuffix: true,
57
- locale: ptBR,
58
- })}
59
- isUnread={notification.status === 1}
60
- showBorder={index < notifications.length - 1}
61
- />
62
- ))}
63
- {isFetchingNextPage && (
64
- <div className="flex items-center justify-center py-4">
65
- <IconLoader2 size={20} className="animate-spin text-gray-400" />
66
- </div>
67
- )}
68
- </div>
69
- );
70
- }
71
-
72
- export function NotificationPageContent() {
73
- const unreadNotifications = useInfiniteMessages({
74
- readed: false,
75
- type: "notification",
76
- order: "desc",
77
- });
78
- const allNotifications = useInfiniteMessages({
79
- type: "notification",
80
- order: "desc",
81
- });
82
-
83
- const totalAll = allNotifications.data?.pages[0]?.total ?? 0;
84
- const totalUnread = unreadNotifications.data?.pages[0]?.total ?? 0;
85
-
86
- const { mutate: markAllAsRead, isPending: isMarkingAll } = useMarkAllMessagesAsRead();
87
-
88
- const handleMarkAllAsRead = () => {
89
- markAllAsRead(undefined, {
90
- onSuccess: () => {
91
- toast.custom((t) => (
92
- <Toast variant="success" message="Todas as notificações foram marcadas como lidas" toastId={t} />
93
- ));
94
- },
95
- onError: () => {
96
- toast.custom((t) => (
97
- <Toast variant="error" message="Erro ao marcar notificações como lidas" toastId={t} />
98
- ));
99
- },
100
- });
101
- };
102
-
103
- return (
104
- <div className="flex flex-col gap-6 lg:gap-8">
105
- <div className="flex items-center justify-between gap-4">
106
- <div className="flex flex-col gap-2">
107
- <h1 className="title-large-semibold text-gray-950">
108
- Notificações
109
- </h1>
110
- <p className="paragraph-small-regular text-gray-600 hidden lg:block">
111
- Tenha controle total sobre páginas, experiências e conversões.
112
- </p>
113
- </div>
114
- <Button
115
- variant={"secondary"}
116
- className="h-10! lg:h-12! shrink-0"
117
- onClick={handleMarkAllAsRead}
118
- disabled={isMarkingAll || totalUnread === 0}
119
- >
120
- {isMarkingAll ? <IconLoader2 size={20} className="animate-spin" /> : <IconCheck size={20} />}
121
- <span className="lg:block hidden">Marcar todos como lidos</span>
122
- <span className="lg:hidden">Marcar como lidos</span>
123
- </Button>
124
- </div>
125
- <Tabs
126
- defaultValue="all"
127
- className="flex flex-col w-full bg-transparent gap-6 lg:gap-8"
128
- >
129
- <TabsList className="h-auto pb-0 bg-transparent">
130
- <TabsTrigger className="gap-2" value="all">
131
- Todas as notificações{" "}
132
- <span className="text-gray-500">({totalAll})</span>
133
- </TabsTrigger>
134
- <TabsTrigger className="gap-2" value="unreads" disabled={totalUnread === 0}>
135
- Não lidas{" "}
136
- <span className="text-gray-500">({totalUnread})</span>
137
- </TabsTrigger>
138
- </TabsList>
139
-
140
- <TabsContent value="all">
141
- <NotificationsList
142
- pages={allNotifications.data}
143
- isFetchingNextPage={allNotifications.isFetchingNextPage}
144
- hasNextPage={allNotifications.hasNextPage}
145
- fetchNextPage={allNotifications.fetchNextPage}
146
- />
147
- </TabsContent>
148
-
149
- <TabsContent value="unreads">
150
- <NotificationsList
151
- pages={unreadNotifications.data}
152
- isFetchingNextPage={unreadNotifications.isFetchingNextPage}
153
- hasNextPage={unreadNotifications.hasNextPage}
154
- fetchNextPage={unreadNotifications.fetchNextPage}
155
- />
156
- </TabsContent>
157
- </Tabs>
158
- </div>
159
- );
160
- }
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
+
19
+ function NotificationsList({
20
+ pages,
21
+ isFetchingNextPage,
22
+ hasNextPage,
23
+ fetchNextPage,
24
+ }: {
25
+ pages: ReturnType<typeof useInfiniteMessages>["data"];
26
+ isFetchingNextPage: boolean;
27
+ hasNextPage: boolean;
28
+ fetchNextPage: () => void;
29
+ }) {
30
+ const notifications = pages?.pages.flatMap((p) => p.data) ?? [];
31
+
32
+ const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
33
+ const target = e.currentTarget;
34
+ const nearBottom =
35
+ target.scrollTop + target.clientHeight >= target.scrollHeight - 50;
36
+ if (!nearBottom) return;
37
+ if (hasNextPage && !isFetchingNextPage) {
38
+ fetchNextPage();
39
+ }
40
+ };
41
+
42
+ return (
43
+ <div
44
+ className="flex flex-col border border-gray-200 rounded-lg w-full bg-white max-h-[70vh] overflow-y-auto custom-scrollbar"
45
+ onScroll={handleScroll}
46
+ >
47
+ {notifications.map((notification, index) => (
48
+ <NotificationCard
49
+ key={notification.id}
50
+ icon={<IconBell size={20} className="text-pages-600" />}
51
+ iconBgColor="bg-pages-100"
52
+ title={notification.subject}
53
+ description={notification.message}
54
+ gapPx={8}
55
+ time={formatDistanceToNow(new Date(notification.datetime_add), {
56
+ addSuffix: true,
57
+ locale: ptBR,
58
+ })}
59
+ isUnread={notification.status === 1}
60
+ showBorder={index < notifications.length - 1}
61
+ />
62
+ ))}
63
+ {isFetchingNextPage && (
64
+ <div className="flex items-center justify-center py-4">
65
+ <IconLoader2 size={20} className="animate-spin text-gray-400" />
66
+ </div>
67
+ )}
68
+ </div>
69
+ );
70
+ }
71
+
72
+ export function NotificationPageContent() {
73
+ const unreadNotifications = useInfiniteMessages({
74
+ readed: false,
75
+ type: "notification",
76
+ order: "desc",
77
+ });
78
+ const allNotifications = useInfiniteMessages({
79
+ type: "notification",
80
+ order: "desc",
81
+ });
82
+
83
+ const totalAll = allNotifications.data?.pages[0]?.total ?? 0;
84
+ const totalUnread = unreadNotifications.data?.pages[0]?.total ?? 0;
85
+
86
+ const { mutate: markAllAsRead, isPending: isMarkingAll } = useMarkAllMessagesAsRead();
87
+
88
+ const handleMarkAllAsRead = () => {
89
+ markAllAsRead(undefined, {
90
+ onSuccess: () => {
91
+ toast.custom((t) => (
92
+ <Toast variant="success" message="Todas as notificações foram marcadas como lidas" toastId={t} />
93
+ ));
94
+ },
95
+ onError: () => {
96
+ toast.custom((t) => (
97
+ <Toast variant="error" message="Erro ao marcar notificações como lidas" toastId={t} />
98
+ ));
99
+ },
100
+ });
101
+ };
102
+
103
+ return (
104
+ <div className="flex flex-col gap-6 lg:gap-8">
105
+ <div className="flex items-center justify-between gap-4">
106
+ <div className="flex flex-col gap-2">
107
+ <h1 className="title-large-semibold text-gray-950">
108
+ Notificações
109
+ </h1>
110
+ <p className="paragraph-small-regular text-gray-600 hidden lg:block">
111
+ Tenha controle total sobre páginas, experiências e conversões.
112
+ </p>
113
+ </div>
114
+ <Button
115
+ variant={"secondary"}
116
+ className="h-10! lg:h-12! shrink-0"
117
+ onClick={handleMarkAllAsRead}
118
+ disabled={isMarkingAll || totalUnread === 0}
119
+ >
120
+ {isMarkingAll ? <IconLoader2 size={20} className="animate-spin" /> : <IconCheck size={20} />}
121
+ <span className="lg:block hidden">Marcar todos como lidos</span>
122
+ <span className="lg:hidden">Marcar como lidos</span>
123
+ </Button>
124
+ </div>
125
+ <Tabs
126
+ defaultValue="all"
127
+ className="flex flex-col w-full bg-transparent gap-6 lg:gap-8"
128
+ >
129
+ <TabsList className="h-auto pb-0 bg-transparent">
130
+ <TabsTrigger className="gap-2" value="all">
131
+ Todas as notificações{" "}
132
+ <span className="text-gray-500">({totalAll})</span>
133
+ </TabsTrigger>
134
+ <TabsTrigger className="gap-2" value="unreads" disabled={totalUnread === 0}>
135
+ Não lidas{" "}
136
+ <span className="text-gray-500">({totalUnread})</span>
137
+ </TabsTrigger>
138
+ </TabsList>
139
+
140
+ <TabsContent value="all">
141
+ <NotificationsList
142
+ pages={allNotifications.data}
143
+ isFetchingNextPage={allNotifications.isFetchingNextPage}
144
+ hasNextPage={allNotifications.hasNextPage}
145
+ fetchNextPage={allNotifications.fetchNextPage}
146
+ />
147
+ </TabsContent>
148
+
149
+ <TabsContent value="unreads">
150
+ <NotificationsList
151
+ pages={unreadNotifications.data}
152
+ isFetchingNextPage={unreadNotifications.isFetchingNextPage}
153
+ hasNextPage={unreadNotifications.hasNextPage}
154
+ fetchNextPage={unreadNotifications.fetchNextPage}
155
+ />
156
+ </TabsContent>
157
+ </Tabs>
158
+ </div>
159
+ );
160
+ }
@@ -1,57 +1,57 @@
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
-
8
- const buttonVariants = cva(
9
- "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",
10
- {
11
- variants: {
12
- variant: {
13
- default: " bg-gray-950 text-white hover:bg-gray-950/90",
14
- secondary:
15
- "bg-white text-gray-950 border-gray-200 hover:border-gray-400 border",
16
- ghost:
17
- "text-gray-600 hover:bg-accent hover:text-gray-950 dark:hover:bg-accent/50",
18
- brand: "bg-pages-300 hover:bg-pages-200 text-gray-950",
19
- },
20
- size: {
21
- default: "h-12 px-4 py-2 has-[>svg]:px-3",
22
- sm: "rounded-md gap-1.5 px-2 py-2 has-[>svg]:px-2.5",
23
- lg: "rounded-md px-6 has-[>svg]:px-4",
24
- icon: "size-9",
25
- "icon-sm": "size-8",
26
- "icon-lg": "size-10",
27
- },
28
- },
29
- defaultVariants: {
30
- variant: "default",
31
- size: "default",
32
- },
33
- }
34
- )
35
-
36
- function Button({
37
- className,
38
- variant,
39
- size,
40
- asChild = false,
41
- ...props
42
- }: React.ComponentProps<"button"> &
43
- VariantProps<typeof buttonVariants> & {
44
- asChild?: boolean
45
- }) {
46
- const Comp = asChild ? Slot : "button"
47
-
48
- return (
49
- <Comp
50
- data-slot="button"
51
- className={cn(buttonVariants({ variant, size, className }))}
52
- {...props}
53
- />
54
- )
55
- }
56
-
57
- 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
+
8
+ const buttonVariants = cva(
9
+ "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",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ default: " bg-gray-950 text-white hover:bg-gray-950/90",
14
+ secondary:
15
+ "bg-white text-gray-950 border-gray-200 hover:border-gray-400 border",
16
+ ghost:
17
+ "text-gray-600 hover:bg-accent hover:text-gray-950 dark:hover:bg-accent/50",
18
+ brand: "bg-pages-300 hover:bg-pages-200 text-gray-950",
19
+ },
20
+ size: {
21
+ default: "h-12 px-4 py-2 has-[>svg]:px-3",
22
+ sm: "rounded-md gap-1.5 px-2 py-2 has-[>svg]:px-2.5",
23
+ lg: "rounded-md px-6 has-[>svg]:px-4",
24
+ icon: "size-9",
25
+ "icon-sm": "size-8",
26
+ "icon-lg": "size-10",
27
+ },
28
+ },
29
+ defaultVariants: {
30
+ variant: "default",
31
+ size: "default",
32
+ },
33
+ }
34
+ )
35
+
36
+ function Button({
37
+ className,
38
+ variant,
39
+ size,
40
+ asChild = false,
41
+ ...props
42
+ }: React.ComponentProps<"button"> &
43
+ VariantProps<typeof buttonVariants> & {
44
+ asChild?: boolean
45
+ }) {
46
+ const Comp = asChild ? Slot : "button"
47
+
48
+ return (
49
+ <Comp
50
+ data-slot="button"
51
+ className={cn(buttonVariants({ variant, size, className }))}
52
+ {...props}
53
+ />
54
+ )
55
+ }
56
+
57
+ export { Button, buttonVariants }
@@ -1,14 +1,14 @@
1
- 'use client';
2
-
3
- import * as React from "react";
4
-
5
- export default function CancelButton({
6
- ...props
7
- }: React.ComponentProps<"button">) {
8
- return (
9
- <button
10
- className="flex h-8 px-2 justify-center items-center rounded-lg bg-red-50 text-red-600 font-semibold text-sm px-3 cursor-pointer hover:bg-red-100"
11
- {...props}
12
- />
13
- );
14
- }
1
+ 'use client';
2
+
3
+ import * as React from "react";
4
+
5
+ export default function CancelButton({
6
+ ...props
7
+ }: React.ComponentProps<"button">) {
8
+ return (
9
+ <button
10
+ className="flex h-8 px-2 justify-center items-center rounded-lg bg-red-50 text-red-600 font-semibold text-sm px-3 cursor-pointer hover:bg-red-100"
11
+ {...props}
12
+ />
13
+ );
14
+ }
@@ -1,54 +1,54 @@
1
- 'use client';
2
-
3
- import { IconCheck, IconCopy } from '@tabler/icons-react';
4
- import { toast } from "sonner";
5
- import { Toast } from "../feedback/Toast";
6
- import { Tooltip, TooltipContent, TooltipTrigger } from "../overlay/Tooltip";
7
- import useCopyToClipboard from "../../../hooks/copy-to-clipboard.hook";
8
- import { cn } from "../../../infra/utils/clsx";
9
-
10
- interface CopyButtonProps {
11
- textToCopy: string;
12
- size?: number;
13
- className?: string;
14
- tooltipText?: string;
15
- successMessage?: string;
16
- }
17
-
18
- export function CopyButton({
19
- textToCopy,
20
- size = 14,
21
- className,
22
- tooltipText = "Copiar link",
23
- successMessage = "Link copiado",
24
- }: CopyButtonProps) {
25
- const { isCopied, copy } = useCopyToClipboard({
26
- onSuccess: () => {
27
- toast.custom((t) => (
28
- <Toast variant="success" message={successMessage} toastId={t} />
29
- ));
30
- },
31
- onError: () => {
32
- toast.custom((t) => (
33
- <Toast variant="error" message="Não foi possível copiar o link" toastId={t} />
34
- ));
35
- },
36
- });
37
-
38
- return (
39
- <Tooltip>
40
- <TooltipTrigger
41
- asChild
42
- onClick={(e: React.MouseEvent) => {
43
- e.stopPropagation();
44
- copy(textToCopy);
45
- }}
46
- >
47
- <span className={cn("cursor-pointer text-gray-500", className)}>
48
- {isCopied ? <IconCheck size={size} /> : <IconCopy size={size} />}
49
- </span>
50
- </TooltipTrigger>
51
- <TooltipContent>{isCopied ? "Copiado!" : tooltipText}</TooltipContent>
52
- </Tooltip>
53
- );
54
- }
1
+ 'use client';
2
+
3
+ import { IconCheck, IconCopy } from '@tabler/icons-react';
4
+ import { toast } from "sonner";
5
+ import { Toast } from "../feedback/Toast";
6
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../overlay/Tooltip";
7
+ import useCopyToClipboard from "../../../hooks/copy-to-clipboard.hook";
8
+ import { cn } from "../../../infra/utils/clsx";
9
+
10
+ interface CopyButtonProps {
11
+ textToCopy: string;
12
+ size?: number;
13
+ className?: string;
14
+ tooltipText?: string;
15
+ successMessage?: string;
16
+ }
17
+
18
+ export function CopyButton({
19
+ textToCopy,
20
+ size = 14,
21
+ className,
22
+ tooltipText = "Copiar link",
23
+ successMessage = "Link copiado",
24
+ }: CopyButtonProps) {
25
+ const { isCopied, copy } = useCopyToClipboard({
26
+ onSuccess: () => {
27
+ toast.custom((t) => (
28
+ <Toast variant="success" message={successMessage} toastId={t} />
29
+ ));
30
+ },
31
+ onError: () => {
32
+ toast.custom((t) => (
33
+ <Toast variant="error" message="Não foi possível copiar o link" toastId={t} />
34
+ ));
35
+ },
36
+ });
37
+
38
+ return (
39
+ <Tooltip>
40
+ <TooltipTrigger
41
+ asChild
42
+ onClick={(e: React.MouseEvent) => {
43
+ e.stopPropagation();
44
+ copy(textToCopy);
45
+ }}
46
+ >
47
+ <span className={cn("cursor-pointer text-gray-500", className)}>
48
+ {isCopied ? <IconCheck size={size} /> : <IconCopy size={size} />}
49
+ </span>
50
+ </TooltipTrigger>
51
+ <TooltipContent>{isCopied ? "Copiado!" : tooltipText}</TooltipContent>
52
+ </Tooltip>
53
+ );
54
+ }