@greatapps/common 1.1.70 → 1.1.71

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 (119) hide show
  1. package/dist/components/account/AccountModals.mjs +18 -0
  2. package/dist/components/account/AccountModals.mjs.map +1 -0
  3. package/dist/components/account/ConfigurationsMyAccountModal.mjs +132 -0
  4. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -0
  5. package/dist/components/account/ConfirmDeleteAccountModal.mjs +45 -0
  6. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -0
  7. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +45 -0
  8. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -0
  9. package/dist/components/account/DeleteAccountModal.mjs +123 -0
  10. package/dist/components/account/DeleteAccountModal.mjs.map +1 -0
  11. package/dist/components/account/DisableTwoFactorAuthModal.mjs +67 -0
  12. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -0
  13. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +42 -0
  14. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -0
  15. package/dist/components/account/TwoFactorAuthModal.mjs +190 -0
  16. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -0
  17. package/dist/components/account/constants.mjs +29 -0
  18. package/dist/components/account/constants.mjs.map +1 -0
  19. package/dist/components/handlers/SearchParamsHandler.mjs +24 -0
  20. package/dist/components/handlers/SearchParamsHandler.mjs.map +1 -0
  21. package/dist/components/layouts/AppMobileNavBar.mjs +53 -0
  22. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -0
  23. package/dist/components/layouts/AppNavBar.mjs +75 -0
  24. package/dist/components/layouts/AppNavBar.mjs.map +1 -0
  25. package/dist/components/layouts/MainLayout.mjs +60 -0
  26. package/dist/components/layouts/MainLayout.mjs.map +1 -0
  27. package/dist/components/layouts/MdSideBarNavigation.mjs +39 -0
  28. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -0
  29. package/dist/components/layouts/NavBar.mjs +64 -0
  30. package/dist/components/layouts/NavBar.mjs.map +1 -0
  31. package/dist/components/layouts/NavBarItem.mjs +23 -0
  32. package/dist/components/layouts/NavBarItem.mjs.map +1 -0
  33. package/dist/components/layouts/NotificationItem.mjs +14 -0
  34. package/dist/components/layouts/NotificationItem.mjs.map +1 -0
  35. package/dist/components/layouts/NotificationsPopover.mjs +86 -0
  36. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -0
  37. package/dist/components/layouts/ProfilePopover.mjs +150 -0
  38. package/dist/components/layouts/ProfilePopover.mjs.map +1 -0
  39. package/dist/components/layouts/SideBarNavigation.mjs +22 -0
  40. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -0
  41. package/dist/components/layouts/UsersSelectorPopover.mjs +236 -0
  42. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -0
  43. package/dist/components/modals/ModalManager.mjs +19 -0
  44. package/dist/components/modals/ModalManager.mjs.map +1 -0
  45. package/dist/components/modals/Modals.mjs +20 -0
  46. package/dist/components/modals/Modals.mjs.map +1 -0
  47. package/dist/enums/AccountSectionType.mjs +11 -0
  48. package/dist/enums/AccountSectionType.mjs.map +1 -0
  49. package/dist/hooks/copy-to-clipboard.hook.mjs +39 -0
  50. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -0
  51. package/dist/hooks/useCountdownTimer.mjs +29 -0
  52. package/dist/hooks/useCountdownTimer.mjs.map +1 -0
  53. package/dist/hooks/useIsMobile.mjs +18 -0
  54. package/dist/hooks/useIsMobile.mjs.map +1 -0
  55. package/dist/hooks/usePasswordVisibility.mjs +13 -0
  56. package/dist/hooks/usePasswordVisibility.mjs.map +1 -0
  57. package/dist/index.mjs +304 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/infra/api/client.mjs +122 -0
  60. package/dist/infra/api/client.mjs.map +1 -0
  61. package/dist/infra/api/types.mjs +31 -0
  62. package/dist/infra/api/types.mjs.map +1 -0
  63. package/dist/infra/utils/client-info.mjs +27 -0
  64. package/dist/infra/utils/client-info.mjs.map +1 -0
  65. package/dist/infra/utils/clsx.mjs +9 -0
  66. package/dist/infra/utils/clsx.mjs.map +1 -0
  67. package/dist/infra/utils/params.mjs +21 -0
  68. package/dist/infra/utils/params.mjs.map +1 -0
  69. package/dist/infra/utils/parser.mjs +24 -0
  70. package/dist/infra/utils/parser.mjs.map +1 -0
  71. package/dist/infra/utils/percentage.mjs +20 -0
  72. package/dist/infra/utils/percentage.mjs.map +1 -0
  73. package/dist/middlewares/chain.mjs +37 -0
  74. package/dist/middlewares/chain.mjs.map +1 -0
  75. package/dist/middlewares/create-auth-middleware.mjs +28 -0
  76. package/dist/middlewares/create-auth-middleware.mjs.map +1 -0
  77. package/dist/middlewares/types.mjs +11 -0
  78. package/dist/middlewares/types.mjs.map +1 -0
  79. package/dist/modules/accounts/types.mjs +1 -0
  80. package/dist/modules/accounts/types.mjs.map +1 -0
  81. package/dist/modules/auth/schema.mjs +1 -0
  82. package/dist/modules/auth/schema.mjs.map +1 -0
  83. package/dist/modules/ia-credits/types.mjs +25 -0
  84. package/dist/modules/ia-credits/types.mjs.map +1 -0
  85. package/dist/modules/projects/types.mjs +22 -0
  86. package/dist/modules/projects/types.mjs.map +1 -0
  87. package/dist/modules/subscriptions/types.mjs +57 -0
  88. package/dist/modules/subscriptions/types.mjs.map +1 -0
  89. package/dist/modules/users/schema.mjs +11 -0
  90. package/dist/modules/users/schema.mjs.map +1 -0
  91. package/dist/modules/whitelabel/schema.mjs +1 -0
  92. package/dist/modules/whitelabel/schema.mjs.map +1 -0
  93. package/dist/providers/auth.provider.mjs +100 -0
  94. package/dist/providers/auth.provider.mjs.map +1 -0
  95. package/dist/providers/query.provider.mjs +41 -0
  96. package/dist/providers/query.provider.mjs.map +1 -0
  97. package/dist/providers/whitelabel.provider.mjs +34 -0
  98. package/dist/providers/whitelabel.provider.mjs.map +1 -0
  99. package/dist/server.mjs +74 -0
  100. package/dist/server.mjs.map +1 -0
  101. package/dist/store/useAccountModals.mjs +18 -0
  102. package/dist/store/useAccountModals.mjs.map +1 -0
  103. package/dist/store/useMdSidebarStore.mjs +11 -0
  104. package/dist/store/useMdSidebarStore.mjs.map +1 -0
  105. package/dist/store/useModalManager.mjs +75 -0
  106. package/dist/store/useModalManager.mjs.map +1 -0
  107. package/dist/utils/browser/clipboard.mjs +36 -0
  108. package/dist/utils/browser/clipboard.mjs.map +1 -0
  109. package/dist/utils/file/index.mjs +9 -0
  110. package/dist/utils/file/index.mjs.map +1 -0
  111. package/dist/utils/format/masks.mjs +56 -0
  112. package/dist/utils/format/masks.mjs.map +1 -0
  113. package/dist/utils/intl/locales.mjs +12 -0
  114. package/dist/utils/intl/locales.mjs.map +1 -0
  115. package/dist/utils/validators/account.mjs +26 -0
  116. package/dist/utils/validators/account.mjs.map +1 -0
  117. package/dist/utils/validators/common.mjs +47 -0
  118. package/dist/utils/validators/common.mjs.map +1 -0
  119. package/package.json +1 -1
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { cn } from "../../infra/utils/clsx";
4
+ function NavBarItem({ icon, label, onClick, className, labelClassName }) {
5
+ return /* @__PURE__ */ jsxs(
6
+ "div",
7
+ {
8
+ className: cn(
9
+ "rounded-lg flex items-center gap-2 px-2 py-2 h-10 cursor-pointer transition-colors bg-white hover:bg-gray-100 active:bg-gray-50",
10
+ className
11
+ ),
12
+ onClick,
13
+ children: [
14
+ icon,
15
+ /* @__PURE__ */ jsx("span", { className: cn("text-sm font-medium text-gray-950", labelClassName), children: label })
16
+ ]
17
+ }
18
+ );
19
+ }
20
+ export {
21
+ NavBarItem
22
+ };
23
+ //# sourceMappingURL=NavBarItem.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layouts/NavBarItem.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { cn } from '../../infra/utils/clsx';\r\n\r\ntype NavBarItemProps = {\r\n icon?: React.ReactNode;\r\n label: string;\r\n onClick: () => void;\r\n className?: string;\r\n labelClassName?: string;\r\n}\r\n\r\nfunction NavBarItem({ icon, label, onClick, className, labelClassName }: NavBarItemProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'rounded-lg flex items-center gap-2 px-2 py-2 h-10 cursor-pointer transition-colors bg-white hover:bg-gray-100 active:bg-gray-50',\r\n className\r\n )}\r\n onClick={onClick}\r\n >\r\n {icon}\r\n <span className={cn('text-sm font-medium text-gray-950', labelClassName)}>{label}</span>\r\n </div>\r\n );\r\n}\r\n\r\nexport { NavBarItem };\r\nexport type { NavBarItemProps };\r\n"],"mappings":";AAcI,SAQE,KARF;AAZJ,SAAS,UAAU;AAUnB,SAAS,WAAW,EAAE,MAAM,OAAO,SAAS,WAAW,eAAe,GAAoB;AACxF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,QACD,oBAAC,UAAK,WAAW,GAAG,qCAAqC,cAAc,GAAI,iBAAM;AAAA;AAAA;AAAA,EACnF;AAEJ;","names":[]}
@@ -0,0 +1,14 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ function NotificationItem({ icon, iconBgColor, title, time, showBorder = true }) {
3
+ return /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-3 px-4 py-5 ${showBorder ? "border-b border-gray-200" : ""}`, children: [
4
+ /* @__PURE__ */ jsx("div", { className: `flex items-center justify-center rounded-full ${iconBgColor} size-10`, children: icon }),
5
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
6
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold text-gray-950", children: title }),
7
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-medium text-gray-500", children: time })
8
+ ] })
9
+ ] });
10
+ }
11
+ export {
12
+ NotificationItem
13
+ };
14
+ //# sourceMappingURL=NotificationItem.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layouts/NotificationItem.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\r\n\r\ntype NotificationItemProps = {\r\n icon: ReactNode;\r\n iconBgColor: string;\r\n title: string;\r\n time: string;\r\n showBorder?: boolean;\r\n}\r\n\r\nfunction NotificationItem({ icon, iconBgColor, title, time, showBorder = true }: NotificationItemProps) {\r\n return (\r\n <div className={`flex items-center gap-3 px-4 py-5 ${showBorder ? 'border-b border-gray-200' : ''}`}>\r\n <div className={`flex items-center justify-center rounded-full ${iconBgColor} size-10`}>\r\n {icon}\r\n </div>\r\n <div className=\"flex flex-col gap-1.5\">\r\n <span className=\"paragraph-small-semibold text-gray-950\">{title}</span>\r\n <span className=\"paragraph-xsmall-medium text-gray-500\">{time}</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport { NotificationItem };\r\nexport type { NotificationItemProps };\r\n"],"mappings":"AAaY,cAGA,YAHA;AAHZ,SAAS,iBAAiB,EAAE,MAAM,aAAa,OAAO,MAAM,aAAa,KAAK,GAA0B;AACpG,SACI,qBAAC,SAAI,WAAW,qCAAqC,aAAa,6BAA6B,EAAE,IAC7F;AAAA,wBAAC,SAAI,WAAW,iDAAiD,WAAW,YACvE,gBACL;AAAA,IACA,qBAAC,SAAI,WAAU,yBACX;AAAA,0BAAC,UAAK,WAAU,0CAA0C,iBAAM;AAAA,MAChE,oBAAC,UAAK,WAAU,yCAAyC,gBAAK;AAAA,OAClE;AAAA,KACJ;AAER;","names":[]}
@@ -0,0 +1,86 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { Bell } from "lucide-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 { NotificationItem } from "./NotificationItem";
9
+ import { cn } from "../../infra/utils/clsx";
10
+ function NotificationsPopover({
11
+ notifications = [],
12
+ onViewAll,
13
+ side,
14
+ align,
15
+ contentClassName,
16
+ badgeClassName = "bg-pages-400"
17
+ }) {
18
+ const [open, setOpen] = useState(false);
19
+ const [hasNewNotifications, setHasNewNotifications] = useState(true);
20
+ const handleOpenChange = (isOpen) => {
21
+ setOpen(isOpen);
22
+ if (isOpen) setHasNewNotifications(false);
23
+ };
24
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
25
+ /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { className: "cursor-pointer", children: /* @__PURE__ */ jsxs(
26
+ "div",
27
+ {
28
+ className: `relative rounded-full p-2.5 ${open ? "bg-gray-100" : "hover:bg-gray-100"}`,
29
+ children: [
30
+ /* @__PURE__ */ jsx(Bell, { size: 20, className: "text-gray-500" }),
31
+ hasNewNotifications && /* @__PURE__ */ jsx(
32
+ "span",
33
+ {
34
+ className: cn(
35
+ "absolute top-2 right-2 size-2.5 rounded-full",
36
+ badgeClassName
37
+ )
38
+ }
39
+ )
40
+ ]
41
+ }
42
+ ) }),
43
+ /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
44
+ PopoverPrimitive.Content,
45
+ {
46
+ className: cn(
47
+ "absolute bottom-2 left-[26px] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200",
48
+ contentClassName
49
+ ),
50
+ side,
51
+ align,
52
+ sideOffset: 8,
53
+ children: [
54
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold text-gray-950 px-4", children: "\xDAltimas notifica\xE7\xF5es" }),
55
+ notifications.length > 0 ? notifications.map((notification, index) => /* @__PURE__ */ jsx(
56
+ NotificationItem,
57
+ {
58
+ icon: notification.icon,
59
+ iconBgColor: notification.iconBgColor,
60
+ title: notification.title,
61
+ time: notification.time,
62
+ showBorder: index < notifications.length - 1
63
+ },
64
+ index
65
+ )) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]", children: [
66
+ /* @__PURE__ */ jsx("div", { className: "bg-gray-50 rounded-md p-2.5", children: /* @__PURE__ */ jsx(Bell, { size: 20, color: "var(--color-gray-950)" }) }),
67
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-medium text-gray-950", children: "Sem notifica\xE7\xF5es por enquanto" })
68
+ ] }),
69
+ onViewAll && /* @__PURE__ */ jsx(
70
+ Button,
71
+ {
72
+ variant: "secondary",
73
+ className: "h-8! mt-2 mb-4 mx-4 paragraph-small-semibold",
74
+ onClick: onViewAll,
75
+ children: "Todas as notifica\xE7\xF5es"
76
+ }
77
+ )
78
+ ]
79
+ }
80
+ ) })
81
+ ] });
82
+ }
83
+ export {
84
+ NotificationsPopover
85
+ };
86
+ //# sourceMappingURL=NotificationsPopover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layouts/NotificationsPopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { ReactNode, useState } from \"react\";\r\nimport { Bell } from \"lucide-react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { Popover } from \"../ui/overlay/Popover\";\r\nimport { Button } from \"../ui/buttons/Button\";\r\nimport { NotificationItem } from \"./NotificationItem\";\r\nimport { cn } from \"../../infra/utils/clsx\";\r\n\r\nexport interface NotificationData {\r\n icon: ReactNode;\r\n iconBgColor: string;\r\n title: string;\r\n time: string;\r\n}\r\n\r\nexport interface NotificationsPopoverProps {\r\n notifications?: NotificationData[];\r\n onViewAll?: () => void;\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n badgeClassName?: string;\r\n}\r\n\r\nfunction NotificationsPopover({\r\n notifications = [],\r\n onViewAll,\r\n side,\r\n align,\r\n contentClassName,\r\n badgeClassName = \"bg-pages-400\",\r\n}: NotificationsPopoverProps) {\r\n const [open, setOpen] = useState(false);\r\n const [hasNewNotifications, setHasNewNotifications] = useState(true);\r\n\r\n const handleOpenChange = (isOpen: boolean) => {\r\n setOpen(isOpen);\r\n if (isOpen) setHasNewNotifications(false);\r\n };\r\n\r\n return (\r\n <Popover open={open} onOpenChange={handleOpenChange}>\r\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\r\n <div\r\n className={`relative rounded-full p-2.5 ${open ? \"bg-gray-100\" : \"hover:bg-gray-100\"}`}\r\n >\r\n <Bell size={20} className=\"text-gray-500\" />\r\n {hasNewNotifications && (\r\n <span\r\n className={cn(\r\n \"absolute top-2 right-2 size-2.5 rounded-full\",\r\n badgeClassName,\r\n )}\r\n />\r\n )}\r\n </div>\r\n </PopoverPrimitive.Trigger>\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n className={cn(\r\n \"absolute bottom-2 left-[26px] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200\",\r\n contentClassName,\r\n )}\r\n side={side}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <span className=\"paragraph-small-semibold text-gray-950 px-4\">\r\n Últimas notificações\r\n </span>\r\n\r\n {notifications.length > 0 ? (\r\n notifications.map((notification, index) => (\r\n <NotificationItem\r\n key={index}\r\n icon={notification.icon}\r\n iconBgColor={notification.iconBgColor}\r\n title={notification.title}\r\n time={notification.time}\r\n showBorder={index < notifications.length - 1}\r\n />\r\n ))\r\n ) : (\r\n <div className=\"flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]\">\r\n <div className=\"bg-gray-50 rounded-md p-2.5\">\r\n <Bell size={20} color=\"var(--color-gray-950)\" />\r\n </div>\r\n <span className=\"paragraph-small-medium text-gray-950\">\r\n Sem notificações por enquanto\r\n </span>\r\n </div>\r\n )}\r\n\r\n {onViewAll && (\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-8! mt-2 mb-4 mx-4 paragraph-small-semibold\"\r\n onClick={onViewAll}\r\n >\r\n Todas as notificações\r\n </Button>\r\n )}\r\n </PopoverPrimitive.Content>\r\n </PopoverPrimitive.Portal>\r\n </Popover>\r\n );\r\n}\r\n\r\nexport { NotificationsPopover };\r\n"],"mappings":";AA6CQ,SAGE,KAHF;AA3CR,SAAoB,gBAAgB;AACpC,SAAS,YAAY;AACrB,YAAY,sBAAsB;AAClC,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,wBAAwB;AACjC,SAAS,UAAU;AAkBnB,SAAS,qBAAqB;AAAA,EAC5B,gBAAgB,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAA8B;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,IAAI;AAEnE,QAAM,mBAAmB,CAAC,WAAoB;AAC5C,YAAQ,MAAM;AACd,QAAI,OAAQ,wBAAuB,KAAK;AAAA,EAC1C;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,kBACjC;AAAA,wBAAC,iBAAiB,SAAjB,EAAyB,WAAU,kBAClC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,+BAA+B,OAAO,gBAAgB,mBAAmB;AAAA,QAEpF;AAAA,8BAAC,QAAK,MAAM,IAAI,WAAU,iBAAgB;AAAA,UACzC,uBACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,IACA,oBAAC,iBAAiB,QAAjB,EACC;AAAA,MAAC,iBAAiB;AAAA,MAAjB;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QAEZ;AAAA,8BAAC,UAAK,WAAU,+CAA8C,2CAE9D;AAAA,UAEC,cAAc,SAAS,IACtB,cAAc,IAAI,CAAC,cAAc,UAC/B;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,aAAa;AAAA,cACnB,aAAa,aAAa;AAAA,cAC1B,OAAO,aAAa;AAAA,cACpB,MAAM,aAAa;AAAA,cACnB,YAAY,QAAQ,cAAc,SAAS;AAAA;AAAA,YALtC;AAAA,UAMP,CACD,IAED,qBAAC,SAAI,WAAU,4DACb;AAAA,gCAAC,SAAI,WAAU,+BACb,8BAAC,QAAK,MAAM,IAAI,OAAM,yBAAwB,GAChD;AAAA,YACA,oBAAC,UAAK,WAAU,wCAAuC,iDAEvD;AAAA,aACF;AAAA,UAGD,aACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS;AAAA,cACV;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,150 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useRouter } from "next/navigation";
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 { Progress } from "../ui/feedback/Progress";
9
+ import { Separator } from "../ui/data-display/Separator";
10
+ import { NavBarItem } from "./NavBarItem";
11
+ import { UserAvatar } from "../ui/data-display/UserAvatar";
12
+ import { LoadingOverlay } from "../ui/feedback/LoadingOverlay";
13
+ import { useAuth } from "../../providers/auth.provider";
14
+ import { cn } from "../../infra/utils/clsx";
15
+ import { useIaCredits } from "../../modules/ia-credits/hooks/ia-credits.hook";
16
+ function ProfilePopover({
17
+ side = "top",
18
+ align = "start",
19
+ contentClassName = "absolute bottom-2 left-[26px]",
20
+ onEditProfile,
21
+ onCreditsClick,
22
+ menuItems = [],
23
+ logoutRedirect = "/login"
24
+ }) {
25
+ const router = useRouter();
26
+ const { user, logout } = useAuth();
27
+ const [isLoggingOut, setIsLoggingOut] = useState(false);
28
+ const { summary, subscription, isSubscriptionLoading, isCreditsLoading } = useIaCredits();
29
+ const handleLogout = async () => {
30
+ try {
31
+ setIsLoggingOut(true);
32
+ await logout();
33
+ router.push(logoutRedirect);
34
+ } catch (error) {
35
+ console.error("Erro ao fazer logout:", error);
36
+ } finally {
37
+ setIsLoggingOut(false);
38
+ }
39
+ };
40
+ const hasSubscription = !isSubscriptionLoading && subscription !== null;
41
+ const showCreditsSkeleton = hasSubscription && isCreditsLoading;
42
+ const showCredits = hasSubscription && !isCreditsLoading;
43
+ const creditsPercentage = showCredits && summary.totalCredits > 0 ? summary.usedCredits / summary.totalCredits * 100 : 0;
44
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
45
+ /* @__PURE__ */ jsx(LoadingOverlay, { isLoading: isLoggingOut, message: "Saindo da sua conta..." }),
46
+ /* @__PURE__ */ jsxs(Popover, { children: [
47
+ /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { className: "cursor-pointer", children: user && /* @__PURE__ */ jsx(
48
+ UserAvatar,
49
+ {
50
+ photo: user.photo,
51
+ name: user.name,
52
+ size: 40
53
+ },
54
+ user.id
55
+ ) }),
56
+ /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
57
+ PopoverPrimitive.Content,
58
+ {
59
+ className: cn(
60
+ "w-64.75 p-0 bg-white rounded-2xl shadow-md border border-gray-200 z-99",
61
+ contentClassName
62
+ ),
63
+ side,
64
+ align,
65
+ sideOffset: 8,
66
+ children: [
67
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[32px_1fr_auto] items-center gap-3 p-3 w-full", children: [
68
+ user && /* @__PURE__ */ jsx(
69
+ UserAvatar,
70
+ {
71
+ photo: user.photo,
72
+ name: user.name,
73
+ size: 32
74
+ },
75
+ user.id
76
+ ),
77
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5 min-w-0", children: [
78
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold text-gray-950 truncate", children: user?.name || "" }),
79
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-medium text-gray-500 truncate", children: user?.email || "" })
80
+ ] }),
81
+ onEditProfile && /* @__PURE__ */ jsx(
82
+ Button,
83
+ {
84
+ variant: "secondary",
85
+ className: "paragraph-small-semibold h-8! whitespace-nowrap px-3 w-fit",
86
+ onClick: onEditProfile,
87
+ children: "Editar Perfil"
88
+ }
89
+ )
90
+ ] }),
91
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 border-t border-gray-200 rounded-2xl p-1.5", children: [
92
+ showCreditsSkeleton && /* @__PURE__ */ jsxs("div", { className: "flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4", children: [
93
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
94
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white truncate", children: "Cr\xE9ditos usados" }),
95
+ /* @__PURE__ */ jsx("div", { className: "h-3.5 w-16 rounded bg-white/20 animate-pulse" })
96
+ ] }),
97
+ /* @__PURE__ */ jsx("div", { className: "h-1.5 w-full rounded-full bg-white/20 animate-pulse" })
98
+ ] }),
99
+ showCredits && /* @__PURE__ */ jsxs(
100
+ "div",
101
+ {
102
+ className: cn(
103
+ "flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4 transition-colors",
104
+ onCreditsClick && "cursor-pointer hover:bg-gray-900"
105
+ ),
106
+ onClick: onCreditsClick,
107
+ children: [
108
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
109
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-white truncate", children: "Cr\xE9ditos usados" }),
110
+ /* @__PURE__ */ jsxs("span", { className: "paragraph-xsmall-medium text-white/50", children: [
111
+ summary.usedCredits.toLocaleString("pt-BR"),
112
+ "/",
113
+ summary.totalCredits.toLocaleString("pt-BR")
114
+ ] })
115
+ ] }),
116
+ /* @__PURE__ */ jsx(
117
+ Progress,
118
+ {
119
+ className: "bg-white/10",
120
+ indicatorColor: "bg-white",
121
+ value: creditsPercentage
122
+ }
123
+ )
124
+ ]
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
128
+ menuItems.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: menuItems.map((item, index) => /* @__PURE__ */ jsx(
129
+ NavBarItem,
130
+ {
131
+ icon: item.icon,
132
+ label: item.label,
133
+ onClick: item.onClick
134
+ },
135
+ index
136
+ )) }),
137
+ /* @__PURE__ */ jsx(Separator, {}),
138
+ /* @__PURE__ */ jsx(NavBarItem, { label: "Sair", onClick: handleLogout })
139
+ ] })
140
+ ] })
141
+ ]
142
+ }
143
+ ) })
144
+ ] })
145
+ ] });
146
+ }
147
+ export {
148
+ ProfilePopover
149
+ };
150
+ //# sourceMappingURL=ProfilePopover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layouts/ProfilePopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useState } from \"react\";\r\nimport { useRouter } from \"next/navigation\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { Popover } from \"../ui/overlay/Popover\";\r\nimport { Button } from \"../ui/buttons/Button\";\r\nimport { Progress } from \"../ui/feedback/Progress\";\r\nimport { Separator } from \"../ui/data-display/Separator\";\r\nimport { NavBarItem } from \"./NavBarItem\";\r\nimport { UserAvatar } from \"../ui/data-display/UserAvatar\";\r\nimport { LoadingOverlay } from \"../ui/feedback/LoadingOverlay\";\r\nimport { useAuth } from \"../../providers/auth.provider\";\r\nimport { cn } from \"../../infra/utils/clsx\";\r\nimport { useIaCredits } from \"../../modules/ia-credits/hooks/ia-credits.hook\";\r\n\r\nexport interface ProfileMenuItem {\r\n icon?: React.ReactNode;\r\n label: string;\r\n onClick: () => void;\r\n}\r\n\r\nexport interface ProfilePopoverProps {\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n onEditProfile?: () => void;\r\n onCreditsClick?: () => void;\r\n menuItems?: ProfileMenuItem[];\r\n logoutRedirect?: string;\r\n}\r\n\r\nfunction ProfilePopover({\r\n side = \"top\",\r\n align = \"start\",\r\n contentClassName = \"absolute bottom-2 left-[26px]\",\r\n onEditProfile,\r\n onCreditsClick,\r\n menuItems = [],\r\n logoutRedirect = \"/login\",\r\n}: ProfilePopoverProps) {\r\n const router = useRouter();\r\n const { user, logout } = useAuth();\r\n const [isLoggingOut, setIsLoggingOut] = useState(false);\r\n\r\n const { summary, subscription, isSubscriptionLoading, isCreditsLoading } =\r\n useIaCredits();\r\n\r\n const handleLogout = async () => {\r\n try {\r\n setIsLoggingOut(true);\r\n await logout();\r\n router.push(logoutRedirect);\r\n } catch (error) {\r\n console.error(\"Erro ao fazer logout:\", error);\r\n } finally {\r\n setIsLoggingOut(false);\r\n }\r\n };\r\n\r\n const hasSubscription = !isSubscriptionLoading && subscription !== null;\r\n const showCreditsSkeleton = hasSubscription && isCreditsLoading;\r\n const showCredits =\r\n hasSubscription && !isCreditsLoading;\r\n const creditsPercentage =\r\n showCredits && summary.totalCredits > 0\r\n ? (summary.usedCredits / summary.totalCredits) * 100\r\n : 0;\r\n\r\n return (\r\n <>\r\n <LoadingOverlay isLoading={isLoggingOut} message=\"Saindo da sua conta...\" />\r\n <Popover>\r\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\r\n {user && (\r\n <UserAvatar\r\n key={user.id}\r\n photo={user.photo}\r\n name={user.name}\r\n size={40}\r\n />\r\n )}\r\n </PopoverPrimitive.Trigger>\r\n\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n className={cn(\r\n \"w-64.75 p-0 bg-white rounded-2xl shadow-md border border-gray-200 z-99\",\r\n contentClassName,\r\n )}\r\n side={side}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <div className=\"grid grid-cols-[32px_1fr_auto] items-center gap-3 p-3 w-full\">\r\n {user && (\r\n <UserAvatar\r\n key={user.id}\r\n photo={user.photo}\r\n name={user.name}\r\n size={32}\r\n />\r\n )}\r\n\r\n <div className=\"flex flex-col gap-0.5 min-w-0\">\r\n <span className=\"paragraph-small-semibold text-gray-950 truncate\">\r\n {user?.name || \"\"}\r\n </span>\r\n <span className=\"paragraph-xsmall-medium text-gray-500 truncate\">\r\n {user?.email || \"\"}\r\n </span>\r\n </div>\r\n\r\n {onEditProfile && (\r\n <Button\r\n variant=\"secondary\"\r\n className=\"paragraph-small-semibold h-8! whitespace-nowrap px-3 w-fit\"\r\n onClick={onEditProfile}\r\n >\r\n Editar Perfil\r\n </Button>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-2 border-t border-gray-200 rounded-2xl p-1.5\">\r\n {showCreditsSkeleton && (\r\n <div className=\"flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4\">\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <span className=\"paragraph-xsmall-semibold text-white truncate\">\r\n Créditos usados\r\n </span>\r\n <div className=\"h-3.5 w-16 rounded bg-white/20 animate-pulse\" />\r\n </div>\r\n <div className=\"h-1.5 w-full rounded-full bg-white/20 animate-pulse\" />\r\n </div>\r\n )}\r\n\r\n {showCredits && (\r\n <div\r\n className={cn(\r\n \"flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4 transition-colors\",\r\n onCreditsClick && \"cursor-pointer hover:bg-gray-900\",\r\n )}\r\n onClick={onCreditsClick}\r\n >\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <span className=\"paragraph-xsmall-semibold text-white truncate\">\r\n Créditos usados\r\n </span>\r\n <span className=\"paragraph-xsmall-medium text-white/50\">\r\n {summary.usedCredits.toLocaleString(\"pt-BR\")}/\r\n {summary.totalCredits.toLocaleString(\"pt-BR\")}\r\n </span>\r\n </div>\r\n <Progress\r\n className=\"bg-white/10\"\r\n indicatorColor=\"bg-white\"\r\n value={creditsPercentage}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col gap-2\">\r\n {menuItems.length > 0 && (\r\n <div className=\"flex flex-col\">\r\n {menuItems.map((item, index) => (\r\n <NavBarItem\r\n key={index}\r\n icon={item.icon}\r\n label={item.label}\r\n onClick={item.onClick}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n <Separator />\r\n <NavBarItem label=\"Sair\" onClick={handleLogout} />\r\n </div>\r\n </div>\r\n </PopoverPrimitive.Content>\r\n </PopoverPrimitive.Portal>\r\n </Popover>\r\n </>\r\n );\r\n}\r\n\r\nexport { ProfilePopover };\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { cn } from "../../infra/utils/clsx";
4
+ function SideBarNavigation({
5
+ className,
6
+ children,
7
+ ...props
8
+ }) {
9
+ return /* @__PURE__ */ jsx(
10
+ "div",
11
+ {
12
+ "data-slot": "sidebar-navigation",
13
+ className: cn("hidden lg:flex flex-col h-screen p-4 border-r w-[273px] border-gray-200", className),
14
+ ...props,
15
+ children
16
+ }
17
+ );
18
+ }
19
+ export {
20
+ SideBarNavigation
21
+ };
22
+ //# sourceMappingURL=SideBarNavigation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layouts/SideBarNavigation.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../infra/utils/clsx\"\r\n\r\nfunction SideBarNavigation({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"sidebar-navigation\"\r\n className={cn(\"hidden lg:flex flex-col h-screen p-4 border-r w-[273px] border-gray-200\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport { SideBarNavigation };\r\n"],"mappings":";AAWQ;AARR,SAAS,UAAU;AAEnB,SAAS,kBAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAgC;AAC5B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,aAAU;AAAA,MACV,WAAW,GAAG,2EAA2E,SAAS;AAAA,MACjG,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;","names":[]}
@@ -0,0 +1,236 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { Plus, Settings, User, Users } from "lucide-react";
5
+ import Image from "next/image";
6
+ import { useRouter } from "next/navigation";
7
+ import { useQueryClient, useMutation } from "@tanstack/react-query";
8
+ import { Popover, PopoverContent, PopoverTrigger } from "../ui/overlay/Popover";
9
+ import { Button } from "../ui/buttons/Button";
10
+ import { Command, CommandEmpty, CommandInput, CommandItem, CommandList } from "../ui/overlay/Command";
11
+ import { Checkbox } from "../ui/form/Checkbox";
12
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
13
+ import { cn } from "../../infra/utils/clsx";
14
+ import { useListProjectUsers, LIST_PROJECT_USERS_BASE_KEY } from "../../modules/projects/hooks/list-project-users.hook";
15
+ import { useListAvailableUsers, LIST_AVAILABLE_USERS_BASE_KEY } from "../../modules/projects/hooks/list-available-users.hook";
16
+ import { addProjectUserAction } from "../../modules/projects/actions/add-project-user.action";
17
+ import { removeProjectUserAction } from "../../modules/projects/actions/remove-project-user.action";
18
+ const DEFAULT_AVATAR = "/images/Logomark.png";
19
+ function UserItemSkeleton() {
20
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-2 py-1.5 gap-2", children: [
21
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1", children: [
22
+ /* @__PURE__ */ jsx("div", { className: "size-8 rounded-full bg-gray-100 animate-pulse shrink-0" }),
23
+ /* @__PURE__ */ jsx("div", { className: "h-3.5 w-28 rounded bg-gray-100 animate-pulse" })
24
+ ] }),
25
+ /* @__PURE__ */ jsx("div", { className: "size-4 rounded bg-gray-100 animate-pulse shrink-0" })
26
+ ] });
27
+ }
28
+ function UsersSelectorPopover({
29
+ projectId,
30
+ addRoute = "/my-teams?createNew=true",
31
+ manageRoute = "/my-teams",
32
+ side,
33
+ align,
34
+ contentClassName
35
+ }) {
36
+ const router = useRouter();
37
+ const queryClient = useQueryClient();
38
+ const [open, setOpen] = useState(false);
39
+ const [hoveredId, setHoveredId] = useState(null);
40
+ const [searchInput, setSearchInput] = useState("");
41
+ const [search, setSearch] = useState("");
42
+ const id = projectId ?? 0;
43
+ useEffect(() => {
44
+ const timer = setTimeout(() => setSearch(searchInput), 300);
45
+ return () => clearTimeout(timer);
46
+ }, [searchInput]);
47
+ const projectUsers = useListProjectUsers(id, search);
48
+ const availableUsers = useListAvailableUsers(id, search);
49
+ const inProject = projectUsers.data?.pages.flatMap((p) => p.data) ?? [];
50
+ const notInProject = availableUsers.data?.pages.flatMap((p) => p.data) ?? [];
51
+ const isLoading = projectUsers.isLoading || availableUsers.isLoading;
52
+ const isFetchingMore = projectUsers.isFetchingNextPage || availableUsers.isFetchingNextPage;
53
+ const totalInProject = projectUsers.data?.pages[0]?.total ?? inProject.length;
54
+ const invalidate = () => {
55
+ queryClient.invalidateQueries({ queryKey: LIST_PROJECT_USERS_BASE_KEY(id) });
56
+ queryClient.invalidateQueries({ queryKey: LIST_AVAILABLE_USERS_BASE_KEY(id) });
57
+ };
58
+ const addMutation = useMutation({
59
+ mutationFn: (userId) => addProjectUserAction({ projectId: id, users: [userId] }),
60
+ onSuccess: invalidate
61
+ });
62
+ const removeMutation = useMutation({
63
+ mutationFn: (userId) => removeProjectUserAction({ projectId: id, users: [userId] }),
64
+ onSuccess: invalidate
65
+ });
66
+ const allUsers = [
67
+ ...inProject.map((u) => ({
68
+ id: u.id_user,
69
+ name: u.name,
70
+ avatar: u.photo ?? DEFAULT_AVATAR,
71
+ checked: true,
72
+ removable: u.profile !== "owner" && u.profile !== "admin"
73
+ })),
74
+ ...notInProject.map((u) => ({
75
+ id: u.id,
76
+ name: u.name,
77
+ avatar: u.photo ?? DEFAULT_AVATAR,
78
+ checked: false,
79
+ removable: true
80
+ }))
81
+ ];
82
+ const toggleUser = (id2, checked, removable) => {
83
+ if (checked) {
84
+ if (!removable) return;
85
+ removeMutation.mutate(id2);
86
+ } else {
87
+ addMutation.mutate(id2);
88
+ }
89
+ };
90
+ const handleScroll = (e) => {
91
+ const target = e.currentTarget;
92
+ const nearBottom = target.scrollTop + target.clientHeight >= target.scrollHeight - 50;
93
+ if (!nearBottom) return;
94
+ if (projectUsers.hasNextPage && !projectUsers.isFetchingNextPage) {
95
+ projectUsers.fetchNextPage();
96
+ } else if (availableUsers.hasNextPage && !availableUsers.isFetchingNextPage) {
97
+ availableUsers.fetchNextPage();
98
+ }
99
+ };
100
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
101
+ /* @__PURE__ */ jsx(PopoverTrigger, { className: "cursor-pointer", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-gray-950 px-3 py-2 border border-gray-200 rounded-full hover:border-gray-950", children: [
102
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold", children: totalInProject }),
103
+ /* @__PURE__ */ jsx(User, { size: 16 })
104
+ ] }) }),
105
+ /* @__PURE__ */ jsx(
106
+ PopoverContent,
107
+ {
108
+ className: cn(
109
+ "absolute right-[-88px] w-[273px] p-0 bg-white rounded-2xl shadow-md border border-gray-200",
110
+ contentClassName
111
+ ),
112
+ side,
113
+ align,
114
+ sideOffset: 8,
115
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col p-3 gap-2", children: [
116
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
117
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold", children: "Usu\xE1rios" }),
118
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
119
+ /* @__PURE__ */ jsxs(
120
+ Button,
121
+ {
122
+ variant: "secondary",
123
+ className: "h-8 paragraph-small-semibold text-gray-950",
124
+ onClick: () => router.push(addRoute),
125
+ children: [
126
+ /* @__PURE__ */ jsx(Plus, { size: 16 }),
127
+ "Adicionar"
128
+ ]
129
+ }
130
+ ),
131
+ /* @__PURE__ */ jsxs(Tooltip, { children: [
132
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
133
+ Button,
134
+ {
135
+ variant: "secondary",
136
+ className: "p-0 size-8",
137
+ onClick: () => router.push(manageRoute),
138
+ children: /* @__PURE__ */ jsx(Settings, { size: 18 })
139
+ }
140
+ ) }),
141
+ /* @__PURE__ */ jsx(TooltipContent, { children: "Visualizar todos usu\xE1rios" })
142
+ ] })
143
+ ] })
144
+ ] }),
145
+ /* @__PURE__ */ jsxs(Command, { shouldFilter: false, className: "gap-2", value: "", children: [
146
+ /* @__PURE__ */ jsx(
147
+ CommandInput,
148
+ {
149
+ placeholder: "Busque aqui",
150
+ value: searchInput,
151
+ onValueChange: setSearchInput
152
+ }
153
+ ),
154
+ /* @__PURE__ */ jsx(
155
+ CommandList,
156
+ {
157
+ className: "custom-scrollbar paragraph-small-medium text-gray-600 h-[162px]",
158
+ onScroll: handleScroll,
159
+ children: isLoading ? /* @__PURE__ */ jsxs(Fragment, { children: [
160
+ /* @__PURE__ */ jsx(UserItemSkeleton, {}),
161
+ /* @__PURE__ */ jsx(UserItemSkeleton, {}),
162
+ /* @__PURE__ */ jsx(UserItemSkeleton, {})
163
+ ] }) : allUsers.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4", children: [
164
+ /* @__PURE__ */ jsx(Users, { size: 28, className: "text-gray-300" }),
165
+ /* @__PURE__ */ jsxs("span", { className: "paragraph-small-medium text-center text-gray-500", children: [
166
+ "Nenhum usu\xE1rio neste projeto.",
167
+ /* @__PURE__ */ jsx("br", {}),
168
+ "Adicione um usu\xE1rio para come\xE7ar."
169
+ ] })
170
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
171
+ /* @__PURE__ */ jsx(CommandEmpty, { children: "Nenhum resultado encontrado." }),
172
+ allUsers.map((user) => /* @__PURE__ */ jsx(
173
+ CommandItem,
174
+ {
175
+ value: user.name,
176
+ autoFocus: false,
177
+ onPointerEnter: () => setHoveredId(user.id),
178
+ onPointerLeave: () => setHoveredId(null),
179
+ onFocus: () => setHoveredId(user.id),
180
+ onBlur: () => setHoveredId(null),
181
+ onSelect: () => toggleUser(user.id, user.checked, user.removable),
182
+ className: user.removable ? "cursor-pointer" : "cursor-default",
183
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between w-full", children: [
184
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
185
+ /* @__PURE__ */ jsx(
186
+ Image,
187
+ {
188
+ alt: "Avatar",
189
+ src: user.avatar,
190
+ width: 32,
191
+ height: 32,
192
+ className: "rounded-full"
193
+ }
194
+ ),
195
+ user.name
196
+ ] }),
197
+ /* @__PURE__ */ jsxs(Tooltip, { open: user.removable && hoveredId === user.id, children: [
198
+ /* @__PURE__ */ jsx(
199
+ TooltipTrigger,
200
+ {
201
+ onClick: (e) => e.stopPropagation(),
202
+ onPointerDown: (e) => e.stopPropagation(),
203
+ children: /* @__PURE__ */ jsx(
204
+ Checkbox,
205
+ {
206
+ checked: user.checked,
207
+ disabled: !user.removable,
208
+ onCheckedChange: () => toggleUser(user.id, user.checked, user.removable),
209
+ className: user.removable && hoveredId === user.id ? "border-gray-950" : ""
210
+ }
211
+ )
212
+ }
213
+ ),
214
+ /* @__PURE__ */ jsx(TooltipContent, { children: user.checked ? "Remover do projeto" : "Adicionar ao projeto" })
215
+ ] })
216
+ ] })
217
+ },
218
+ user.id
219
+ )),
220
+ isFetchingMore && /* @__PURE__ */ jsxs(Fragment, { children: [
221
+ /* @__PURE__ */ jsx(UserItemSkeleton, {}),
222
+ /* @__PURE__ */ jsx(UserItemSkeleton, {})
223
+ ] })
224
+ ] })
225
+ }
226
+ )
227
+ ] })
228
+ ] })
229
+ }
230
+ )
231
+ ] });
232
+ }
233
+ export {
234
+ UsersSelectorPopover
235
+ };
236
+ //# sourceMappingURL=UsersSelectorPopover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layouts/UsersSelectorPopover.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { useEffect, useState } from 'react';\r\nimport { Plus, Settings, User, Users } from 'lucide-react';\r\nimport Image from 'next/image';\r\nimport { useRouter } from 'next/navigation';\r\nimport { useQueryClient, useMutation } from '@tanstack/react-query';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/overlay/Popover';\r\nimport { Button } from '../ui/buttons/Button';\r\nimport { Command, CommandEmpty, CommandInput, CommandItem, CommandList } from '../ui/overlay/Command';\r\nimport { Checkbox } from '../ui/form/Checkbox';\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/overlay/Tooltip';\r\nimport { cn } from '../../infra/utils/clsx';\r\nimport { useListProjectUsers, LIST_PROJECT_USERS_BASE_KEY } from '../../modules/projects/hooks/list-project-users.hook';\r\nimport { useListAvailableUsers, LIST_AVAILABLE_USERS_BASE_KEY } from '../../modules/projects/hooks/list-available-users.hook';\r\nimport { addProjectUserAction } from '../../modules/projects/actions/add-project-user.action';\r\nimport { removeProjectUserAction } from '../../modules/projects/actions/remove-project-user.action';\r\n\r\nconst DEFAULT_AVATAR = '/images/Logomark.png';\r\n\r\nexport interface UsersSelectorPopoverProps {\r\n projectId?: number;\r\n addRoute?: string;\r\n manageRoute?: string;\r\n side?: 'top' | 'bottom' | 'left' | 'right';\r\n align?: 'start' | 'center' | 'end';\r\n contentClassName?: string;\r\n}\r\n\r\nfunction UserItemSkeleton() {\r\n return (\r\n <div className=\"flex items-center justify-between px-2 py-1.5 gap-2\">\r\n <div className=\"flex items-center gap-2 flex-1\">\r\n <div className=\"size-8 rounded-full bg-gray-100 animate-pulse shrink-0\" />\r\n <div className=\"h-3.5 w-28 rounded bg-gray-100 animate-pulse\" />\r\n </div>\r\n <div className=\"size-4 rounded bg-gray-100 animate-pulse shrink-0\" />\r\n </div>\r\n );\r\n}\r\n\r\nexport function UsersSelectorPopover({\r\n projectId,\r\n addRoute = '/my-teams?createNew=true',\r\n manageRoute = '/my-teams',\r\n side,\r\n align,\r\n contentClassName,\r\n}: UsersSelectorPopoverProps) {\r\n const router = useRouter();\r\n const queryClient = useQueryClient();\r\n const [open, setOpen] = useState(false);\r\n const [hoveredId, setHoveredId] = useState<number | null>(null);\r\n const [searchInput, setSearchInput] = useState('');\r\n const [search, setSearch] = useState('');\r\n\r\n const id = projectId ?? 0;\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => setSearch(searchInput), 300);\r\n return () => clearTimeout(timer);\r\n }, [searchInput]);\r\n\r\n const projectUsers = useListProjectUsers(id, search);\r\n const availableUsers = useListAvailableUsers(id, search);\r\n\r\n const inProject = projectUsers.data?.pages.flatMap((p) => p.data) ?? [];\r\n const notInProject = availableUsers.data?.pages.flatMap((p) => p.data) ?? [];\r\n const isLoading = projectUsers.isLoading || availableUsers.isLoading;\r\n const isFetchingMore = projectUsers.isFetchingNextPage || availableUsers.isFetchingNextPage;\r\n const totalInProject = projectUsers.data?.pages[0]?.total ?? inProject.length;\r\n\r\n const invalidate = () => {\r\n queryClient.invalidateQueries({ queryKey: LIST_PROJECT_USERS_BASE_KEY(id) });\r\n queryClient.invalidateQueries({ queryKey: LIST_AVAILABLE_USERS_BASE_KEY(id) });\r\n };\r\n\r\n const addMutation = useMutation({\r\n mutationFn: (userId: number) => addProjectUserAction({ projectId: id, users: [userId] }),\r\n onSuccess: invalidate,\r\n });\r\n\r\n const removeMutation = useMutation({\r\n mutationFn: (userId: number) => removeProjectUserAction({ projectId: id, users: [userId] }),\r\n onSuccess: invalidate,\r\n });\r\n\r\n const allUsers = [\r\n ...inProject.map((u) => ({\r\n id: u.id_user,\r\n name: u.name,\r\n avatar: u.photo ?? DEFAULT_AVATAR,\r\n checked: true as const,\r\n removable: u.profile !== 'owner' && u.profile !== 'admin',\r\n })),\r\n ...notInProject.map((u) => ({\r\n id: u.id,\r\n name: u.name,\r\n avatar: u.photo ?? DEFAULT_AVATAR,\r\n checked: false as const,\r\n removable: true,\r\n })),\r\n ];\r\n\r\n const toggleUser = (id: number, checked: boolean, removable: boolean) => {\r\n if (checked) {\r\n if (!removable) return;\r\n removeMutation.mutate(id);\r\n } else {\r\n addMutation.mutate(id);\r\n }\r\n };\r\n\r\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\r\n const target = e.currentTarget;\r\n const nearBottom = target.scrollTop + target.clientHeight >= target.scrollHeight - 50;\r\n if (!nearBottom) return;\r\n if (projectUsers.hasNextPage && !projectUsers.isFetchingNextPage) {\r\n projectUsers.fetchNextPage();\r\n } else if (availableUsers.hasNextPage && !availableUsers.isFetchingNextPage) {\r\n availableUsers.fetchNextPage();\r\n }\r\n };\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger className=\"cursor-pointer\">\r\n <div className=\"flex items-center gap-2 text-gray-950 px-3 py-2 border border-gray-200 rounded-full hover:border-gray-950\">\r\n <span className=\"paragraph-small-semibold\">{totalInProject}</span>\r\n <User size={16} />\r\n </div>\r\n </PopoverTrigger>\r\n\r\n <PopoverContent\r\n className={cn(\r\n 'absolute right-[-88px] w-[273px] p-0 bg-white rounded-2xl shadow-md border border-gray-200',\r\n contentClassName\r\n )}\r\n side={side}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <div className=\"flex flex-col p-3 gap-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"paragraph-small-semibold\">Usuários</span>\r\n <div className=\"flex items-center gap-1.5\">\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-8 paragraph-small-semibold text-gray-950\"\r\n onClick={() => router.push(addRoute)}\r\n >\r\n <Plus size={16} />\r\n Adicionar\r\n </Button>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n variant=\"secondary\"\r\n className=\"p-0 size-8\"\r\n onClick={() => router.push(manageRoute)}\r\n >\r\n <Settings size={18} />\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>Visualizar todos usuários</TooltipContent>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n\r\n <Command shouldFilter={false} className=\"gap-2\" value=\"\">\r\n <CommandInput\r\n placeholder=\"Busque aqui\"\r\n value={searchInput}\r\n onValueChange={setSearchInput}\r\n />\r\n <CommandList\r\n className=\"custom-scrollbar paragraph-small-medium text-gray-600 h-[162px]\"\r\n onScroll={handleScroll}\r\n >\r\n {isLoading ? (\r\n <>\r\n <UserItemSkeleton />\r\n <UserItemSkeleton />\r\n <UserItemSkeleton />\r\n </>\r\n ) : allUsers.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center gap-2 h-full text-gray-400 py-4\">\r\n <Users size={28} className=\"text-gray-300\" />\r\n <span className=\"paragraph-small-medium text-center text-gray-500\">\r\n Nenhum usuário neste projeto.\r\n <br />\r\n Adicione um usuário para começar.\r\n </span>\r\n </div>\r\n ) : (\r\n <>\r\n <CommandEmpty>Nenhum resultado encontrado.</CommandEmpty>\r\n {allUsers.map((user) => (\r\n <CommandItem\r\n key={user.id}\r\n value={user.name}\r\n autoFocus={false}\r\n onPointerEnter={() => setHoveredId(user.id)}\r\n onPointerLeave={() => setHoveredId(null)}\r\n onFocus={() => setHoveredId(user.id)}\r\n onBlur={() => setHoveredId(null)}\r\n onSelect={() => toggleUser(user.id, user.checked, user.removable)}\r\n className={user.removable ? 'cursor-pointer' : 'cursor-default'}\r\n >\r\n <div className=\"flex items-center justify-between w-full\">\r\n <div className=\"flex items-center gap-2\">\r\n <Image\r\n alt=\"Avatar\"\r\n src={user.avatar}\r\n width={32}\r\n height={32}\r\n className=\"rounded-full\"\r\n />\r\n {user.name}\r\n </div>\r\n <Tooltip open={user.removable && hoveredId === user.id}>\r\n <TooltipTrigger\r\n onClick={(e) => e.stopPropagation()}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n >\r\n <Checkbox\r\n checked={user.checked}\r\n disabled={!user.removable}\r\n onCheckedChange={() => toggleUser(user.id, user.checked, user.removable)}\r\n className={user.removable && hoveredId === user.id ? 'border-gray-950' : ''}\r\n />\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n {user.checked ? 'Remover do projeto' : 'Adicionar ao projeto'}\r\n </TooltipContent>\r\n </Tooltip>\r\n </div>\r\n </CommandItem>\r\n ))}\r\n {isFetchingMore && (\r\n <>\r\n <UserItemSkeleton />\r\n <UserItemSkeleton />\r\n </>\r\n )}\r\n </>\r\n )}\r\n </CommandList>\r\n </Command>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n"],"mappings":"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","names":["id"]}