@greatapps/common 1.1.263 → 1.1.265

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 (283) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  18. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  19. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  20. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  21. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  22. package/dist/components/layouts/NavBar.mjs.map +1 -1
  23. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  24. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  25. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  26. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  27. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  28. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  29. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  30. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  31. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  32. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  33. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  34. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  35. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  36. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  37. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  38. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  39. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  40. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  41. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  42. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  43. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  44. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  45. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  46. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  47. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  48. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  49. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  50. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  51. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  52. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  53. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  54. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  55. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  56. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  57. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  58. package/dist/components/ui/form/FormField.mjs.map +1 -1
  59. package/dist/components/ui/form/Input.mjs.map +1 -1
  60. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  61. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  62. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  63. package/dist/components/ui/form/Select.mjs +1 -1
  64. package/dist/components/ui/form/Select.mjs.map +1 -1
  65. package/dist/components/ui/form/Switch.mjs.map +1 -1
  66. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  67. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  68. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  69. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  70. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  71. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  72. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  73. package/dist/index.mjs.map +1 -1
  74. package/dist/infra/api/client.mjs +50 -23
  75. package/dist/infra/api/client.mjs.map +1 -1
  76. package/dist/middleware.mjs.map +1 -1
  77. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  78. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  79. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  80. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  81. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  82. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  83. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  84. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  85. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  86. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  87. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  88. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  89. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  90. package/dist/modules/auth/services/auth.service.mjs +0 -1
  91. package/dist/modules/auth/services/auth.service.mjs.map +1 -1
  92. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  93. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  94. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  95. package/dist/modules/cards/types.mjs.map +1 -1
  96. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  97. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  98. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  99. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  100. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  101. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  102. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  103. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  104. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  105. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  106. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  107. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  108. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  109. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  110. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  111. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  112. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  113. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  114. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  115. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  116. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  117. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  118. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  119. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  120. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  121. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  122. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  123. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  124. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  125. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  126. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  127. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  128. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  129. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  130. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  131. package/dist/modules/whitelabel/services/whitelabel.service.mjs +5 -0
  132. package/dist/modules/whitelabel/services/whitelabel.service.mjs.map +1 -1
  133. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  134. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  135. package/dist/utils/countries.mjs.map +1 -1
  136. package/dist/utils/safeServerAction.mjs.map +1 -1
  137. package/dist/utils/withAction.mjs.map +1 -1
  138. package/package.json +89 -89
  139. package/src/components/account/ConfigurationsMyAccountModal.tsx +150 -150
  140. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  141. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  142. package/src/components/account/DeleteAccountModal.tsx +130 -130
  143. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  144. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  145. package/src/components/account/TwoFactorAuthModal.tsx +223 -223
  146. package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
  147. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  148. package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
  149. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  150. package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
  151. package/src/components/account/sections/MyProfileSection.tsx +327 -327
  152. package/src/components/account/sections/PreferencesSection.tsx +273 -273
  153. package/src/components/account/sections/SecuritySection.tsx +160 -160
  154. package/src/components/embeds/CrispEmbed.tsx +101 -101
  155. package/src/components/embeds/FrillEmbed.tsx +119 -119
  156. package/src/components/layouts/AppMobileNavBar.tsx +118 -118
  157. package/src/components/layouts/AppNavBar.tsx +51 -51
  158. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  159. package/src/components/layouts/NavBar.tsx +120 -120
  160. package/src/components/layouts/NotificationsPopover.tsx +115 -115
  161. package/src/components/layouts/ProfilePopover.tsx +164 -164
  162. package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
  163. package/src/components/modals/BuyCreditsModal.tsx +301 -301
  164. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  165. package/src/components/navigation/NavItemsContext.ts +20 -20
  166. package/src/components/navigation/ProjectSelectorPopover.tsx +157 -157
  167. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  168. package/src/components/navigation/subcomponents/ProjectSelector.tsx +156 -156
  169. package/src/components/pages/notifications/Notifications.tsx +160 -160
  170. package/src/components/ui/buttons/Button.tsx +57 -57
  171. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  172. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  173. package/src/components/ui/data-display/Accordion.tsx +81 -81
  174. package/src/components/ui/data-display/Badge.tsx +47 -47
  175. package/src/components/ui/data-display/Card.tsx +93 -93
  176. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  177. package/src/components/ui/data-display/CardItem.tsx +75 -75
  178. package/src/components/ui/data-display/Pagination.tsx +126 -126
  179. package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
  180. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  181. package/src/components/ui/data-display/Separator.tsx +29 -29
  182. package/src/components/ui/data-display/Table.tsx +117 -117
  183. package/src/components/ui/data-display/Tabs.tsx +67 -67
  184. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  185. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  186. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  187. package/src/components/ui/feedback/Progress.tsx +40 -40
  188. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  189. package/src/components/ui/feedback/Toast.tsx +101 -101
  190. package/src/components/ui/form/Calendar.tsx +228 -228
  191. package/src/components/ui/form/Checkbox.tsx +31 -31
  192. package/src/components/ui/form/ComboboxField.tsx +154 -154
  193. package/src/components/ui/form/DatePicker.tsx +97 -97
  194. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  195. package/src/components/ui/form/FormField.tsx +131 -131
  196. package/src/components/ui/form/Input.tsx +20 -20
  197. package/src/components/ui/form/InputOtp.tsx +80 -80
  198. package/src/components/ui/form/PhoneInput.tsx +205 -205
  199. package/src/components/ui/form/RadioGroup.tsx +45 -45
  200. package/src/components/ui/form/Select.tsx +200 -200
  201. package/src/components/ui/form/Switch.tsx +32 -32
  202. package/src/components/ui/form/Textarea.tsx +19 -19
  203. package/src/components/ui/overlay/Command.tsx +185 -185
  204. package/src/components/ui/overlay/Dialog.tsx +151 -151
  205. package/src/components/ui/overlay/Popover.tsx +49 -49
  206. package/src/components/ui/overlay/Sheet.tsx +166 -166
  207. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  208. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  209. package/src/index.ts +376 -376
  210. package/src/infra/api/client.ts +116 -53
  211. package/src/middleware.ts +4 -4
  212. package/src/modules/accounts/actions/account-management.action.ts +91 -91
  213. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  214. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  215. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  216. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  217. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  218. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  219. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  220. package/src/modules/accounts/services/account.service.ts +236 -236
  221. package/src/modules/accounts/types.ts +214 -214
  222. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  223. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  224. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  225. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  226. package/src/modules/auth/services/auth.service.ts +0 -2
  227. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  228. package/src/modules/cards/hooks/cards.hook.ts +14 -14
  229. package/src/modules/cards/services/cards.service.ts +32 -32
  230. package/src/modules/cards/types.ts +32 -32
  231. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  232. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  233. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +17 -17
  234. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
  235. package/src/modules/plans/services/plans.service.ts +36 -36
  236. package/src/modules/plans/types/plan.type.ts +21 -21
  237. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  238. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  239. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  240. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  241. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  242. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  243. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  244. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  245. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  246. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  247. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  248. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  249. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +26 -26
  250. package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
  251. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  252. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  253. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
  254. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
  255. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  256. package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
  257. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  258. package/src/modules/subscriptions/utils/periodicity.ts +52 -52
  259. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  260. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  261. package/src/modules/users/action/list-messages.action.ts +12 -12
  262. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  263. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  264. package/src/modules/users/hooks/messages.hook.ts +60 -60
  265. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  266. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  267. package/src/modules/whitelabel/schema.ts +83 -83
  268. package/src/modules/whitelabel/services/whitelabel.service.ts +5 -5
  269. package/src/modules/whitelabel/styles-schema.ts +37 -37
  270. package/src/providers/whitelabel.provider.tsx +54 -54
  271. package/src/store/useBuyCreditsModal.ts +25 -25
  272. package/src/utils/countries.ts +224 -224
  273. package/src/utils/safeServerAction.ts +21 -21
  274. package/src/utils/withAction.ts +13 -13
  275. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs +0 -15
  276. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +0 -1
  277. package/dist/modules/whitelabel/actions/revalidate-whitelabel-styles.action.mjs +0 -12
  278. package/dist/modules/whitelabel/actions/revalidate-whitelabel-styles.action.mjs.map +0 -1
  279. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs +0 -102
  280. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +0 -1
  281. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +0 -14
  282. package/src/modules/whitelabel/actions/revalidate-whitelabel-styles.action.ts +0 -10
  283. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +0 -129
@@ -1,238 +1,238 @@
1
- "use client";
2
-
3
- import { useEffect, useState } from "react";
4
- import { IconPlus, IconSettings, IconUser, IconUsers } from '@tabler/icons-react';
5
- import { UserAvatar } from "../ui/data-display/UserAvatar";
6
- import { Popover, PopoverContent, PopoverTrigger } from "../ui/overlay/Popover";
7
- import { Button } from "../ui/buttons/Button";
8
- import {
9
- Command,
10
- CommandEmpty,
11
- CommandInput,
12
- CommandItem,
13
- CommandList,
14
- } from "../ui/overlay/Command";
15
- import { Checkbox } from "../ui/form/Checkbox";
16
- import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
17
- import { cn } from "../../infra/utils/clsx";
18
- import { useListProjectUsers } from "../../modules/projects/hooks/list-project-users.hook";
19
- import { useListAllAccountUsers } from "../../modules/projects/hooks/list-all-account-users.hook";
20
- import { useAddProjectUser } from "../../modules/projects/hooks/add-project-user.hook";
21
- import { useRemoveProjectUser } from "../../modules/projects/hooks/remove-project-user.hook";
22
- import { useWhitelabelUrls } from "../../providers/whitelabel.provider";
23
-
24
- export interface UsersSelectorPopoverProps {
25
- projectId?: number;
26
- side?: "top" | "bottom" | "left" | "right";
27
- align?: "start" | "center" | "end";
28
- contentClassName?: string;
29
- }
30
-
31
- function UserItemSkeleton() {
32
- return (
33
- <div className="flex items-center justify-between px-2 py-1.5 gap-2">
34
- <div className="flex items-center gap-2 flex-1">
35
- <div className="skeleton size-8 rounded-full shrink-0" />
36
- <div className="skeleton h-3.5 w-28 rounded" />
37
- </div>
38
- <div className="skeleton size-4 rounded shrink-0" />
39
- </div>
40
- );
41
- }
42
-
43
- export function UsersSelectorPopover({
44
- projectId,
45
- side,
46
- align,
47
- contentClassName,
48
- }: UsersSelectorPopoverProps) {
49
- const { accountsUrl } = useWhitelabelUrls();
50
- const [open, setOpen] = useState(false);
51
- const [hoveredId, setHoveredId] = useState<number | null>(null);
52
- const [searchInput, setSearchInput] = useState("");
53
- const [search, setSearch] = useState("");
54
-
55
- const id = projectId ?? 0;
56
-
57
- useEffect(() => {
58
- const timer = setTimeout(() => setSearch(searchInput), 300);
59
- return () => clearTimeout(timer);
60
- }, [searchInput]);
61
-
62
- const accountUsers = useListAllAccountUsers(search, id || undefined);
63
- const projectUsers = useListProjectUsers(id, "");
64
- const addMutation = useAddProjectUser(id);
65
- const removeMutation = useRemoveProjectUser(id);
66
-
67
- const allUsers = accountUsers.data?.pages.flatMap((p) => p.data) ?? [];
68
- const isLoading = accountUsers.isLoading;
69
- const isFetchingMore = accountUsers.isFetchingNextPage;
70
- const totalInProject = projectUsers.data?.pages[0]?.total ?? 0;
71
-
72
- const toggleUser = (userId: number, inProject: boolean, removable: boolean) => {
73
- if (inProject) {
74
- if (!removable) return;
75
- removeMutation.mutate(userId);
76
- } else {
77
- addMutation.mutate(userId);
78
- }
79
- };
80
-
81
- const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
82
- const target = e.currentTarget;
83
- const nearBottom =
84
- target.scrollTop + target.clientHeight >= target.scrollHeight - 50;
85
- if (!nearBottom) return;
86
- if (accountUsers.hasNextPage && !accountUsers.isFetchingNextPage) {
87
- accountUsers.fetchNextPage();
88
- }
89
- };
90
-
91
- return (
92
- <Popover open={open} onOpenChange={setOpen}>
93
- <PopoverTrigger className="cursor-pointer">
94
- <div className="flex items-center gap-2 text-gray-950 px-3 py-2 border border-gray-200 rounded-full hover:border-gray-950">
95
- <span className="paragraph-small-semibold">{totalInProject}</span>
96
- <IconUser size={16} />
97
- </div>
98
- </PopoverTrigger>
99
-
100
- <PopoverContent
101
- className={cn(
102
- "absolute right-0 md:right-[-88px] w-[273px] p-0 bg-white rounded-2xl shadow-md border border-gray-200",
103
- contentClassName,
104
- )}
105
- side={side}
106
- align={align}
107
- sideOffset={8}
108
- >
109
- <div className="flex flex-col p-3 gap-2">
110
- <div className="flex items-center justify-between">
111
- <span className="paragraph-small-semibold">Usuários</span>
112
- <div className="flex items-center gap-1.5">
113
- <Button
114
- variant="secondary"
115
- className="h-8 paragraph-small-semibold text-gray-950"
116
- onClick={() => {
117
- window.location.href = `${accountsUrl}/my-teams?createNew=true`;
118
- }}
119
- >
120
- <IconPlus size={16} />
121
- Adicionar
122
- </Button>
123
- <Tooltip>
124
- <TooltipTrigger asChild>
125
- <Button
126
- variant="secondary"
127
- className="p-0 size-8"
128
- onClick={() => {
129
- window.location.href = `${accountsUrl}/my-teams`;
130
- }}
131
- >
132
- <IconSettings size={18} />
133
- </Button>
134
- </TooltipTrigger>
135
- <TooltipContent className="z-[1002]">
136
- Visualizar todos usuários
137
- </TooltipContent>
138
- </Tooltip>
139
- </div>
140
- </div>
141
-
142
- <Command shouldFilter={false} className="gap-2" value="">
143
- <CommandInput
144
- placeholder="Busque aqui"
145
- value={searchInput}
146
- onValueChange={setSearchInput}
147
- />
148
- <CommandList
149
- className="custom-scrollbar paragraph-small-medium text-gray-600 h-[162px]"
150
- onScroll={handleScroll}
151
- >
152
- {isLoading ? (
153
- <>
154
- <UserItemSkeleton />
155
- <UserItemSkeleton />
156
- <UserItemSkeleton />
157
- </>
158
- ) : allUsers.length === 0 ? (
159
- <div className="flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4">
160
- <IconUsers size={28} className="text-gray-300" />
161
- <span className="paragraph-small-medium text-center text-gray-500">
162
- Nenhum usuário encontrado.
163
- </span>
164
- </div>
165
- ) : (
166
- <>
167
- <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>
168
- {allUsers.map((user) => {
169
- const inProject = user.in_project ?? false;
170
- const removable =
171
- inProject &&
172
- user.profile !== "owner" &&
173
- user.profile !== "admin";
174
- const interactive = !inProject || removable;
175
-
176
- return (
177
- <CommandItem
178
- key={user.id}
179
- value={user.name || String(user.id)}
180
- autoFocus={false}
181
- onPointerEnter={() => setHoveredId(user.id)}
182
- onPointerLeave={() => setHoveredId(null)}
183
- onFocus={() => setHoveredId(user.id)}
184
- onBlur={() => setHoveredId(null)}
185
- onSelect={() => toggleUser(user.id, inProject, removable)}
186
- className={interactive ? "cursor-pointer" : "cursor-default"}
187
- >
188
- <div className="flex items-center justify-between w-full">
189
- <div className="flex items-center gap-2 min-w-0">
190
- <UserAvatar
191
- photo={user.photo}
192
- name={user.name ?? undefined}
193
- size={32}
194
- />
195
- <span className="truncate">{user.name}</span>
196
- </div>
197
- <Tooltip open={interactive && hoveredId === user.id}>
198
- <TooltipTrigger
199
- onClick={(e) => e.stopPropagation()}
200
- onPointerDown={(e) => e.stopPropagation()}
201
- >
202
- <Checkbox
203
- checked={inProject}
204
- disabled={!interactive}
205
- onCheckedChange={() =>
206
- toggleUser(user.id, inProject, removable)
207
- }
208
- className={cn(
209
- interactive && hoveredId === user.id
210
- ? "border-gray-950"
211
- : "",
212
- "disabled:opacity-10",
213
- )}
214
- />
215
- </TooltipTrigger>
216
- <TooltipContent className="z-[1002]">
217
- {inProject ? "Remover do projeto" : "Adicionar ao projeto"}
218
- </TooltipContent>
219
- </Tooltip>
220
- </div>
221
- </CommandItem>
222
- );
223
- })}
224
- {isFetchingMore && (
225
- <>
226
- <UserItemSkeleton />
227
- <UserItemSkeleton />
228
- </>
229
- )}
230
- </>
231
- )}
232
- </CommandList>
233
- </Command>
234
- </div>
235
- </PopoverContent>
236
- </Popover>
237
- );
238
- }
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { IconPlus, IconSettings, IconUser, IconUsers } from '@tabler/icons-react';
5
+ import { UserAvatar } from "../ui/data-display/UserAvatar";
6
+ import { Popover, PopoverContent, PopoverTrigger } from "../ui/overlay/Popover";
7
+ import { Button } from "../ui/buttons/Button";
8
+ import {
9
+ Command,
10
+ CommandEmpty,
11
+ CommandInput,
12
+ CommandItem,
13
+ CommandList,
14
+ } from "../ui/overlay/Command";
15
+ import { Checkbox } from "../ui/form/Checkbox";
16
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
17
+ import { cn } from "../../infra/utils/clsx";
18
+ import { useListProjectUsers } from "../../modules/projects/hooks/list-project-users.hook";
19
+ import { useListAllAccountUsers } from "../../modules/projects/hooks/list-all-account-users.hook";
20
+ import { useAddProjectUser } from "../../modules/projects/hooks/add-project-user.hook";
21
+ import { useRemoveProjectUser } from "../../modules/projects/hooks/remove-project-user.hook";
22
+ import { useWhitelabelUrls } from "../../providers/whitelabel.provider";
23
+
24
+ export interface UsersSelectorPopoverProps {
25
+ projectId?: number;
26
+ side?: "top" | "bottom" | "left" | "right";
27
+ align?: "start" | "center" | "end";
28
+ contentClassName?: string;
29
+ }
30
+
31
+ function UserItemSkeleton() {
32
+ return (
33
+ <div className="flex items-center justify-between px-2 py-1.5 gap-2">
34
+ <div className="flex items-center gap-2 flex-1">
35
+ <div className="skeleton size-8 rounded-full shrink-0" />
36
+ <div className="skeleton h-3.5 w-28 rounded" />
37
+ </div>
38
+ <div className="skeleton size-4 rounded shrink-0" />
39
+ </div>
40
+ );
41
+ }
42
+
43
+ export function UsersSelectorPopover({
44
+ projectId,
45
+ side,
46
+ align,
47
+ contentClassName,
48
+ }: UsersSelectorPopoverProps) {
49
+ const { accountsUrl } = useWhitelabelUrls();
50
+ const [open, setOpen] = useState(false);
51
+ const [hoveredId, setHoveredId] = useState<number | null>(null);
52
+ const [searchInput, setSearchInput] = useState("");
53
+ const [search, setSearch] = useState("");
54
+
55
+ const id = projectId ?? 0;
56
+
57
+ useEffect(() => {
58
+ const timer = setTimeout(() => setSearch(searchInput), 300);
59
+ return () => clearTimeout(timer);
60
+ }, [searchInput]);
61
+
62
+ const accountUsers = useListAllAccountUsers(search, id || undefined);
63
+ const projectUsers = useListProjectUsers(id, "");
64
+ const addMutation = useAddProjectUser(id);
65
+ const removeMutation = useRemoveProjectUser(id);
66
+
67
+ const allUsers = accountUsers.data?.pages.flatMap((p) => p.data) ?? [];
68
+ const isLoading = accountUsers.isLoading;
69
+ const isFetchingMore = accountUsers.isFetchingNextPage;
70
+ const totalInProject = projectUsers.data?.pages[0]?.total ?? 0;
71
+
72
+ const toggleUser = (userId: number, inProject: boolean, removable: boolean) => {
73
+ if (inProject) {
74
+ if (!removable) return;
75
+ removeMutation.mutate(userId);
76
+ } else {
77
+ addMutation.mutate(userId);
78
+ }
79
+ };
80
+
81
+ const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {
82
+ const target = e.currentTarget;
83
+ const nearBottom =
84
+ target.scrollTop + target.clientHeight >= target.scrollHeight - 50;
85
+ if (!nearBottom) return;
86
+ if (accountUsers.hasNextPage && !accountUsers.isFetchingNextPage) {
87
+ accountUsers.fetchNextPage();
88
+ }
89
+ };
90
+
91
+ return (
92
+ <Popover open={open} onOpenChange={setOpen}>
93
+ <PopoverTrigger className="cursor-pointer">
94
+ <div className="flex items-center gap-2 text-gray-950 px-3 py-2 border border-gray-200 rounded-full hover:border-gray-950">
95
+ <span className="paragraph-small-semibold">{totalInProject}</span>
96
+ <IconUser size={16} />
97
+ </div>
98
+ </PopoverTrigger>
99
+
100
+ <PopoverContent
101
+ className={cn(
102
+ "absolute right-0 md:right-[-88px] w-[273px] p-0 bg-white rounded-2xl shadow-md border border-gray-200",
103
+ contentClassName,
104
+ )}
105
+ side={side}
106
+ align={align}
107
+ sideOffset={8}
108
+ >
109
+ <div className="flex flex-col p-3 gap-2">
110
+ <div className="flex items-center justify-between">
111
+ <span className="paragraph-small-semibold">Usuários</span>
112
+ <div className="flex items-center gap-1.5">
113
+ <Button
114
+ variant="secondary"
115
+ className="h-8 paragraph-small-semibold text-gray-950"
116
+ onClick={() => {
117
+ window.location.href = `${accountsUrl}/my-teams?createNew=true`;
118
+ }}
119
+ >
120
+ <IconPlus size={16} />
121
+ Adicionar
122
+ </Button>
123
+ <Tooltip>
124
+ <TooltipTrigger asChild>
125
+ <Button
126
+ variant="secondary"
127
+ className="p-0 size-8"
128
+ onClick={() => {
129
+ window.location.href = `${accountsUrl}/my-teams`;
130
+ }}
131
+ >
132
+ <IconSettings size={18} />
133
+ </Button>
134
+ </TooltipTrigger>
135
+ <TooltipContent className="z-[1002]">
136
+ Visualizar todos usuários
137
+ </TooltipContent>
138
+ </Tooltip>
139
+ </div>
140
+ </div>
141
+
142
+ <Command shouldFilter={false} className="gap-2" value="">
143
+ <CommandInput
144
+ placeholder="Busque aqui"
145
+ value={searchInput}
146
+ onValueChange={setSearchInput}
147
+ />
148
+ <CommandList
149
+ className="custom-scrollbar paragraph-small-medium text-gray-600 h-[162px]"
150
+ onScroll={handleScroll}
151
+ >
152
+ {isLoading ? (
153
+ <>
154
+ <UserItemSkeleton />
155
+ <UserItemSkeleton />
156
+ <UserItemSkeleton />
157
+ </>
158
+ ) : allUsers.length === 0 ? (
159
+ <div className="flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4">
160
+ <IconUsers size={28} className="text-gray-300" />
161
+ <span className="paragraph-small-medium text-center text-gray-500">
162
+ Nenhum usuário encontrado.
163
+ </span>
164
+ </div>
165
+ ) : (
166
+ <>
167
+ <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>
168
+ {allUsers.map((user) => {
169
+ const inProject = user.in_project ?? false;
170
+ const removable =
171
+ inProject &&
172
+ user.profile !== "owner" &&
173
+ user.profile !== "admin";
174
+ const interactive = !inProject || removable;
175
+
176
+ return (
177
+ <CommandItem
178
+ key={user.id}
179
+ value={user.name || String(user.id)}
180
+ autoFocus={false}
181
+ onPointerEnter={() => setHoveredId(user.id)}
182
+ onPointerLeave={() => setHoveredId(null)}
183
+ onFocus={() => setHoveredId(user.id)}
184
+ onBlur={() => setHoveredId(null)}
185
+ onSelect={() => toggleUser(user.id, inProject, removable)}
186
+ className={interactive ? "cursor-pointer" : "cursor-default"}
187
+ >
188
+ <div className="flex items-center justify-between w-full">
189
+ <div className="flex items-center gap-2 min-w-0">
190
+ <UserAvatar
191
+ photo={user.photo}
192
+ name={user.name ?? undefined}
193
+ size={32}
194
+ />
195
+ <span className="truncate">{user.name}</span>
196
+ </div>
197
+ <Tooltip open={interactive && hoveredId === user.id}>
198
+ <TooltipTrigger
199
+ onClick={(e) => e.stopPropagation()}
200
+ onPointerDown={(e) => e.stopPropagation()}
201
+ >
202
+ <Checkbox
203
+ checked={inProject}
204
+ disabled={!interactive}
205
+ onCheckedChange={() =>
206
+ toggleUser(user.id, inProject, removable)
207
+ }
208
+ className={cn(
209
+ interactive && hoveredId === user.id
210
+ ? "border-gray-950"
211
+ : "",
212
+ "disabled:opacity-10",
213
+ )}
214
+ />
215
+ </TooltipTrigger>
216
+ <TooltipContent className="z-[1002]">
217
+ {inProject ? "Remover do projeto" : "Adicionar ao projeto"}
218
+ </TooltipContent>
219
+ </Tooltip>
220
+ </div>
221
+ </CommandItem>
222
+ );
223
+ })}
224
+ {isFetchingMore && (
225
+ <>
226
+ <UserItemSkeleton />
227
+ <UserItemSkeleton />
228
+ </>
229
+ )}
230
+ </>
231
+ )}
232
+ </CommandList>
233
+ </Command>
234
+ </div>
235
+ </PopoverContent>
236
+ </Popover>
237
+ );
238
+ }