@greatapps/common 1.1.217 → 1.1.219

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 (254) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +5 -5
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs +2 -2
  4. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  5. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +2 -2
  6. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  7. package/dist/components/account/DeleteAccountModal.mjs +3 -3
  8. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  9. package/dist/components/account/DisableTwoFactorAuthModal.mjs +2 -2
  10. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  11. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +2 -2
  12. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  13. package/dist/components/account/TwoFactorAuthModal.mjs +6 -6
  14. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  15. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  16. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  17. package/dist/components/account/sections/ChangeEmailModal.mjs +6 -6
  18. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  19. package/dist/components/account/sections/ChangePasswordSection.mjs +4 -4
  20. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  21. package/dist/components/account/sections/ChangePhoneModal.mjs +5 -5
  22. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  23. package/dist/components/account/sections/MyProfileSection.mjs +3 -3
  24. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  25. package/dist/components/account/sections/PreferencesSection.mjs +6 -6
  26. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  27. package/dist/components/account/sections/SecuritySection.mjs +3 -3
  28. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  29. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  30. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  31. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  32. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  33. package/dist/components/layouts/MdSideBarNavigation.mjs +2 -2
  34. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  35. package/dist/components/layouts/NavBar.mjs +2 -2
  36. package/dist/components/layouts/NavBar.mjs.map +1 -1
  37. package/dist/components/layouts/NotificationsPopover.mjs +4 -4
  38. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  39. package/dist/components/layouts/ProfilePopover.mjs +2 -2
  40. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  41. package/dist/components/layouts/UsersSelectorPopover.mjs +5 -5
  42. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  43. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  44. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  45. package/dist/components/navigation/ProjectSelectorPopover.mjs +6 -6
  46. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  47. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  48. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +5 -5
  49. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  50. package/dist/components/pages/notifications/Notifications.mjs +5 -5
  51. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  52. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  53. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  54. package/dist/components/ui/buttons/CopyButton.mjs +2 -2
  55. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Accordion.mjs +2 -2
  57. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  60. package/dist/components/ui/data-display/Pagination.mjs +7 -7
  61. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  62. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  63. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  64. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  65. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  66. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  67. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  68. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  69. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  70. package/dist/components/ui/feedback/Toast.mjs +7 -7
  71. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  72. package/dist/components/ui/form/Calendar.mjs +7 -7
  73. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  74. package/dist/components/ui/form/Checkbox.mjs +2 -2
  75. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  76. package/dist/components/ui/form/ComboboxField.mjs +4 -4
  77. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  78. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  79. package/dist/components/ui/form/DateRangePicker.mjs +2 -2
  80. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  81. package/dist/components/ui/form/FormField.mjs +3 -3
  82. package/dist/components/ui/form/FormField.mjs.map +1 -1
  83. package/dist/components/ui/form/Input.mjs.map +1 -1
  84. package/dist/components/ui/form/InputOtp.mjs +2 -2
  85. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  86. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  87. package/dist/components/ui/form/RadioGroup.mjs +2 -2
  88. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  89. package/dist/components/ui/form/Select.mjs +6 -6
  90. package/dist/components/ui/form/Select.mjs.map +1 -1
  91. package/dist/components/ui/form/Switch.mjs.map +1 -1
  92. package/dist/components/ui/form/SwitchOptionFieldWithIcon.mjs.map +1 -1
  93. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  94. package/dist/components/ui/overlay/Command.mjs +2 -2
  95. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  96. package/dist/components/ui/overlay/Dialog.mjs +2 -2
  97. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  98. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  99. package/dist/components/ui/overlay/Sheet.mjs +2 -2
  100. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  101. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  102. package/dist/components/widgets/notifications/NotificationCard.mjs +2 -2
  103. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  104. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/middleware.mjs.map +1 -1
  107. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  108. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  109. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  110. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  111. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  112. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  113. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  114. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  115. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  116. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  117. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  118. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  119. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  120. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  121. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  122. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  123. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  124. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  125. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  126. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  127. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  128. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  129. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  130. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  131. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  132. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  133. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  134. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  135. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  136. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  137. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  138. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  139. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  140. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  141. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  142. package/dist/utils/countries.mjs.map +1 -1
  143. package/dist/utils/safeServerAction.mjs.map +1 -1
  144. package/dist/utils/withAction.mjs.map +1 -1
  145. package/package.json +89 -90
  146. package/src/components/account/ConfigurationsMyAccountModal.tsx +5 -5
  147. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  148. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +2 -2
  149. package/src/components/account/DeleteAccountModal.tsx +130 -130
  150. package/src/components/account/DisableTwoFactorAuthModal.tsx +2 -2
  151. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  152. package/src/components/account/TwoFactorAuthModal.tsx +6 -6
  153. package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
  154. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  155. package/src/components/account/sections/ChangeEmailModal.tsx +6 -6
  156. package/src/components/account/sections/ChangePasswordSection.tsx +4 -4
  157. package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
  158. package/src/components/account/sections/MyProfileSection.tsx +3 -3
  159. package/src/components/account/sections/PreferencesSection.tsx +6 -6
  160. package/src/components/account/sections/SecuritySection.tsx +3 -3
  161. package/src/components/embeds/CrispEmbed.tsx +101 -101
  162. package/src/components/embeds/FrillEmbed.tsx +119 -119
  163. package/src/components/layouts/AppMobileNavBar.tsx +111 -111
  164. package/src/components/layouts/AppNavBar.tsx +57 -57
  165. package/src/components/layouts/MdSideBarNavigation.tsx +4 -4
  166. package/src/components/layouts/NavBar.tsx +120 -120
  167. package/src/components/layouts/NotificationsPopover.tsx +4 -4
  168. package/src/components/layouts/ProfilePopover.tsx +2 -2
  169. package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
  170. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  171. package/src/components/navigation/NavItemsContext.ts +20 -20
  172. package/src/components/navigation/ProjectSelectorPopover.tsx +6 -6
  173. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  174. package/src/components/navigation/subcomponents/ProjectSelector.tsx +5 -5
  175. package/src/components/pages/notifications/Notifications.tsx +160 -160
  176. package/src/components/ui/buttons/Button.tsx +57 -57
  177. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  178. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  179. package/src/components/ui/data-display/Accordion.tsx +81 -81
  180. package/src/components/ui/data-display/Badge.tsx +47 -47
  181. package/src/components/ui/data-display/Card.tsx +93 -93
  182. package/src/components/ui/data-display/Pagination.tsx +126 -126
  183. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  184. package/src/components/ui/data-display/Separator.tsx +29 -29
  185. package/src/components/ui/data-display/Table.tsx +117 -117
  186. package/src/components/ui/data-display/Tabs.tsx +67 -67
  187. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  188. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  189. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  190. package/src/components/ui/feedback/Progress.tsx +40 -40
  191. package/src/components/ui/feedback/Toast.tsx +101 -101
  192. package/src/components/ui/form/Calendar.tsx +228 -228
  193. package/src/components/ui/form/Checkbox.tsx +31 -31
  194. package/src/components/ui/form/ComboboxField.tsx +4 -4
  195. package/src/components/ui/form/DatePicker.tsx +97 -97
  196. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  197. package/src/components/ui/form/FormField.tsx +6 -5
  198. package/src/components/ui/form/Input.tsx +20 -20
  199. package/src/components/ui/form/InputOtp.tsx +80 -80
  200. package/src/components/ui/form/PhoneInput.tsx +205 -205
  201. package/src/components/ui/form/RadioGroup.tsx +45 -45
  202. package/src/components/ui/form/Select.tsx +200 -200
  203. package/src/components/ui/form/Switch.tsx +32 -32
  204. package/src/components/ui/form/SwitchOptionFieldWithIcon.tsx +2 -2
  205. package/src/components/ui/form/Textarea.tsx +19 -19
  206. package/src/components/ui/overlay/Command.tsx +185 -185
  207. package/src/components/ui/overlay/Dialog.tsx +151 -151
  208. package/src/components/ui/overlay/Popover.tsx +49 -49
  209. package/src/components/ui/overlay/Sheet.tsx +166 -166
  210. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  211. package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
  212. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  213. package/src/index.ts +355 -355
  214. package/src/middleware.ts +4 -4
  215. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  216. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  217. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  218. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  219. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  220. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  221. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  222. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  223. package/src/modules/accounts/services/account.service.ts +236 -236
  224. package/src/modules/accounts/types.ts +214 -214
  225. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  226. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  227. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  228. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  229. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  230. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  231. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  232. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  233. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  234. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  235. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  236. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  237. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  238. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  239. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  240. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  241. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  242. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  243. package/src/modules/users/action/list-messages.action.ts +12 -12
  244. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  245. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  246. package/src/modules/users/hooks/messages.hook.ts +60 -60
  247. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  248. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  249. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
  250. package/src/modules/whitelabel/styles-schema.ts +37 -37
  251. package/src/providers/whitelabel.provider.tsx +46 -46
  252. package/src/utils/countries.ts +224 -224
  253. package/src/utils/safeServerAction.ts +21 -21
  254. package/src/utils/withAction.ts +13 -13
@@ -16,7 +16,7 @@ import {
16
16
  TooltipTrigger,
17
17
  UserAvatar,
18
18
  } from '../../index';
19
- import { CheckIcon, ChevronDown, FolderOpen, Plus, Settings } from 'lucide-react';
19
+ import { IconCheck, IconChevronDown, IconFolderOpen, IconPlus, IconSettings } from '@tabler/icons-react';
20
20
  import type { NavigationProject } from './types';
21
21
 
22
22
  interface ProjectSelectorPopoverProps {
@@ -59,7 +59,7 @@ export function ProjectSelectorPopover({
59
59
  <PopoverTrigger asChild>
60
60
  {children ?? (
61
61
  <button className="cursor-pointer">
62
- <ChevronDown
62
+ <IconChevronDown
63
63
  size={20}
64
64
  className={`transition-transform duration-200 ${open ? 'rotate-180 text-gray-950' : 'text-gray-400'}`}
65
65
  />
@@ -86,13 +86,13 @@ export function ProjectSelectorPopover({
86
86
  className="h-8! paragraph-small-semibold text-gray-950"
87
87
  onClick={onAddProject}
88
88
  >
89
- <Plus size={16} />
89
+ <IconPlus size={16} />
90
90
  Adicionar
91
91
  </Button>
92
92
  <Tooltip>
93
93
  <TooltipTrigger asChild>
94
94
  <Button variant="secondary" className="p-0 size-8" onClick={onManageProjects}>
95
- <Settings size={18} />
95
+ <IconSettings size={18} />
96
96
  </Button>
97
97
  </TooltipTrigger>
98
98
  <TooltipContent className="z-[1002]">Visualizar todos projetos</TooltipContent>
@@ -104,7 +104,7 @@ export function ProjectSelectorPopover({
104
104
  <CommandList className="custom-scrollbar paragraph-small-medium text-gray-600 h-[162px]">
105
105
  {projects.length === 0 ? (
106
106
  <div className="flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4">
107
- <FolderOpen size={28} className="text-gray-300" />
107
+ <IconFolderOpen size={28} className="text-gray-300" />
108
108
  <span className="paragraph-small-medium text-center text-gray-500">
109
109
  Nenhum projeto encontrado.
110
110
  <br />
@@ -134,7 +134,7 @@ export function ProjectSelectorPopover({
134
134
  {project.title}
135
135
  </div>
136
136
  {isSelected && (
137
- <CheckIcon className="size-4 text-gray-950" />
137
+ <IconCheck className="size-4 text-gray-950" />
138
138
  )}
139
139
  </div>
140
140
  </CommandItem>
@@ -1,72 +1,72 @@
1
- 'use client';
2
-
3
- import { ReactNode, useRef, useEffect } from 'react';
4
- import { AppNavigationContext } from '../AppNavigationContext';
5
- import { useNavItemsContext } from '../NavItemsContext';
6
-
7
- function InternalTabsBar({ topOffset = '72px' }: { topOffset?: string }) {
8
- const { navItems } = useNavItemsContext();
9
- const tabsListRef = useRef<HTMLDivElement>(null);
10
- const activeTabRef = useRef<HTMLButtonElement>(null);
11
-
12
- const activeLabel = navItems.find((i) => i.isActive)?.label;
13
-
14
- // Scroll active tab into center when active item changes
15
- useEffect(() => {
16
- if (activeTabRef.current && tabsListRef.current) {
17
- const tabsList = tabsListRef.current;
18
- const activeTabElement = activeTabRef.current;
19
- const tabsListRect = tabsList.getBoundingClientRect();
20
- const activeTabRect = activeTabElement.getBoundingClientRect();
21
- const scrollLeft =
22
- activeTabElement.offsetLeft - tabsListRect.width / 2 + activeTabRect.width / 2;
23
- tabsList.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });
24
- }
25
- }, [activeLabel]);
26
-
27
- if (!navItems.length) return null;
28
-
29
- return (
30
- <div
31
- ref={tabsListRef}
32
- className="md:hidden fixed left-0 right-0 z-40 bg-white border-b border-gray-200 flex overflow-x-auto scrollbar-hide"
33
- style={{ top: topOffset }}
34
- >
35
- {navItems.map((item) => (
36
- <button
37
- key={item.label}
38
- ref={item.isActive ? activeTabRef : undefined}
39
- onClick={item.onClick}
40
- className={`flex items-center gap-2 px-4 py-3 shrink-0 border-b-2 transition-colors ${
41
- item.isActive
42
- ? 'border-gray-950 text-gray-950'
43
- : 'border-transparent text-gray-500 hover:text-gray-900'
44
- }`}
45
- >
46
- {item.icon && <item.icon size={16} className="shrink-0" />}
47
- <span
48
- className={
49
- item.isActive ? 'paragraph-small-semibold' : 'paragraph-small-medium'
50
- }
51
- >
52
- {item.label}
53
- </span>
54
- </button>
55
- ))}
56
- </div>
57
- );
58
- }
59
-
60
- export function TabsMobileShell({ children, topOffset }: { children: ReactNode; topOffset?: string }) {
61
- return (
62
- <AppNavigationContext.Provider value={{ breakpoint: 'mobile' }}>
63
- {/*
64
- Children are hidden visually, but NavItems' useEffect still fires inside
65
- display:none — React effects are tied to commit phase, not layout visibility.
66
- This registers navItems in NavItemsContext so InternalTabsBar can read them.
67
- */}
68
- <div className="hidden">{children}</div>
69
- <InternalTabsBar topOffset={topOffset} />
70
- </AppNavigationContext.Provider>
71
- );
72
- }
1
+ 'use client';
2
+
3
+ import { ReactNode, useRef, useEffect } from 'react';
4
+ import { AppNavigationContext } from '../AppNavigationContext';
5
+ import { useNavItemsContext } from '../NavItemsContext';
6
+
7
+ function InternalTabsBar({ topOffset = '72px' }: { topOffset?: string }) {
8
+ const { navItems } = useNavItemsContext();
9
+ const tabsListRef = useRef<HTMLDivElement>(null);
10
+ const activeTabRef = useRef<HTMLButtonElement>(null);
11
+
12
+ const activeLabel = navItems.find((i) => i.isActive)?.label;
13
+
14
+ // Scroll active tab into center when active item changes
15
+ useEffect(() => {
16
+ if (activeTabRef.current && tabsListRef.current) {
17
+ const tabsList = tabsListRef.current;
18
+ const activeTabElement = activeTabRef.current;
19
+ const tabsListRect = tabsList.getBoundingClientRect();
20
+ const activeTabRect = activeTabElement.getBoundingClientRect();
21
+ const scrollLeft =
22
+ activeTabElement.offsetLeft - tabsListRect.width / 2 + activeTabRect.width / 2;
23
+ tabsList.scrollTo({ left: Math.max(0, scrollLeft), behavior: 'smooth' });
24
+ }
25
+ }, [activeLabel]);
26
+
27
+ if (!navItems.length) return null;
28
+
29
+ return (
30
+ <div
31
+ ref={tabsListRef}
32
+ className="md:hidden fixed left-0 right-0 z-40 bg-white border-b border-gray-200 flex overflow-x-auto scrollbar-hide"
33
+ style={{ top: topOffset }}
34
+ >
35
+ {navItems.map((item) => (
36
+ <button
37
+ key={item.label}
38
+ ref={item.isActive ? activeTabRef : undefined}
39
+ onClick={item.onClick}
40
+ className={`flex items-center gap-2 px-4 py-3 shrink-0 border-b-2 transition-colors ${
41
+ item.isActive
42
+ ? 'border-gray-950 text-gray-950'
43
+ : 'border-transparent text-gray-500 hover:text-gray-900'
44
+ }`}
45
+ >
46
+ {item.icon && <item.icon size={16} className="shrink-0" />}
47
+ <span
48
+ className={
49
+ item.isActive ? 'paragraph-small-semibold' : 'paragraph-small-medium'
50
+ }
51
+ >
52
+ {item.label}
53
+ </span>
54
+ </button>
55
+ ))}
56
+ </div>
57
+ );
58
+ }
59
+
60
+ export function TabsMobileShell({ children, topOffset }: { children: ReactNode; topOffset?: string }) {
61
+ return (
62
+ <AppNavigationContext.Provider value={{ breakpoint: 'mobile' }}>
63
+ {/*
64
+ Children are hidden visually, but NavItems' useEffect still fires inside
65
+ display:none — React effects are tied to commit phase, not layout visibility.
66
+ This registers navItems in NavItemsContext so InternalTabsBar can read them.
67
+ */}
68
+ <div className="hidden">{children}</div>
69
+ <InternalTabsBar topOffset={topOffset} />
70
+ </AppNavigationContext.Provider>
71
+ );
72
+ }
@@ -6,7 +6,7 @@ import { useAppNavigationContext } from '../AppNavigationContext';
6
6
  import { ProjectSelectorPopover } from '../ProjectSelectorPopover';
7
7
  import { UsersSelectorPopover } from '../../layouts/UsersSelectorPopover';
8
8
  import { Button, Command, CommandEmpty, CommandInput, CommandItem, CommandList, UserAvatar } from '../../../index';
9
- import { ChevronDown, Plus, Settings } from 'lucide-react';
9
+ import { IconChevronDown, IconPlus, IconSettings } from '@tabler/icons-react';
10
10
  import type { NavigationProject } from '../types';
11
11
 
12
12
  export interface ProjectSelectorProps {
@@ -70,7 +70,7 @@ export function ProjectSelector({
70
70
  {selectedProject?.title}
71
71
  </span>
72
72
  )}
73
- <ChevronDown
73
+ <IconChevronDown
74
74
  size={20}
75
75
  className={`transition-transform duration-200 ${isPopoverOpen ? 'rotate-180 text-gray-950' : 'text-gray-400'}`}
76
76
  />
@@ -89,7 +89,7 @@ export function ProjectSelector({
89
89
  <div className="flex items-center justify-between">
90
90
  <div className="flex items-center gap-1">
91
91
  <span className="paragraph-medium-semibold text-gray-600">{selectedProject?.title}</span>
92
- <ChevronDown
92
+ <IconChevronDown
93
93
  size={20}
94
94
  onClick={() => setActiveSection(activeSection === 'projects' ? null : 'projects')}
95
95
  className={`transition-transform duration-200 cursor-pointer ${
@@ -105,11 +105,11 @@ export function ProjectSelector({
105
105
  <span className="paragraph-small-semibold">Projetos</span>
106
106
  <div className="flex items-center gap-1.5">
107
107
  <Button variant="secondary" className="h-8! paragraph-small-semibold text-gray-950" onClick={onAddProject}>
108
- <Plus size={16} />
108
+ <IconPlus size={16} />
109
109
  Adicionar
110
110
  </Button>
111
111
  <Button variant="secondary" className="p-0 size-8" onClick={onManageProjects}>
112
- <Settings size={18} />
112
+ <IconSettings size={18} />
113
113
  </Button>
114
114
  </div>
115
115
  </div>
@@ -1,160 +1,160 @@
1
- 'use client';
2
-
3
- import { Bell, Check, Loader2 } from "lucide-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={<Bell 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
- <Loader2 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="paragraph-xlarge-semibold lg: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 ? <Loader2 size={20} className="animate-spin" /> : <Check 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
+ }