@greatapps/common 1.1.68 → 1.1.70

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 (128) hide show
  1. package/dist/modules/auth/actions/verify-two-factor.action.mjs +12 -6
  2. package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
  3. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  4. package/dist/modules/auth/services/auth.service.mjs +1 -1
  5. package/dist/modules/auth/services/auth.service.mjs.map +1 -1
  6. package/package.json +1 -1
  7. package/src/modules/auth/actions/verify-two-factor.action.ts +24 -11
  8. package/src/modules/auth/hooks/useUserQuery.ts +1 -1
  9. package/src/modules/auth/schema.ts +2 -2
  10. package/src/modules/auth/services/auth.service.ts +2 -2
  11. package/dist/components/account/AccountModals.mjs +0 -18
  12. package/dist/components/account/AccountModals.mjs.map +0 -1
  13. package/dist/components/account/ConfigurationsMyAccountModal.mjs +0 -132
  14. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +0 -1
  15. package/dist/components/account/ConfirmDeleteAccountModal.mjs +0 -45
  16. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +0 -1
  17. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +0 -45
  18. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +0 -1
  19. package/dist/components/account/DeleteAccountModal.mjs +0 -123
  20. package/dist/components/account/DeleteAccountModal.mjs.map +0 -1
  21. package/dist/components/account/DisableTwoFactorAuthModal.mjs +0 -67
  22. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +0 -1
  23. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +0 -42
  24. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +0 -1
  25. package/dist/components/account/TwoFactorAuthModal.mjs +0 -190
  26. package/dist/components/account/TwoFactorAuthModal.mjs.map +0 -1
  27. package/dist/components/account/constants.mjs +0 -29
  28. package/dist/components/account/constants.mjs.map +0 -1
  29. package/dist/components/handlers/SearchParamsHandler.mjs +0 -24
  30. package/dist/components/handlers/SearchParamsHandler.mjs.map +0 -1
  31. package/dist/components/layouts/AppMobileNavBar.mjs +0 -53
  32. package/dist/components/layouts/AppMobileNavBar.mjs.map +0 -1
  33. package/dist/components/layouts/AppNavBar.mjs +0 -75
  34. package/dist/components/layouts/AppNavBar.mjs.map +0 -1
  35. package/dist/components/layouts/MainLayout.mjs +0 -60
  36. package/dist/components/layouts/MainLayout.mjs.map +0 -1
  37. package/dist/components/layouts/MdSideBarNavigation.mjs +0 -39
  38. package/dist/components/layouts/MdSideBarNavigation.mjs.map +0 -1
  39. package/dist/components/layouts/NavBar.mjs +0 -64
  40. package/dist/components/layouts/NavBar.mjs.map +0 -1
  41. package/dist/components/layouts/NavBarItem.mjs +0 -23
  42. package/dist/components/layouts/NavBarItem.mjs.map +0 -1
  43. package/dist/components/layouts/NotificationItem.mjs +0 -14
  44. package/dist/components/layouts/NotificationItem.mjs.map +0 -1
  45. package/dist/components/layouts/NotificationsPopover.mjs +0 -86
  46. package/dist/components/layouts/NotificationsPopover.mjs.map +0 -1
  47. package/dist/components/layouts/ProfilePopover.mjs +0 -150
  48. package/dist/components/layouts/ProfilePopover.mjs.map +0 -1
  49. package/dist/components/layouts/SideBarNavigation.mjs +0 -22
  50. package/dist/components/layouts/SideBarNavigation.mjs.map +0 -1
  51. package/dist/components/layouts/UsersSelectorPopover.mjs +0 -236
  52. package/dist/components/layouts/UsersSelectorPopover.mjs.map +0 -1
  53. package/dist/components/modals/ModalManager.mjs +0 -19
  54. package/dist/components/modals/ModalManager.mjs.map +0 -1
  55. package/dist/components/modals/Modals.mjs +0 -20
  56. package/dist/components/modals/Modals.mjs.map +0 -1
  57. package/dist/enums/AccountSectionType.mjs +0 -11
  58. package/dist/enums/AccountSectionType.mjs.map +0 -1
  59. package/dist/hooks/copy-to-clipboard.hook.mjs +0 -39
  60. package/dist/hooks/copy-to-clipboard.hook.mjs.map +0 -1
  61. package/dist/hooks/useCountdownTimer.mjs +0 -29
  62. package/dist/hooks/useCountdownTimer.mjs.map +0 -1
  63. package/dist/hooks/useIsMobile.mjs +0 -18
  64. package/dist/hooks/useIsMobile.mjs.map +0 -1
  65. package/dist/hooks/usePasswordVisibility.mjs +0 -13
  66. package/dist/hooks/usePasswordVisibility.mjs.map +0 -1
  67. package/dist/index.mjs +0 -304
  68. package/dist/index.mjs.map +0 -1
  69. package/dist/infra/api/client.mjs +0 -122
  70. package/dist/infra/api/client.mjs.map +0 -1
  71. package/dist/infra/api/types.mjs +0 -31
  72. package/dist/infra/api/types.mjs.map +0 -1
  73. package/dist/infra/utils/client-info.mjs +0 -27
  74. package/dist/infra/utils/client-info.mjs.map +0 -1
  75. package/dist/infra/utils/clsx.mjs +0 -9
  76. package/dist/infra/utils/clsx.mjs.map +0 -1
  77. package/dist/infra/utils/params.mjs +0 -21
  78. package/dist/infra/utils/params.mjs.map +0 -1
  79. package/dist/infra/utils/parser.mjs +0 -24
  80. package/dist/infra/utils/parser.mjs.map +0 -1
  81. package/dist/infra/utils/percentage.mjs +0 -20
  82. package/dist/infra/utils/percentage.mjs.map +0 -1
  83. package/dist/middlewares/chain.mjs +0 -37
  84. package/dist/middlewares/chain.mjs.map +0 -1
  85. package/dist/middlewares/create-auth-middleware.mjs +0 -28
  86. package/dist/middlewares/create-auth-middleware.mjs.map +0 -1
  87. package/dist/middlewares/types.mjs +0 -11
  88. package/dist/middlewares/types.mjs.map +0 -1
  89. package/dist/modules/accounts/types.mjs +0 -1
  90. package/dist/modules/accounts/types.mjs.map +0 -1
  91. package/dist/modules/auth/schema.mjs +0 -1
  92. package/dist/modules/auth/schema.mjs.map +0 -1
  93. package/dist/modules/ia-credits/types.mjs +0 -25
  94. package/dist/modules/ia-credits/types.mjs.map +0 -1
  95. package/dist/modules/projects/types.mjs +0 -22
  96. package/dist/modules/projects/types.mjs.map +0 -1
  97. package/dist/modules/subscriptions/types.mjs +0 -57
  98. package/dist/modules/subscriptions/types.mjs.map +0 -1
  99. package/dist/modules/users/schema.mjs +0 -11
  100. package/dist/modules/users/schema.mjs.map +0 -1
  101. package/dist/modules/whitelabel/schema.mjs +0 -1
  102. package/dist/modules/whitelabel/schema.mjs.map +0 -1
  103. package/dist/providers/auth.provider.mjs +0 -100
  104. package/dist/providers/auth.provider.mjs.map +0 -1
  105. package/dist/providers/query.provider.mjs +0 -41
  106. package/dist/providers/query.provider.mjs.map +0 -1
  107. package/dist/providers/whitelabel.provider.mjs +0 -34
  108. package/dist/providers/whitelabel.provider.mjs.map +0 -1
  109. package/dist/server.mjs +0 -74
  110. package/dist/server.mjs.map +0 -1
  111. package/dist/store/useAccountModals.mjs +0 -18
  112. package/dist/store/useAccountModals.mjs.map +0 -1
  113. package/dist/store/useMdSidebarStore.mjs +0 -11
  114. package/dist/store/useMdSidebarStore.mjs.map +0 -1
  115. package/dist/store/useModalManager.mjs +0 -75
  116. package/dist/store/useModalManager.mjs.map +0 -1
  117. package/dist/utils/browser/clipboard.mjs +0 -36
  118. package/dist/utils/browser/clipboard.mjs.map +0 -1
  119. package/dist/utils/file/index.mjs +0 -9
  120. package/dist/utils/file/index.mjs.map +0 -1
  121. package/dist/utils/format/masks.mjs +0 -56
  122. package/dist/utils/format/masks.mjs.map +0 -1
  123. package/dist/utils/intl/locales.mjs +0 -12
  124. package/dist/utils/intl/locales.mjs.map +0 -1
  125. package/dist/utils/validators/account.mjs +0 -26
  126. package/dist/utils/validators/account.mjs.map +0 -1
  127. package/dist/utils/validators/common.mjs +0 -47
  128. package/dist/utils/validators/common.mjs.map +0 -1
@@ -1 +0,0 @@
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":[]}
@@ -1,236 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,19 +0,0 @@
1
- "use client";
2
- import { Fragment, jsx } from "react/jsx-runtime";
3
- import { useModalManager } from "../../store/useModalManager";
4
- function ModalManager({ registry }) {
5
- const { modalStack } = useModalManager();
6
- if (modalStack.length === 0) return null;
7
- return /* @__PURE__ */ jsx(Fragment, { children: modalStack.map((modal) => {
8
- const ModalComponent = registry[modal.key];
9
- if (!ModalComponent) {
10
- console.warn(`Modal "${modal.key}" not found in registry`);
11
- return null;
12
- }
13
- return /* @__PURE__ */ jsx(ModalComponent, {}, modal.key);
14
- }) });
15
- }
16
- export {
17
- ModalManager
18
- };
19
- //# sourceMappingURL=ModalManager.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/modals/ModalManager.tsx"],"sourcesContent":["'use client';\n\nimport { ComponentType } from 'react';\nimport { useModalManager } from '../../store/useModalManager';\n\ninterface ModalManagerProps {\n registry: Record<string, ComponentType>;\n}\n\nexport function ModalManager({ registry }: ModalManagerProps) {\n const { modalStack } = useModalManager();\n\n if (modalStack.length === 0) return null;\n\n return (\n <>\n {modalStack.map((modal) => {\n const ModalComponent = registry[modal.key];\n\n if (!ModalComponent) {\n console.warn(`Modal \"${modal.key}\" not found in registry`);\n return null;\n }\n\n return <ModalComponent key={modal.key} />;\n })}\n </>\n );\n}\n"],"mappings":";AAeI,mBASW,WATX;AAZJ,SAAS,uBAAuB;AAMzB,SAAS,aAAa,EAAE,SAAS,GAAsB;AAC5D,QAAM,EAAE,WAAW,IAAI,gBAAgB;AAEvC,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,SACE,gCACG,qBAAW,IAAI,CAAC,UAAU;AACzB,UAAM,iBAAiB,SAAS,MAAM,GAAG;AAEzC,QAAI,CAAC,gBAAgB;AACnB,cAAQ,KAAK,UAAU,MAAM,GAAG,yBAAyB;AACzD,aAAO;AAAA,IACT;AAEA,WAAO,oBAAC,oBAAoB,MAAM,GAAK;AAAA,EACzC,CAAC,GACH;AAEJ;","names":[]}
@@ -1,20 +0,0 @@
1
- "use client";
2
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { useEffect } from "react";
4
- import AccountModals from "../account/AccountModals";
5
- import { ModalManager } from "./ModalManager";
6
- import { useAccountModals } from "../../store/useAccountModals";
7
- function Modals({ registry, hasActiveSubscription, onGoToSubscription }) {
8
- const { updateConfig } = useAccountModals();
9
- useEffect(() => {
10
- updateConfig({ hasActiveSubscription, onGoToSubscription });
11
- }, [hasActiveSubscription, onGoToSubscription, updateConfig]);
12
- return /* @__PURE__ */ jsxs(Fragment, { children: [
13
- /* @__PURE__ */ jsx(AccountModals, {}),
14
- /* @__PURE__ */ jsx(ModalManager, { registry })
15
- ] });
16
- }
17
- export {
18
- Modals
19
- };
20
- //# sourceMappingURL=Modals.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/modals/Modals.tsx"],"sourcesContent":["'use client';\n\nimport { ComponentType, useEffect } from 'react';\nimport AccountModals from '../account/AccountModals';\nimport { ModalManager } from './ModalManager';\nimport { useAccountModals } from '../../store/useAccountModals';\ninterface ModalsProps {\n registry: Record<string, ComponentType>;\n hasActiveSubscription?: boolean;\n onGoToSubscription?: () => void;\n}\n\nexport function Modals({ registry, hasActiveSubscription, onGoToSubscription }: ModalsProps) {\n const { updateConfig } = useAccountModals();\n\n useEffect(() => {\n updateConfig({ hasActiveSubscription, onGoToSubscription });\n }, [hasActiveSubscription, onGoToSubscription, updateConfig]);\n\n return (\n <>\n <AccountModals />\n <ModalManager registry={registry} />\n </>\n );\n}\n"],"mappings":";AAoBI,mBACE,KADF;AAlBJ,SAAwB,iBAAiB;AACzC,OAAO,mBAAmB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAO1B,SAAS,OAAO,EAAE,UAAU,uBAAuB,mBAAmB,GAAgB;AAC3F,QAAM,EAAE,aAAa,IAAI,iBAAiB;AAE1C,YAAU,MAAM;AACd,iBAAa,EAAE,uBAAuB,mBAAmB,CAAC;AAAA,EAC5D,GAAG,CAAC,uBAAuB,oBAAoB,YAAY,CAAC;AAE5D,SACE,iCACE;AAAA,wBAAC,iBAAc;AAAA,IACf,oBAAC,gBAAa,UAAoB;AAAA,KACpC;AAEJ;","names":[]}
@@ -1,11 +0,0 @@
1
- var AccountSectionType = /* @__PURE__ */ ((AccountSectionType2) => {
2
- AccountSectionType2["MY_PROFILE"] = "my-profile";
3
- AccountSectionType2["SECURITY"] = "security";
4
- AccountSectionType2["PREFERENCES"] = "preferences";
5
- AccountSectionType2["CHANGE_PASSWORD"] = "change-password";
6
- return AccountSectionType2;
7
- })(AccountSectionType || {});
8
- export {
9
- AccountSectionType
10
- };
11
- //# sourceMappingURL=AccountSectionType.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/enums/AccountSectionType.ts"],"sourcesContent":["export enum AccountSectionType {\r\n MY_PROFILE = 'my-profile',\r\n SECURITY = 'security',\r\n PREFERENCES = 'preferences',\r\n CHANGE_PASSWORD = 'change-password',\r\n}\r\n"],"mappings":"AAAO,IAAK,qBAAL,kBAAKA,wBAAL;AACL,EAAAA,oBAAA,gBAAa;AACb,EAAAA,oBAAA,cAAW;AACX,EAAAA,oBAAA,iBAAc;AACd,EAAAA,oBAAA,qBAAkB;AAJR,SAAAA;AAAA,GAAA;","names":["AccountSectionType"]}
@@ -1,39 +0,0 @@
1
- import { useState, useCallback, useRef, useEffect } from "react";
2
- function useCopyToClipboard({
3
- feedbackDuration = 2e3,
4
- onSuccess,
5
- onError
6
- } = {}) {
7
- const [isCopied, setIsCopied] = useState(false);
8
- const timeoutRef = useRef(null);
9
- useEffect(() => {
10
- return () => {
11
- if (timeoutRef.current) {
12
- clearTimeout(timeoutRef.current);
13
- }
14
- };
15
- }, []);
16
- const copy = useCallback(
17
- async (text) => {
18
- if (timeoutRef.current) {
19
- clearTimeout(timeoutRef.current);
20
- }
21
- try {
22
- await navigator.clipboard.writeText(text);
23
- setIsCopied(true);
24
- onSuccess?.();
25
- timeoutRef.current = setTimeout(() => {
26
- setIsCopied(false);
27
- }, feedbackDuration);
28
- } catch (error) {
29
- onError?.(error instanceof Error ? error : new Error("Failed to copy"));
30
- }
31
- },
32
- [feedbackDuration, onSuccess, onError]
33
- );
34
- return { isCopied, copy };
35
- }
36
- export {
37
- useCopyToClipboard as default
38
- };
39
- //# sourceMappingURL=copy-to-clipboard.hook.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/hooks/copy-to-clipboard.hook.tsx"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from \"react\";\n\ninterface UseCopyToClipboardOptions {\n feedbackDuration?: number;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseCopyToClipboardReturn {\n isCopied: boolean;\n copy: (text: string) => Promise<void>;\n}\n\nexport default function useCopyToClipboard({\n feedbackDuration = 2000,\n onSuccess,\n onError,\n}: UseCopyToClipboardOptions = {}): UseCopyToClipboardReturn {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n const copy = useCallback(\n async (text: string) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n try {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n onSuccess?.();\n\n timeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n }, feedbackDuration);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(\"Failed to copy\"));\n }\n },\n [feedbackDuration, onSuccess, onError],\n );\n\n return { isCopied, copy };\n}\n"],"mappings":"AAAA,SAAS,UAAU,aAAa,QAAQ,iBAAiB;AAa1C,SAAR,mBAAoC;AAAA,EACzC,mBAAmB;AAAA,EACnB;AAAA,EACA;AACF,IAA+B,CAAC,GAA6B;AAC3D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,aAAa,OAA8B,IAAI;AAErD,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO;AAAA,IACX,OAAO,SAAiB;AACtB,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAEA,UAAI;AACF,cAAM,UAAU,UAAU,UAAU,IAAI;AACxC,oBAAY,IAAI;AAChB,oBAAY;AAEZ,mBAAW,UAAU,WAAW,MAAM;AACpC,sBAAY,KAAK;AAAA,QACnB,GAAG,gBAAgB;AAAA,MACrB,SAAS,OAAO;AACd,kBAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,WAAW,OAAO;AAAA,EACvC;AAEA,SAAO,EAAE,UAAU,KAAK;AAC1B;","names":[]}
@@ -1,29 +0,0 @@
1
- "use client";
2
- import { useEffect, useState, useCallback } from "react";
3
- function useCountdownTimer({
4
- initialSeconds = 59,
5
- onExpire
6
- } = {}) {
7
- const [seconds, setSeconds] = useState(initialSeconds);
8
- const [isExpired, setIsExpired] = useState(false);
9
- useEffect(() => {
10
- if (seconds > 0) {
11
- const interval = setInterval(() => {
12
- setSeconds((prev) => prev - 1);
13
- }, 1e3);
14
- return () => clearInterval(interval);
15
- } else {
16
- setIsExpired(true);
17
- onExpire?.();
18
- }
19
- }, [seconds, onExpire]);
20
- const reset = useCallback(() => {
21
- setSeconds(initialSeconds);
22
- setIsExpired(false);
23
- }, [initialSeconds]);
24
- return { seconds, isExpired, reset };
25
- }
26
- export {
27
- useCountdownTimer as default
28
- };
29
- //# sourceMappingURL=useCountdownTimer.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/hooks/useCountdownTimer.ts"],"sourcesContent":["'use client';\r\n\r\nimport { useEffect, useState, useCallback } from 'react';\r\n\r\ninterface UseCountdownTimerOptions {\r\n initialSeconds?: number;\r\n onExpire?: () => void;\r\n}\r\n\r\ninterface UseCountdownTimerReturn {\r\n seconds: number;\r\n isExpired: boolean;\r\n reset: () => void;\r\n}\r\n\r\nexport default function useCountdownTimer({\r\n initialSeconds = 59,\r\n onExpire,\r\n}: UseCountdownTimerOptions = {}): UseCountdownTimerReturn {\r\n const [seconds, setSeconds] = useState(initialSeconds);\r\n const [isExpired, setIsExpired] = useState(false);\r\n\r\n useEffect(() => {\r\n if (seconds > 0) {\r\n const interval = setInterval(() => {\r\n setSeconds((prev) => prev - 1);\r\n }, 1000);\r\n return () => clearInterval(interval);\r\n } else {\r\n setIsExpired(true);\r\n onExpire?.();\r\n }\r\n }, [seconds, onExpire]);\r\n\r\n const reset = useCallback(() => {\r\n setSeconds(initialSeconds);\r\n setIsExpired(false);\r\n }, [initialSeconds]);\r\n\r\n return { seconds, isExpired, reset };\r\n}\r\n"],"mappings":";AAEA,SAAS,WAAW,UAAU,mBAAmB;AAalC,SAAR,kBAAmC;AAAA,EACxC,iBAAiB;AAAA,EACjB;AACF,IAA8B,CAAC,GAA4B;AACzD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,cAAc;AACrD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,YAAU,MAAM;AACd,QAAI,UAAU,GAAG;AACf,YAAM,WAAW,YAAY,MAAM;AACjC,mBAAW,CAAC,SAAS,OAAO,CAAC;AAAA,MAC/B,GAAG,GAAI;AACP,aAAO,MAAM,cAAc,QAAQ;AAAA,IACrC,OAAO;AACL,mBAAa,IAAI;AACjB,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,CAAC;AAEtB,QAAM,QAAQ,YAAY,MAAM;AAC9B,eAAW,cAAc;AACzB,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAO,EAAE,SAAS,WAAW,MAAM;AACrC;","names":[]}
@@ -1,18 +0,0 @@
1
- "use client";
2
- import { useEffect, useState } from "react";
3
- function useIsMobile() {
4
- const [isMobile, setIsMobile] = useState(false);
5
- useEffect(() => {
6
- const checkMobile = () => {
7
- setIsMobile(window.innerWidth < 1024);
8
- };
9
- checkMobile();
10
- window.addEventListener("resize", checkMobile);
11
- return () => window.removeEventListener("resize", checkMobile);
12
- }, []);
13
- return isMobile;
14
- }
15
- export {
16
- useIsMobile as default
17
- };
18
- //# sourceMappingURL=useIsMobile.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/hooks/useIsMobile.ts"],"sourcesContent":["'use client';\r\n\r\nimport { useEffect, useState } from 'react';\r\n\r\nexport default function useIsMobile() {\r\n const [isMobile, setIsMobile] = useState(false);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => {\r\n setIsMobile(window.innerWidth < 1024);\r\n };\r\n\r\n checkMobile();\r\n window.addEventListener('resize', checkMobile);\r\n return () => window.removeEventListener('resize', checkMobile);\r\n }, []);\r\n\r\n return isMobile;\r\n}\r\n"],"mappings":";AAEA,SAAS,WAAW,gBAAgB;AAErB,SAAR,cAA+B;AACpC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,cAAc,MAAM;AACxB,kBAAY,OAAO,aAAa,IAAI;AAAA,IACtC;AAEA,gBAAY;AACZ,WAAO,iBAAiB,UAAU,WAAW;AAC7C,WAAO,MAAM,OAAO,oBAAoB,UAAU,WAAW;AAAA,EAC/D,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;","names":[]}
@@ -1,13 +0,0 @@
1
- "use client";
2
- import { useState, useCallback } from "react";
3
- function usePasswordVisibility() {
4
- const [showPassword, setShowPassword] = useState(false);
5
- const togglePassword = useCallback(() => {
6
- setShowPassword((prev) => !prev);
7
- }, []);
8
- return { showPassword, togglePassword };
9
- }
10
- export {
11
- usePasswordVisibility as default
12
- };
13
- //# sourceMappingURL=usePasswordVisibility.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/hooks/usePasswordVisibility.ts"],"sourcesContent":["'use client';\r\n\r\nimport { useState, useCallback } from 'react';\r\n\r\nexport default function usePasswordVisibility() {\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n const togglePassword = useCallback(() => {\r\n setShowPassword((prev) => !prev);\r\n }, []);\r\n\r\n return { showPassword, togglePassword };\r\n}\r\n"],"mappings":";AAEA,SAAS,UAAU,mBAAmB;AAEvB,SAAR,wBAAyC;AAC9C,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AAEtD,QAAM,iBAAiB,YAAY,MAAM;AACvC,oBAAgB,CAAC,SAAS,CAAC,IAAI;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,cAAc,eAAe;AACxC;","names":[]}