@greatapps/common 1.1.219 → 1.1.221

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 (217) 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 +0 -1
  20. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  21. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  22. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  23. package/dist/components/layouts/NavBar.mjs.map +1 -1
  24. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  25. package/dist/components/layouts/ProfilePopover.mjs +7 -10
  26. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  27. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  28. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  29. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  30. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  31. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  32. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  33. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  34. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  35. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  36. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  37. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  38. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  39. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  40. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  41. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  42. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  43. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  44. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  45. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  46. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  47. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  48. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  49. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  50. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  51. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  52. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  53. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  54. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  55. package/dist/components/ui/form/FormField.mjs.map +1 -1
  56. package/dist/components/ui/form/Input.mjs.map +1 -1
  57. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  58. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  59. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  60. package/dist/components/ui/form/Select.mjs +1 -1
  61. package/dist/components/ui/form/Select.mjs.map +1 -1
  62. package/dist/components/ui/form/Switch.mjs.map +1 -1
  63. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  64. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  65. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  66. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  67. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  68. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  69. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  70. package/dist/index.mjs.map +1 -1
  71. package/dist/middleware.mjs.map +1 -1
  72. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  73. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  74. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  75. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  76. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  77. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  78. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  79. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  80. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  81. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  82. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  83. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  84. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  85. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  86. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  87. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  88. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  89. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  90. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  91. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  92. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  93. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  94. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  95. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  96. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  97. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  98. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  99. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  100. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  101. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  102. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  103. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  104. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  105. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  106. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  107. package/dist/utils/countries.mjs.map +1 -1
  108. package/dist/utils/safeServerAction.mjs.map +1 -1
  109. package/dist/utils/withAction.mjs.map +1 -1
  110. package/package.json +89 -89
  111. package/src/components/account/ConfigurationsMyAccountModal.tsx +150 -150
  112. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  113. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  114. package/src/components/account/DeleteAccountModal.tsx +130 -130
  115. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  116. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  117. package/src/components/account/TwoFactorAuthModal.tsx +223 -223
  118. package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
  119. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  120. package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
  121. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  122. package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
  123. package/src/components/account/sections/MyProfileSection.tsx +327 -327
  124. package/src/components/account/sections/PreferencesSection.tsx +273 -273
  125. package/src/components/account/sections/SecuritySection.tsx +160 -160
  126. package/src/components/embeds/CrispEmbed.tsx +101 -101
  127. package/src/components/embeds/FrillEmbed.tsx +119 -119
  128. package/src/components/layouts/AppMobileNavBar.tsx +110 -111
  129. package/src/components/layouts/AppNavBar.tsx +57 -57
  130. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  131. package/src/components/layouts/NavBar.tsx +120 -120
  132. package/src/components/layouts/NotificationsPopover.tsx +115 -115
  133. package/src/components/layouts/ProfilePopover.tsx +179 -184
  134. package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
  135. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  136. package/src/components/navigation/NavItemsContext.ts +20 -20
  137. package/src/components/navigation/ProjectSelectorPopover.tsx +151 -151
  138. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  139. package/src/components/navigation/subcomponents/ProjectSelector.tsx +149 -149
  140. package/src/components/pages/notifications/Notifications.tsx +160 -160
  141. package/src/components/ui/buttons/Button.tsx +57 -57
  142. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  143. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  144. package/src/components/ui/data-display/Accordion.tsx +81 -81
  145. package/src/components/ui/data-display/Badge.tsx +47 -47
  146. package/src/components/ui/data-display/Card.tsx +93 -93
  147. package/src/components/ui/data-display/Pagination.tsx +126 -126
  148. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  149. package/src/components/ui/data-display/Separator.tsx +29 -29
  150. package/src/components/ui/data-display/Table.tsx +117 -117
  151. package/src/components/ui/data-display/Tabs.tsx +67 -67
  152. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  153. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  154. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  155. package/src/components/ui/feedback/Progress.tsx +40 -40
  156. package/src/components/ui/feedback/Toast.tsx +101 -101
  157. package/src/components/ui/form/Calendar.tsx +228 -228
  158. package/src/components/ui/form/Checkbox.tsx +31 -31
  159. package/src/components/ui/form/ComboboxField.tsx +154 -154
  160. package/src/components/ui/form/DatePicker.tsx +97 -97
  161. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  162. package/src/components/ui/form/FormField.tsx +131 -131
  163. package/src/components/ui/form/Input.tsx +20 -20
  164. package/src/components/ui/form/InputOtp.tsx +80 -80
  165. package/src/components/ui/form/PhoneInput.tsx +205 -205
  166. package/src/components/ui/form/RadioGroup.tsx +45 -45
  167. package/src/components/ui/form/Select.tsx +200 -200
  168. package/src/components/ui/form/Switch.tsx +32 -32
  169. package/src/components/ui/form/Textarea.tsx +19 -19
  170. package/src/components/ui/overlay/Command.tsx +185 -185
  171. package/src/components/ui/overlay/Dialog.tsx +151 -151
  172. package/src/components/ui/overlay/Popover.tsx +49 -49
  173. package/src/components/ui/overlay/Sheet.tsx +166 -166
  174. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  175. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  176. package/src/index.ts +355 -355
  177. package/src/middleware.ts +4 -4
  178. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  179. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  180. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  181. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  182. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  183. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  184. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  185. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  186. package/src/modules/accounts/services/account.service.ts +236 -236
  187. package/src/modules/accounts/types.ts +214 -214
  188. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  189. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  190. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  191. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  192. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  193. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  194. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  195. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  196. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  197. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  198. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  199. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  200. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  201. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  202. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  203. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  204. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  205. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  206. package/src/modules/users/action/list-messages.action.ts +12 -12
  207. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  208. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  209. package/src/modules/users/hooks/messages.hook.ts +60 -60
  210. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  211. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  212. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
  213. package/src/modules/whitelabel/styles-schema.ts +37 -37
  214. package/src/providers/whitelabel.provider.tsx +46 -46
  215. package/src/utils/countries.ts +224 -224
  216. package/src/utils/safeServerAction.ts +21 -21
  217. package/src/utils/withAction.ts +13 -13
@@ -1,184 +1,179 @@
1
- "use client";
2
-
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 { Progress } from "../ui/feedback/Progress";
8
- import { Separator } from "../ui/data-display/Separator";
9
- import { IconSettings } from '@tabler/icons-react';
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
-
17
- export interface ProfileMenuItem {
18
- icon?: React.ReactNode;
19
- label: string;
20
- onClick: () => void;
21
- }
22
-
23
- export interface ProfilePopoverProps {
24
- side?: "top" | "bottom" | "left" | "right";
25
- align?: "start" | "center" | "end";
26
- contentClassName?: string;
27
- onEditProfile?: () => void;
28
- onCreditsClick?: () => void;
29
- menuItems?: ProfileMenuItem[];
30
- logoutRedirect?: string;
31
- }
32
-
33
- function ProfilePopover({
34
- side = "top",
35
- align = "start",
36
- contentClassName = "absolute bottom-2 left-[26px]",
37
- onEditProfile,
38
- onCreditsClick,
39
- menuItems = [],
40
- logoutRedirect = "/login",
41
- }: ProfilePopoverProps) {
42
- const router = useRouter();
43
- const { user, logout } = useAuth();
44
- const [isLoggingOut, setIsLoggingOut] = useState(false);
45
-
46
- const { summary, subscription, isSubscriptionLoading, isCreditsLoading } =
47
- useIaCredits();
48
-
49
- const handleLogout = async () => {
50
- try {
51
- setIsLoggingOut(true);
52
- await logout();
53
- } finally {
54
- setIsLoggingOut(false);
55
- if (logoutRedirect !== "/login") {
56
- router.push(logoutRedirect);
57
- }
58
- }
59
- };
60
-
61
- const hasSubscription = !isSubscriptionLoading && subscription !== null;
62
- const showCreditsSkeleton = hasSubscription && isCreditsLoading;
63
- const showCredits =
64
- hasSubscription && !isCreditsLoading;
65
- const creditsPercentage =
66
- showCredits && summary.totalCredits > 0
67
- ? (summary.usedCredits / summary.totalCredits) * 100
68
- : 0;
69
-
70
- return (
71
- <>
72
- <LoadingOverlay isLoading={isLoggingOut} message="Saindo da sua conta..." />
73
- <Popover>
74
- <PopoverPrimitive.Trigger className="cursor-pointer">
75
- {user && (
76
- <UserAvatar
77
- key={user.id}
78
- photo={user.photo}
79
- name={user.name}
80
- size={40}
81
- />
82
- )}
83
- </PopoverPrimitive.Trigger>
84
-
85
- <PopoverPrimitive.Portal>
86
- <PopoverPrimitive.Content
87
- className={cn(
88
- "w-64.75 p-0 bg-white rounded-2xl shadow-md border border-gray-200 z-99",
89
- contentClassName,
90
- )}
91
- side={side}
92
- align={align}
93
- sideOffset={8}
94
- >
95
- <div className="grid grid-cols-[32px_1fr] items-center gap-3 p-3 w-full">
96
- {user && (
97
- <UserAvatar
98
- key={user.id}
99
- photo={user.photo}
100
- name={user.name}
101
- size={32}
102
- />
103
- )}
104
-
105
- <div className="flex flex-col gap-0.5 min-w-0">
106
- <span className="paragraph-small-semibold text-gray-950 truncate">
107
- {user?.name || ""}
108
- </span>
109
- <span className="paragraph-xsmall-medium text-gray-500 truncate">
110
- {user?.email || ""}
111
- </span>
112
- </div>
113
- </div>
114
-
115
- <div className="flex flex-col gap-2 border-t border-gray-200 rounded-2xl p-1.5">
116
- {showCreditsSkeleton && (
117
- <div className="flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4">
118
- <div className="flex items-center justify-between gap-2">
119
- <span className="paragraph-xsmall-semibold text-white truncate">
120
- Créditos usados
121
- </span>
122
- <div className="skeleton h-3.5 w-16 rounded" />
123
- </div>
124
- <div className="skeleton h-1.5 w-full rounded-full" />
125
- </div>
126
- )}
127
-
128
- {showCredits && (
129
- <div
130
- className={cn(
131
- "flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4 transition-colors",
132
- onCreditsClick && "cursor-pointer hover:bg-gray-900",
133
- )}
134
- onClick={onCreditsClick}
135
- >
136
- <div className="flex items-center justify-between gap-2">
137
- <span className="paragraph-xsmall-semibold text-white truncate">
138
- Créditos usados
139
- </span>
140
- <span className="paragraph-xsmall-medium text-white/50">
141
- {summary.usedCredits.toLocaleString("pt-BR")}/
142
- {summary.totalCredits.toLocaleString("pt-BR")}
143
- </span>
144
- </div>
145
- <Progress
146
- className="bg-white/10"
147
- indicatorColor="bg-white"
148
- value={creditsPercentage}
149
- />
150
- </div>
151
- )}
152
-
153
- <div className="flex flex-col gap-2">
154
- {menuItems.length > 0 && (
155
- <div className="flex flex-col">
156
- {menuItems.map((item, index) => (
157
- <NavBarItem
158
- key={index}
159
- icon={item.icon}
160
- label={item.label}
161
- onClick={item.onClick}
162
- />
163
- ))}
164
- </div>
165
- )}
166
- {onEditProfile && (
167
- <NavBarItem
168
- icon={<IconSettings size={16} />}
169
- label="Configurações"
170
- onClick={onEditProfile}
171
- />
172
- )}
173
- <Separator />
174
- <NavBarItem label="Sair" onClick={handleLogout} />
175
- </div>
176
- </div>
177
- </PopoverPrimitive.Content>
178
- </PopoverPrimitive.Portal>
179
- </Popover>
180
- </>
181
- );
182
- }
183
-
184
- export { ProfilePopover };
1
+ "use client";
2
+
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 { Progress } from "../ui/feedback/Progress";
8
+ import { Separator } from "../ui/data-display/Separator";
9
+ import { IconSettings } from "@tabler/icons-react";
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
+
17
+ export interface ProfileMenuItem {
18
+ icon?: React.ReactNode;
19
+ label: string;
20
+ onClick: () => void;
21
+ }
22
+
23
+ export interface ProfilePopoverProps {
24
+ side?: "top" | "bottom" | "left" | "right";
25
+ align?: "start" | "center" | "end";
26
+ contentClassName?: string;
27
+ onEditProfile?: () => void;
28
+ onCreditsClick?: () => void;
29
+ menuItems?: ProfileMenuItem[];
30
+ logoutRedirect?: string;
31
+ }
32
+
33
+ function ProfilePopover({
34
+ side = "top",
35
+ align = "start",
36
+ contentClassName = "absolute bottom-2 left-[26px]",
37
+ onEditProfile,
38
+ onCreditsClick,
39
+ menuItems = [],
40
+ logoutRedirect = "/login",
41
+ }: ProfilePopoverProps) {
42
+ const router = useRouter();
43
+ const { user, logout } = useAuth();
44
+ const [isLoggingOut, setIsLoggingOut] = useState(false);
45
+
46
+ const { summary, subscription, isSubscriptionLoading, isCreditsLoading } =
47
+ useIaCredits();
48
+
49
+ const handleLogout = async () => {
50
+ try {
51
+ setIsLoggingOut(true);
52
+ await logout();
53
+ } finally {
54
+ setIsLoggingOut(false);
55
+ if (logoutRedirect !== "/login") {
56
+ router.push(logoutRedirect);
57
+ }
58
+ }
59
+ };
60
+
61
+ const hasSubscription = !isSubscriptionLoading && subscription !== null;
62
+ const showCreditsSkeleton = hasSubscription && isCreditsLoading;
63
+ const showCredits = hasSubscription && !isCreditsLoading;
64
+ const creditsPercentage =
65
+ showCredits && summary.totalCredits > 0
66
+ ? (summary.usedCredits / summary.totalCredits) * 100
67
+ : 0;
68
+
69
+ return (
70
+ <>
71
+ <LoadingOverlay
72
+ isLoading={isLoggingOut}
73
+ message="Saindo da sua conta..."
74
+ />
75
+ <Popover>
76
+ <PopoverPrimitive.Trigger className="cursor-pointer">
77
+ {user && (
78
+ <UserAvatar
79
+ key={user.id}
80
+ photo={user.photo}
81
+ name={user.name}
82
+ size={40}
83
+ />
84
+ )}
85
+ </PopoverPrimitive.Trigger>
86
+
87
+ <PopoverPrimitive.Portal>
88
+ <PopoverPrimitive.Content
89
+ className={cn(
90
+ "w-64.75 p-0 bg-white rounded-2xl shadow-md border border-gray-200 z-99",
91
+ contentClassName,
92
+ )}
93
+ side={side}
94
+ align={align}
95
+ sideOffset={8}
96
+ >
97
+ <div className="grid grid-cols-[32px_1fr] items-center gap-3 p-3 w-full">
98
+ {user && (
99
+ <UserAvatar
100
+ key={user.id}
101
+ photo={user.photo}
102
+ name={user.name}
103
+ size={32}
104
+ />
105
+ )}
106
+
107
+ <div className="flex flex-col gap-0.5 min-w-0">
108
+ <span className="paragraph-small-semibold text-gray-950 truncate">
109
+ {user?.name || ""}
110
+ </span>
111
+ <span className="paragraph-xsmall-medium text-gray-500 truncate">
112
+ {user?.email || ""}
113
+ </span>
114
+ </div>
115
+ </div>
116
+
117
+ <div className="flex flex-col gap-2 border-t border-gray-200 rounded-2xl p-1.5">
118
+ {showCreditsSkeleton && (
119
+ <div className="flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4">
120
+ <div className="flex items-center justify-between gap-2">
121
+ <span className="paragraph-xsmall-semibold text-white truncate">
122
+ Créditos usados
123
+ </span>
124
+ <div className="skeleton h-3.5 w-16 rounded" />
125
+ </div>
126
+ <div className="skeleton h-1.5 w-full rounded-full" />
127
+ </div>
128
+ )}
129
+
130
+ {showCredits && (
131
+ <div
132
+ className={cn(
133
+ "flex flex-col bg-gray-950 rounded-lg gap-4 w-full p-4 transition-colors",
134
+ onCreditsClick && "cursor-pointer hover:bg-gray-900",
135
+ )}
136
+ onClick={onCreditsClick}
137
+ >
138
+ <div className="flex items-center justify-between gap-2">
139
+ <span className="paragraph-xsmall-semibold text-white truncate">
140
+ Créditos usados
141
+ </span>
142
+ <span className="paragraph-xsmall-medium text-white/50">
143
+ {summary.usedCredits.toLocaleString("pt-BR")}/
144
+ {summary.totalCredits.toLocaleString("pt-BR")}
145
+ </span>
146
+ </div>
147
+ <Progress
148
+ className="bg-white/10"
149
+ indicatorColor="bg-white"
150
+ value={creditsPercentage}
151
+ />
152
+ </div>
153
+ )}
154
+
155
+ <div className="flex flex-col gap-2">
156
+ {menuItems.length > 0 && (
157
+ <div className="flex flex-col">
158
+ {menuItems.map((item, index) => (
159
+ <NavBarItem
160
+ key={index}
161
+ icon={item.icon}
162
+ label={item.label}
163
+ onClick={item.onClick}
164
+ />
165
+ ))}
166
+ </div>
167
+ )}
168
+ <Separator />
169
+ <NavBarItem label="Sair" onClick={handleLogout} />
170
+ </div>
171
+ </div>
172
+ </PopoverPrimitive.Content>
173
+ </PopoverPrimitive.Portal>
174
+ </Popover>
175
+ </>
176
+ );
177
+ }
178
+
179
+ export { ProfilePopover };