@greatapps/common 1.1.379 → 1.1.381

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 (347) 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/CollapsibleSidebar.mjs.map +1 -1
  24. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  25. package/dist/components/layouts/NavBar.mjs.map +1 -1
  26. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  27. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  28. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  29. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  30. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  31. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  32. package/dist/components/modals/ModalManager.mjs.map +1 -1
  33. package/dist/components/modals/Modals.mjs.map +1 -1
  34. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  35. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  36. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  37. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  38. package/dist/components/navigation/ProjectSelectorPopover.mjs +69 -40
  39. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  40. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  41. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +59 -32
  42. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  43. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  44. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  45. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  46. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  47. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  48. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  51. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  52. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  53. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  54. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  55. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  59. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  60. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  61. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  62. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  63. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  64. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  65. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  66. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  67. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  68. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  69. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  70. package/dist/components/ui/form/FormField.mjs.map +1 -1
  71. package/dist/components/ui/form/Input.mjs.map +1 -1
  72. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  73. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  74. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  75. package/dist/components/ui/form/Select.mjs +1 -1
  76. package/dist/components/ui/form/Select.mjs.map +1 -1
  77. package/dist/components/ui/form/Switch.mjs.map +1 -1
  78. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  79. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  80. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  83. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  84. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  85. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  86. package/dist/hooks/useDebounce.mjs.map +1 -1
  87. package/dist/hooks/useDebounceState.mjs.map +1 -1
  88. package/dist/hooks/useDebouncedEffect.mjs.map +1 -1
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/infra/utils/clsx.mjs.map +1 -1
  91. package/dist/infra/utils/date.mjs.map +1 -1
  92. package/dist/infra/utils/parser.mjs.map +1 -1
  93. package/dist/infra/utils/percentage.mjs.map +1 -1
  94. package/dist/middleware.mjs.map +1 -1
  95. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  96. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  97. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  98. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  99. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  100. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  101. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  104. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  105. package/dist/modules/accounts/services/two-factor.service.mjs +3 -2
  106. package/dist/modules/accounts/services/two-factor.service.mjs.map +1 -1
  107. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  108. package/dist/modules/auth/actions/verify-two-factor.action.mjs +2 -2
  109. package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
  110. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  111. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  112. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  113. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  114. package/dist/modules/auth/hooks/useUserQuery.mjs +2 -2
  115. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  116. package/dist/modules/auth/services/auth.service.mjs +3 -2
  117. package/dist/modules/auth/services/auth.service.mjs.map +1 -1
  118. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  119. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  120. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  121. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  122. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  123. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  124. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  125. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  126. package/dist/modules/cards/types.mjs.map +1 -1
  127. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  128. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  129. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  130. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  131. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  132. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  133. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  134. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  135. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  136. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  137. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  138. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  139. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  140. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  141. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  142. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  143. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  144. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  145. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  146. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  147. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  148. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  149. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  150. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  151. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  152. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  153. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  154. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  155. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  156. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  157. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  158. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  159. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  160. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  161. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  162. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  163. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  164. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  165. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  166. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  167. package/dist/store/useAccountModals.mjs.map +1 -1
  168. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  169. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  170. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  171. package/dist/store/useModalManager.mjs.map +1 -1
  172. package/dist/utils/constants/br-states.mjs.map +1 -1
  173. package/dist/utils/countries.mjs.map +1 -1
  174. package/dist/utils/safeServerAction.mjs.map +1 -1
  175. package/dist/utils/withAction.mjs.map +1 -1
  176. package/package.json +89 -89
  177. package/src/components/account/AccountModals.tsx +17 -17
  178. package/src/components/account/ConfigurationsMyAccountModal.tsx +146 -146
  179. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  180. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  181. package/src/components/account/DeleteAccountModal.tsx +130 -130
  182. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  183. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  184. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  185. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  186. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  187. package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
  188. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  189. package/src/components/account/sections/ChangePhoneModal.tsx +245 -245
  190. package/src/components/account/sections/MyProfileSection.tsx +327 -327
  191. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  192. package/src/components/account/sections/SecuritySection.tsx +46 -46
  193. package/src/components/embeds/CrispEmbed.tsx +101 -101
  194. package/src/components/embeds/FrillEmbed.tsx +119 -119
  195. package/src/components/handlers/SearchParamsHandler.tsx +61 -61
  196. package/src/components/layouts/AppMobileNavBar.tsx +118 -118
  197. package/src/components/layouts/AppNavBar.tsx +46 -46
  198. package/src/components/layouts/CollapsibleSidebar.tsx +67 -67
  199. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  200. package/src/components/layouts/NavBar.tsx +172 -172
  201. package/src/components/layouts/NotificationsPopover.tsx +115 -115
  202. package/src/components/layouts/ProfilePopover.tsx +174 -174
  203. package/src/components/layouts/SideBarNavigation.tsx +62 -62
  204. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  205. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  206. package/src/components/modals/BuyCreditsModal.tsx +314 -314
  207. package/src/components/modals/ModalManager.tsx +29 -29
  208. package/src/components/modals/Modals.tsx +26 -26
  209. package/src/components/modals/cards/AddCardModal.tsx +260 -260
  210. package/src/components/modals/cards/CardFormFields.tsx +294 -294
  211. package/src/components/navigation/CancelledSubscriptionBanner.tsx +60 -60
  212. package/src/components/navigation/NavItemsContext.ts +20 -20
  213. package/src/components/navigation/ProjectSelectorPopover.tsx +194 -160
  214. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  215. package/src/components/navigation/subcomponents/ProjectSelector.tsx +190 -160
  216. package/src/components/pages/NotFoundPage.tsx +67 -67
  217. package/src/components/pages/notifications/Notifications.tsx +160 -160
  218. package/src/components/ui/buttons/Button.tsx +57 -57
  219. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  220. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  221. package/src/components/ui/data-display/Accordion.tsx +81 -81
  222. package/src/components/ui/data-display/Badge.tsx +47 -47
  223. package/src/components/ui/data-display/Card.tsx +93 -93
  224. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  225. package/src/components/ui/data-display/CardItem.tsx +75 -75
  226. package/src/components/ui/data-display/Pagination.tsx +126 -126
  227. package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
  228. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  229. package/src/components/ui/data-display/Separator.tsx +29 -29
  230. package/src/components/ui/data-display/Table.tsx +117 -117
  231. package/src/components/ui/data-display/Tabs.tsx +67 -67
  232. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  233. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  234. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  235. package/src/components/ui/feedback/Progress.tsx +40 -40
  236. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  237. package/src/components/ui/feedback/Toast.tsx +101 -101
  238. package/src/components/ui/form/Calendar.tsx +228 -228
  239. package/src/components/ui/form/Checkbox.tsx +31 -31
  240. package/src/components/ui/form/ComboboxField.tsx +154 -154
  241. package/src/components/ui/form/DatePicker.tsx +97 -97
  242. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  243. package/src/components/ui/form/FormField.tsx +131 -131
  244. package/src/components/ui/form/Input.tsx +20 -20
  245. package/src/components/ui/form/InputOtp.tsx +80 -80
  246. package/src/components/ui/form/PhoneInput.tsx +208 -208
  247. package/src/components/ui/form/RadioGroup.tsx +45 -45
  248. package/src/components/ui/form/Select.tsx +200 -200
  249. package/src/components/ui/form/Switch.tsx +32 -32
  250. package/src/components/ui/form/Textarea.tsx +19 -19
  251. package/src/components/ui/overlay/Command.tsx +185 -185
  252. package/src/components/ui/overlay/Dialog.tsx +151 -151
  253. package/src/components/ui/overlay/Popover.tsx +49 -49
  254. package/src/components/ui/overlay/Sheet.tsx +166 -166
  255. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  256. package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
  257. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  258. package/src/hooks/useDebounce.ts +26 -26
  259. package/src/hooks/useDebounceState.ts +11 -11
  260. package/src/hooks/useDebouncedEffect.ts +69 -69
  261. package/src/index.ts +391 -391
  262. package/src/infra/utils/clsx.ts +6 -6
  263. package/src/infra/utils/date.ts +7 -7
  264. package/src/infra/utils/parser.ts +52 -52
  265. package/src/infra/utils/percentage.ts +42 -42
  266. package/src/middleware.ts +4 -4
  267. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  268. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  269. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  270. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  271. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  272. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  273. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  274. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  275. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  276. package/src/modules/accounts/services/account.service.ts +239 -239
  277. package/src/modules/accounts/services/two-factor.service.ts +3 -2
  278. package/src/modules/accounts/types.ts +225 -225
  279. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  280. package/src/modules/auth/actions/verify-two-factor.action.ts +2 -2
  281. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  282. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  283. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  284. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  285. package/src/modules/auth/hooks/useUserQuery.ts +2 -2
  286. package/src/modules/auth/services/auth.service.ts +3 -1
  287. package/src/modules/auth/types/management-permission.type.ts +7 -7
  288. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  289. package/src/modules/auth/utils/assert-management-subscription.ts +27 -27
  290. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  291. package/src/modules/cards/actions/create-card.action.ts +9 -9
  292. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  293. package/src/modules/cards/hooks/cards.hook.ts +14 -14
  294. package/src/modules/cards/hooks/create-card.hook.ts +18 -18
  295. package/src/modules/cards/services/cards.service.ts +51 -51
  296. package/src/modules/cards/types.ts +32 -32
  297. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  298. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  299. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +17 -17
  300. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
  301. package/src/modules/plans/services/plans.service.ts +36 -36
  302. package/src/modules/plans/types/plan.type.ts +21 -21
  303. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  304. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  305. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  306. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  307. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  308. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  309. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  310. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  311. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  312. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  313. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  314. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  315. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  316. package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
  317. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  318. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  319. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
  320. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
  321. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  322. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  323. package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
  324. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  325. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  326. package/src/modules/subscriptions/utils/periodicity.ts +52 -52
  327. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  328. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  329. package/src/modules/users/action/list-messages.action.ts +12 -12
  330. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  331. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  332. package/src/modules/users/hooks/messages.hook.ts +60 -60
  333. package/src/modules/users/services/messages.service.ts +48 -48
  334. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  335. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  336. package/src/modules/whitelabel/schema.ts +84 -84
  337. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  338. package/src/providers/whitelabel.provider.tsx +54 -54
  339. package/src/store/useAccountModals.ts +55 -55
  340. package/src/store/useBuyCreditsModal.ts +21 -21
  341. package/src/store/useDesktopSidebarStore.ts +47 -47
  342. package/src/store/useMdSidebarStore.ts +34 -34
  343. package/src/store/useModalManager.ts +104 -104
  344. package/src/utils/constants/br-states.ts +29 -29
  345. package/src/utils/countries.ts +224 -224
  346. package/src/utils/safeServerAction.ts +21 -21
  347. package/src/utils/withAction.ts +13 -13
@@ -1,172 +1,172 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import Image from "next/image";
5
- import { IconChevronRight } from "@tabler/icons-react";
6
- import { Separator } from "../ui/data-display/Separator";
7
- import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
8
- import { useDesktopSidebarStore, useDesktopSidebarHydration } from "../../store/useDesktopSidebarStore";
9
- import { useWhitelabel } from "../../providers/whitelabel.provider";
10
- import { cn } from "../../infra/utils/clsx";
11
-
12
- type NavBarProps = {
13
- onLogoClick: () => void;
14
- onAppIconClick?: () => void;
15
- activeApp?: "gapps" | "gpages";
16
- showExpandButton?: boolean;
17
- onExpandClick?: () => void;
18
- children?: React.ReactNode;
19
- className?: string;
20
- };
21
-
22
- function NavBar({
23
- onLogoClick,
24
- onAppIconClick,
25
- activeApp,
26
- showExpandButton = false,
27
- onExpandClick,
28
- children,
29
- className,
30
- }: NavBarProps) {
31
- const { isExpanded: isDesktopExpanded, toggle: toggleDesktop } =
32
- useDesktopSidebarStore();
33
- useDesktopSidebarHydration();
34
- const { whitelabel } = useWhitelabel();
35
- const isDefaultWl = !whitelabel || whitelabel.id === 1;
36
- const primaryColor = whitelabel?.general?.primary_color;
37
- const wlName = whitelabel?.name || 'Great';
38
-
39
- return (
40
- <div
41
- className={cn(
42
- "hidden md:flex flex-col justify-between h-screen p-4 border-r border-gray-200 overflow-visible z-40 bg-white",
43
- className,
44
- )}
45
- >
46
- <div className="flex flex-col gap-4 items-center mt-[6.5px]">
47
- {/* GreatApps logo */}
48
- <div className="relative">
49
- <Tooltip>
50
- <TooltipTrigger
51
- className="cursor-pointer"
52
- asChild
53
- onClick={onLogoClick}
54
- >
55
- {isDefaultWl ? (
56
- <Image
57
- src="/icons/great-icon.svg"
58
- alt="Great Icon"
59
- width={28}
60
- height={28}
61
- />
62
- ) : (
63
- <div
64
- className={cn("size-10 rounded-lg flex items-center justify-center transition-opacity duration-300", activeApp !== "gapps" && "opacity-20")}
65
- style={{ backgroundColor: primaryColor }}
66
- >
67
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
68
- <path d="M4 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
69
- <path d="M14 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
70
- <path d="M4 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
71
- <path d="M14 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
72
- </svg>
73
- </div>
74
- )}
75
- </TooltipTrigger>
76
- <TooltipContent side="right">{wlName}</TooltipContent>
77
- </Tooltip>
78
- <div
79
- className={cn(
80
- "absolute -left-[22px] top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 rounded-r-xl transition-opacity duration-300",
81
- isDefaultWl ? "bg-gray-950" : "",
82
- activeApp === "gapps" ? "opacity-100" : "opacity-0",
83
- )}
84
- style={!isDefaultWl ? { backgroundColor: primaryColor } : undefined}
85
- />
86
- </div>
87
-
88
- <div className="relative w-full mt-[7.5px]">
89
- <Separator />
90
- {/* Md expand button */}
91
- {showExpandButton && (
92
- <Tooltip>
93
- <TooltipTrigger asChild>
94
- <button
95
- onClick={onExpandClick}
96
- className="hidden md:flex lg:hidden absolute top-1/2 -translate-y-1/2 right-0 translate-x-[calc(50%+1rem)] size-8 items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-10"
97
- >
98
- <IconChevronRight size={16} className="text-gray-500" />
99
- </button>
100
- </TooltipTrigger>
101
- <TooltipContent side="right">Expandir menu</TooltipContent>
102
- </Tooltip>
103
- )}
104
- {/* Desktop expand button */}
105
- {!isDesktopExpanded && (
106
- <Tooltip>
107
- <TooltipTrigger asChild>
108
- <button
109
- onClick={toggleDesktop}
110
- className="hidden lg:flex absolute top-1/2 -translate-y-1/2 right-0 translate-x-[calc(50%+1rem)] size-8 items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-10"
111
- >
112
- <IconChevronRight size={16} className="text-gray-500" />
113
- </button>
114
- </TooltipTrigger>
115
- <TooltipContent side="right">Expandir menu</TooltipContent>
116
- </Tooltip>
117
- )}
118
- </div>
119
-
120
- {/* GreatPages icon */}
121
- <div className="relative">
122
- <Tooltip>
123
- <TooltipTrigger asChild onClick={onAppIconClick}>
124
- <div
125
- className={cn(
126
- "size-10 rounded-lg cursor-pointer flex items-center justify-center border-2 ring-2 transition-colors duration-300",
127
- activeApp === "gpages"
128
- ? isDefaultWl
129
- ? "bg-cyan-100 border-white ring-cyan-300"
130
- : "border-white ring-transparent"
131
- : isDefaultWl
132
- ? "hover:bg-gray-100 border-transparent ring-transparent"
133
- : "border-transparent ring-transparent",
134
- )}
135
- style={!isDefaultWl ? { backgroundColor: primaryColor, boxShadow: activeApp === "gpages" ? `0 0 0 2px ${primaryColor}40` : undefined, opacity: activeApp !== "gpages" ? 0.2 : undefined } : undefined}
136
- >
137
- {isDefaultWl ? (
138
- <Image
139
- src="/icons/icon-navbar.svg"
140
- alt="GreatPages"
141
- width={24}
142
- height={24}
143
- />
144
- ) : (
145
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
146
- <path d="M4 8h16" />
147
- <path d="M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" />
148
- <path d="M8 4v4" />
149
- </svg>
150
- )}
151
- </div>
152
- </TooltipTrigger>
153
- <TooltipContent side="right">{isDefaultWl ? 'GreatPages' : 'Páginas'}</TooltipContent>
154
- </Tooltip>
155
- <div
156
- className={cn(
157
- "absolute -left-4 top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 rounded-r-xl transition-opacity duration-300",
158
- isDefaultWl ? "bg-cyan-300" : "",
159
- activeApp === "gpages" ? "opacity-100" : "opacity-0",
160
- )}
161
- style={!isDefaultWl ? { backgroundColor: primaryColor } : undefined}
162
- />
163
- </div>
164
- </div>
165
-
166
- <div className="flex flex-col items-center gap-2">{children}</div>
167
- </div>
168
- );
169
- }
170
-
171
- export { NavBar };
172
- export type { NavBarProps };
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import Image from "next/image";
5
+ import { IconChevronRight } from "@tabler/icons-react";
6
+ import { Separator } from "../ui/data-display/Separator";
7
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
8
+ import { useDesktopSidebarStore, useDesktopSidebarHydration } from "../../store/useDesktopSidebarStore";
9
+ import { useWhitelabel } from "../../providers/whitelabel.provider";
10
+ import { cn } from "../../infra/utils/clsx";
11
+
12
+ type NavBarProps = {
13
+ onLogoClick: () => void;
14
+ onAppIconClick?: () => void;
15
+ activeApp?: "gapps" | "gpages";
16
+ showExpandButton?: boolean;
17
+ onExpandClick?: () => void;
18
+ children?: React.ReactNode;
19
+ className?: string;
20
+ };
21
+
22
+ function NavBar({
23
+ onLogoClick,
24
+ onAppIconClick,
25
+ activeApp,
26
+ showExpandButton = false,
27
+ onExpandClick,
28
+ children,
29
+ className,
30
+ }: NavBarProps) {
31
+ const { isExpanded: isDesktopExpanded, toggle: toggleDesktop } =
32
+ useDesktopSidebarStore();
33
+ useDesktopSidebarHydration();
34
+ const { whitelabel } = useWhitelabel();
35
+ const isDefaultWl = !whitelabel || whitelabel.id === 1;
36
+ const primaryColor = whitelabel?.general?.primary_color;
37
+ const wlName = whitelabel?.name || 'Great';
38
+
39
+ return (
40
+ <div
41
+ className={cn(
42
+ "hidden md:flex flex-col justify-between h-screen p-4 border-r border-gray-200 overflow-visible z-40 bg-white",
43
+ className,
44
+ )}
45
+ >
46
+ <div className="flex flex-col gap-4 items-center mt-[6.5px]">
47
+ {/* GreatApps logo */}
48
+ <div className="relative">
49
+ <Tooltip>
50
+ <TooltipTrigger
51
+ className="cursor-pointer"
52
+ asChild
53
+ onClick={onLogoClick}
54
+ >
55
+ {isDefaultWl ? (
56
+ <Image
57
+ src="/icons/great-icon.svg"
58
+ alt="Great Icon"
59
+ width={28}
60
+ height={28}
61
+ />
62
+ ) : (
63
+ <div
64
+ className={cn("size-10 rounded-lg flex items-center justify-center transition-opacity duration-300", activeApp !== "gapps" && "opacity-20")}
65
+ style={{ backgroundColor: primaryColor }}
66
+ >
67
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
68
+ <path d="M4 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
69
+ <path d="M14 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
70
+ <path d="M4 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
71
+ <path d="M14 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
72
+ </svg>
73
+ </div>
74
+ )}
75
+ </TooltipTrigger>
76
+ <TooltipContent side="right">{wlName}</TooltipContent>
77
+ </Tooltip>
78
+ <div
79
+ className={cn(
80
+ "absolute -left-[22px] top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 rounded-r-xl transition-opacity duration-300",
81
+ isDefaultWl ? "bg-gray-950" : "",
82
+ activeApp === "gapps" ? "opacity-100" : "opacity-0",
83
+ )}
84
+ style={!isDefaultWl ? { backgroundColor: primaryColor } : undefined}
85
+ />
86
+ </div>
87
+
88
+ <div className="relative w-full mt-[7.5px]">
89
+ <Separator />
90
+ {/* Md expand button */}
91
+ {showExpandButton && (
92
+ <Tooltip>
93
+ <TooltipTrigger asChild>
94
+ <button
95
+ onClick={onExpandClick}
96
+ className="hidden md:flex lg:hidden absolute top-1/2 -translate-y-1/2 right-0 translate-x-[calc(50%+1rem)] size-8 items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-10"
97
+ >
98
+ <IconChevronRight size={16} className="text-gray-500" />
99
+ </button>
100
+ </TooltipTrigger>
101
+ <TooltipContent side="right">Expandir menu</TooltipContent>
102
+ </Tooltip>
103
+ )}
104
+ {/* Desktop expand button */}
105
+ {!isDesktopExpanded && (
106
+ <Tooltip>
107
+ <TooltipTrigger asChild>
108
+ <button
109
+ onClick={toggleDesktop}
110
+ className="hidden lg:flex absolute top-1/2 -translate-y-1/2 right-0 translate-x-[calc(50%+1rem)] size-8 items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-10"
111
+ >
112
+ <IconChevronRight size={16} className="text-gray-500" />
113
+ </button>
114
+ </TooltipTrigger>
115
+ <TooltipContent side="right">Expandir menu</TooltipContent>
116
+ </Tooltip>
117
+ )}
118
+ </div>
119
+
120
+ {/* GreatPages icon */}
121
+ <div className="relative">
122
+ <Tooltip>
123
+ <TooltipTrigger asChild onClick={onAppIconClick}>
124
+ <div
125
+ className={cn(
126
+ "size-10 rounded-lg cursor-pointer flex items-center justify-center border-2 ring-2 transition-colors duration-300",
127
+ activeApp === "gpages"
128
+ ? isDefaultWl
129
+ ? "bg-cyan-100 border-white ring-cyan-300"
130
+ : "border-white ring-transparent"
131
+ : isDefaultWl
132
+ ? "hover:bg-gray-100 border-transparent ring-transparent"
133
+ : "border-transparent ring-transparent",
134
+ )}
135
+ style={!isDefaultWl ? { backgroundColor: primaryColor, boxShadow: activeApp === "gpages" ? `0 0 0 2px ${primaryColor}40` : undefined, opacity: activeApp !== "gpages" ? 0.2 : undefined } : undefined}
136
+ >
137
+ {isDefaultWl ? (
138
+ <Image
139
+ src="/icons/icon-navbar.svg"
140
+ alt="GreatPages"
141
+ width={24}
142
+ height={24}
143
+ />
144
+ ) : (
145
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
146
+ <path d="M4 8h16" />
147
+ <path d="M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" />
148
+ <path d="M8 4v4" />
149
+ </svg>
150
+ )}
151
+ </div>
152
+ </TooltipTrigger>
153
+ <TooltipContent side="right">{isDefaultWl ? 'GreatPages' : 'Páginas'}</TooltipContent>
154
+ </Tooltip>
155
+ <div
156
+ className={cn(
157
+ "absolute -left-4 top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 rounded-r-xl transition-opacity duration-300",
158
+ isDefaultWl ? "bg-cyan-300" : "",
159
+ activeApp === "gpages" ? "opacity-100" : "opacity-0",
160
+ )}
161
+ style={!isDefaultWl ? { backgroundColor: primaryColor } : undefined}
162
+ />
163
+ </div>
164
+ </div>
165
+
166
+ <div className="flex flex-col items-center gap-2">{children}</div>
167
+ </div>
168
+ );
169
+ }
170
+
171
+ export { NavBar };
172
+ export type { NavBarProps };
@@ -1,115 +1,115 @@
1
- "use client";
2
-
3
- import { useState } from "react";
4
- import { IconBell } from '@tabler/icons-react';
5
- import * as PopoverPrimitive from "@radix-ui/react-popover";
6
- import { Popover } from "../ui/overlay/Popover";
7
- import { Button } from "../ui/buttons/Button";
8
- import NotificationCard from "../widgets/notifications/NotificationCard";
9
- import { cn } from "../../infra/utils/clsx";
10
- import { useMessages, useMarkAllMessagesAsRead } from "../../modules/users/hooks/messages.hook";
11
- import { formatDistanceToNow } from "date-fns";
12
- import { ptBR } from "date-fns/locale";
13
-
14
- export interface NotificationsPopoverProps {
15
- onViewAll?: () => void;
16
- side?: "top" | "bottom" | "left" | "right";
17
- align?: "start" | "center" | "end";
18
- contentClassName?: string;
19
- badgeClassName?: string;
20
- }
21
-
22
- function NotificationsPopover({
23
- onViewAll,
24
- side,
25
- align,
26
- contentClassName,
27
- badgeClassName = "bg-cyan-300",
28
- }: NotificationsPopoverProps) {
29
- const [open, setOpen] = useState(false);
30
- const { data: messagesData } = useMessages({ type: 'notification', readed: true, limit: 5 });
31
- const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();
32
-
33
- const messages = messagesData?.data ?? [];
34
- const totalUnread = messagesData?.totalUnread ?? 0;
35
-
36
- const handleOpenChange = (isOpen: boolean) => {
37
- setOpen(isOpen);
38
- if (isOpen && totalUnread > 0) {
39
- markAllAsRead();
40
- }
41
- };
42
-
43
- return (
44
- <Popover open={open} onOpenChange={handleOpenChange}>
45
- <PopoverPrimitive.Trigger className="cursor-pointer">
46
- <div
47
- className={`relative rounded-full p-2.5 ${open ? "bg-gray-100" : "hover:bg-gray-100"}`}
48
- >
49
- <IconBell size={20} className="text-gray-500" />
50
- {totalUnread > 0 && (
51
- <span
52
- className={cn(
53
- "absolute top-0.5 right-0.5 size-3.5 rounded-full border-2 border-white",
54
- badgeClassName,
55
- )}
56
- />
57
- )}
58
- </div>
59
- </PopoverPrimitive.Trigger>
60
- <PopoverPrimitive.Portal>
61
- <PopoverPrimitive.Content
62
- className={cn(
63
- "absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200",
64
- contentClassName,
65
- )}
66
- side={side}
67
- align={align}
68
- sideOffset={8}
69
- >
70
- <span className="paragraph-small-semibold text-gray-950 px-4">
71
- Últimas notificações
72
- </span>
73
-
74
- {messages.length > 0 ? (
75
- messages.map((message, index) => (
76
- <NotificationCard
77
- key={message.id}
78
- icon={<IconBell size={16} />}
79
- iconBgColor="bg-gray-100"
80
- title={message.subject}
81
- time={formatDistanceToNow(new Date(message.datetime_add), {
82
- addSuffix: true,
83
- locale: ptBR,
84
- })}
85
- gapPx={6}
86
- showBorder={index < messages.length - 1}
87
- />
88
- ))
89
- ) : (
90
- <div className="flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]">
91
- <div className="bg-gray-50 rounded-md p-2.5">
92
- <IconBell size={20} color="var(--color-gray-950)" />
93
- </div>
94
- <span className="paragraph-small-medium text-gray-950">
95
- Sem notificações por enquanto
96
- </span>
97
- </div>
98
- )}
99
-
100
- {onViewAll && (
101
- <Button
102
- variant="secondary"
103
- className="h-8! mt-2 mb-4 mx-4 paragraph-small-semibold"
104
- onClick={onViewAll}
105
- >
106
- Todas as notificações
107
- </Button>
108
- )}
109
- </PopoverPrimitive.Content>
110
- </PopoverPrimitive.Portal>
111
- </Popover>
112
- );
113
- }
114
-
115
- export { NotificationsPopover };
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { IconBell } from '@tabler/icons-react';
5
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
6
+ import { Popover } from "../ui/overlay/Popover";
7
+ import { Button } from "../ui/buttons/Button";
8
+ import NotificationCard from "../widgets/notifications/NotificationCard";
9
+ import { cn } from "../../infra/utils/clsx";
10
+ import { useMessages, useMarkAllMessagesAsRead } from "../../modules/users/hooks/messages.hook";
11
+ import { formatDistanceToNow } from "date-fns";
12
+ import { ptBR } from "date-fns/locale";
13
+
14
+ export interface NotificationsPopoverProps {
15
+ onViewAll?: () => void;
16
+ side?: "top" | "bottom" | "left" | "right";
17
+ align?: "start" | "center" | "end";
18
+ contentClassName?: string;
19
+ badgeClassName?: string;
20
+ }
21
+
22
+ function NotificationsPopover({
23
+ onViewAll,
24
+ side,
25
+ align,
26
+ contentClassName,
27
+ badgeClassName = "bg-cyan-300",
28
+ }: NotificationsPopoverProps) {
29
+ const [open, setOpen] = useState(false);
30
+ const { data: messagesData } = useMessages({ type: 'notification', readed: true, limit: 5 });
31
+ const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();
32
+
33
+ const messages = messagesData?.data ?? [];
34
+ const totalUnread = messagesData?.totalUnread ?? 0;
35
+
36
+ const handleOpenChange = (isOpen: boolean) => {
37
+ setOpen(isOpen);
38
+ if (isOpen && totalUnread > 0) {
39
+ markAllAsRead();
40
+ }
41
+ };
42
+
43
+ return (
44
+ <Popover open={open} onOpenChange={handleOpenChange}>
45
+ <PopoverPrimitive.Trigger className="cursor-pointer">
46
+ <div
47
+ className={`relative rounded-full p-2.5 ${open ? "bg-gray-100" : "hover:bg-gray-100"}`}
48
+ >
49
+ <IconBell size={20} className="text-gray-500" />
50
+ {totalUnread > 0 && (
51
+ <span
52
+ className={cn(
53
+ "absolute top-0.5 right-0.5 size-3.5 rounded-full border-2 border-white",
54
+ badgeClassName,
55
+ )}
56
+ />
57
+ )}
58
+ </div>
59
+ </PopoverPrimitive.Trigger>
60
+ <PopoverPrimitive.Portal>
61
+ <PopoverPrimitive.Content
62
+ className={cn(
63
+ "absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200",
64
+ contentClassName,
65
+ )}
66
+ side={side}
67
+ align={align}
68
+ sideOffset={8}
69
+ >
70
+ <span className="paragraph-small-semibold text-gray-950 px-4">
71
+ Últimas notificações
72
+ </span>
73
+
74
+ {messages.length > 0 ? (
75
+ messages.map((message, index) => (
76
+ <NotificationCard
77
+ key={message.id}
78
+ icon={<IconBell size={16} />}
79
+ iconBgColor="bg-gray-100"
80
+ title={message.subject}
81
+ time={formatDistanceToNow(new Date(message.datetime_add), {
82
+ addSuffix: true,
83
+ locale: ptBR,
84
+ })}
85
+ gapPx={6}
86
+ showBorder={index < messages.length - 1}
87
+ />
88
+ ))
89
+ ) : (
90
+ <div className="flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]">
91
+ <div className="bg-gray-50 rounded-md p-2.5">
92
+ <IconBell size={20} color="var(--color-gray-950)" />
93
+ </div>
94
+ <span className="paragraph-small-medium text-gray-950">
95
+ Sem notificações por enquanto
96
+ </span>
97
+ </div>
98
+ )}
99
+
100
+ {onViewAll && (
101
+ <Button
102
+ variant="secondary"
103
+ className="h-8! mt-2 mb-4 mx-4 paragraph-small-semibold"
104
+ onClick={onViewAll}
105
+ >
106
+ Todas as notificações
107
+ </Button>
108
+ )}
109
+ </PopoverPrimitive.Content>
110
+ </PopoverPrimitive.Portal>
111
+ </Popover>
112
+ );
113
+ }
114
+
115
+ export { NotificationsPopover };