@greatapps/common 1.1.214 → 1.1.216

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 (187) hide show
  1. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  2. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  3. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  5. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  6. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  7. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  8. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  9. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  10. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  11. package/dist/components/layouts/NavBar.mjs +2 -2
  12. package/dist/components/layouts/NavBar.mjs.map +1 -1
  13. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  14. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  15. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  16. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  17. package/dist/components/pages/notifications/Notifications.mjs +3 -3
  18. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  19. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  20. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  21. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  22. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  23. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  24. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  25. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  26. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  27. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  28. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  29. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  30. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  31. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  32. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  33. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  34. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  35. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  36. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  37. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  38. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  39. package/dist/components/ui/form/Input.mjs.map +1 -1
  40. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  41. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  42. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  43. package/dist/components/ui/form/Select.mjs +1 -1
  44. package/dist/components/ui/form/Select.mjs.map +1 -1
  45. package/dist/components/ui/form/Switch.mjs.map +1 -1
  46. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  47. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  48. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  49. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  50. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  51. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  52. package/dist/components/widgets/notifications/NotificationCard.mjs +1 -1
  53. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  54. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  55. package/dist/index.mjs.map +1 -1
  56. package/dist/middleware.mjs.map +1 -1
  57. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  58. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  59. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  60. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  61. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  62. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  63. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  64. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  65. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  66. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  67. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  68. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  69. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  70. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  71. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  72. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  73. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  74. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  75. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  76. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  77. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  78. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  79. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  80. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  81. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  82. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  83. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  84. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  85. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  86. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  87. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  88. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  89. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  90. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  91. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  92. package/dist/utils/countries.mjs.map +1 -1
  93. package/dist/utils/safeServerAction.mjs.map +1 -1
  94. package/dist/utils/withAction.mjs.map +1 -1
  95. package/package.json +90 -90
  96. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  97. package/src/components/account/DeleteAccountModal.tsx +130 -130
  98. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  99. package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
  100. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  101. package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
  102. package/src/components/embeds/CrispEmbed.tsx +101 -101
  103. package/src/components/embeds/FrillEmbed.tsx +119 -119
  104. package/src/components/layouts/AppMobileNavBar.tsx +111 -111
  105. package/src/components/layouts/AppNavBar.tsx +57 -57
  106. package/src/components/layouts/NavBar.tsx +120 -122
  107. package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
  108. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  109. package/src/components/navigation/NavItemsContext.ts +20 -20
  110. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  111. package/src/components/pages/notifications/Notifications.tsx +160 -160
  112. package/src/components/ui/buttons/Button.tsx +57 -57
  113. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  114. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  115. package/src/components/ui/data-display/Accordion.tsx +81 -81
  116. package/src/components/ui/data-display/Badge.tsx +47 -47
  117. package/src/components/ui/data-display/Card.tsx +93 -93
  118. package/src/components/ui/data-display/Pagination.tsx +126 -126
  119. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  120. package/src/components/ui/data-display/Separator.tsx +29 -29
  121. package/src/components/ui/data-display/Table.tsx +117 -117
  122. package/src/components/ui/data-display/Tabs.tsx +67 -67
  123. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  124. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  125. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  126. package/src/components/ui/feedback/Progress.tsx +40 -40
  127. package/src/components/ui/feedback/Toast.tsx +101 -101
  128. package/src/components/ui/form/Calendar.tsx +228 -228
  129. package/src/components/ui/form/Checkbox.tsx +31 -31
  130. package/src/components/ui/form/DatePicker.tsx +97 -97
  131. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  132. package/src/components/ui/form/Input.tsx +20 -20
  133. package/src/components/ui/form/InputOtp.tsx +80 -80
  134. package/src/components/ui/form/PhoneInput.tsx +205 -205
  135. package/src/components/ui/form/RadioGroup.tsx +45 -45
  136. package/src/components/ui/form/Select.tsx +200 -200
  137. package/src/components/ui/form/Switch.tsx +32 -32
  138. package/src/components/ui/form/Textarea.tsx +19 -19
  139. package/src/components/ui/overlay/Command.tsx +185 -185
  140. package/src/components/ui/overlay/Dialog.tsx +151 -151
  141. package/src/components/ui/overlay/Popover.tsx +49 -49
  142. package/src/components/ui/overlay/Sheet.tsx +166 -166
  143. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  144. package/src/components/widgets/notifications/NotificationCard.tsx +1 -1
  145. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  146. package/src/index.ts +355 -355
  147. package/src/middleware.ts +4 -4
  148. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  149. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  150. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  151. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  152. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  153. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  154. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  155. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  156. package/src/modules/accounts/services/account.service.ts +236 -236
  157. package/src/modules/accounts/types.ts +214 -214
  158. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  159. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  160. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  161. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  162. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  163. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  164. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  165. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  166. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  167. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  168. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  169. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  170. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  171. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  172. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  173. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  174. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  175. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  176. package/src/modules/users/action/list-messages.action.ts +12 -12
  177. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  178. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  179. package/src/modules/users/hooks/messages.hook.ts +60 -60
  180. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  181. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  182. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
  183. package/src/modules/whitelabel/styles-schema.ts +37 -37
  184. package/src/providers/whitelabel.provider.tsx +46 -46
  185. package/src/utils/countries.ts +224 -224
  186. package/src/utils/safeServerAction.ts +21 -21
  187. package/src/utils/withAction.ts +13 -13
@@ -1,31 +1,31 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
5
- import { CheckIcon } from "lucide-react";
6
- import { cn } from "../../../infra/utils/clsx";
7
-
8
- function Checkbox({
9
- className,
10
- ...props
11
- }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {
12
- return (
13
- <CheckboxPrimitive.Root
14
- data-slot="checkbox"
15
- className={cn(
16
- "peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4.5 shrink-0 rounded-[4px] border-[1.6px] shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 hover:border-gray-950 cursor-pointer",
17
- className,
18
- )}
19
- {...props}
20
- >
21
- <CheckboxPrimitive.Indicator
22
- data-slot="checkbox-indicator"
23
- className="grid place-content-center text-current transition-none"
24
- >
25
- <CheckIcon className="size-3 text-current" />
26
- </CheckboxPrimitive.Indicator>
27
- </CheckboxPrimitive.Root>
28
- );
29
- }
30
-
31
- export { Checkbox };
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
5
+ import { CheckIcon } from "lucide-react";
6
+ import { cn } from "../../../infra/utils/clsx";
7
+
8
+ function Checkbox({
9
+ className,
10
+ ...props
11
+ }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {
12
+ return (
13
+ <CheckboxPrimitive.Root
14
+ data-slot="checkbox"
15
+ className={cn(
16
+ "peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4.5 shrink-0 rounded-[4px] border-[1.6px] shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 hover:border-gray-950 cursor-pointer",
17
+ className,
18
+ )}
19
+ {...props}
20
+ >
21
+ <CheckboxPrimitive.Indicator
22
+ data-slot="checkbox-indicator"
23
+ className="grid place-content-center text-current transition-none"
24
+ >
25
+ <CheckIcon className="size-3 text-current" />
26
+ </CheckboxPrimitive.Indicator>
27
+ </CheckboxPrimitive.Root>
28
+ );
29
+ }
30
+
31
+ export { Checkbox };
@@ -1,97 +1,97 @@
1
- "use client";
2
-
3
- import { useState, forwardRef, useEffect } from "react";
4
- import { format } from "date-fns";
5
- import { Calendar } from "./Calendar";
6
- import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
7
- import { cn } from "../../../infra/utils/clsx";
8
-
9
- // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
10
- // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
11
- const isoParaDataLocal = (iso: string): Date => {
12
- const [ano, mes, dia] = iso.split("-").map(Number);
13
- return new Date(ano, mes - 1, dia);
14
- };
15
-
16
- interface DatePickerProps {
17
- value?: string;
18
- onChange?: (date: string | undefined) => void;
19
- placeholder?: string;
20
- className?: string;
21
- disabled?: boolean;
22
- }
23
-
24
- export const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(
25
- (
26
- { value, onChange, placeholder = "Selecione a data", className, disabled },
27
- ref,
28
- ) => {
29
- const [open, setOpen] = useState(false);
30
- const [date, setDate] = useState<Date | undefined>(() => {
31
- return value ? isoParaDataLocal(value) : undefined;
32
- });
33
-
34
- // Sincroniza estado interno quando value mudar externamente
35
- useEffect(() => {
36
- if (value) {
37
- setDate(isoParaDataLocal(value));
38
- } else {
39
- setDate(undefined);
40
- }
41
- }, [value]);
42
-
43
- const handleDateSelect = (selectedDate: Date | undefined) => {
44
- setDate(selectedDate);
45
-
46
- if (selectedDate) {
47
- onChange?.(format(selectedDate, "yyyy-MM-dd"));
48
- setOpen(false); // Fecha o popover após seleção
49
- } else {
50
- onChange?.(undefined);
51
- }
52
- };
53
-
54
- const displayText = date ? format(date, "dd/MM/yyyy") : placeholder;
55
-
56
- return (
57
- <Popover open={open} onOpenChange={setOpen}>
58
- <PopoverTrigger asChild>
59
- <button
60
- ref={ref}
61
- disabled={disabled}
62
- className={cn(
63
- "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
64
- "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
65
- "disabled:opacity-50 disabled:cursor-not-allowed",
66
- className,
67
- )}
68
- >
69
- <span
70
- className={cn(
71
- "paragraph-small-medium",
72
- date ? "text-gray-950" : "text-gray-500",
73
- )}
74
- >
75
- {displayText}
76
- </span>
77
- </button>
78
- </PopoverTrigger>
79
- <PopoverContent
80
- className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
81
- align="start"
82
- sideOffset={8}
83
- >
84
- <div className="p-3">
85
- <Calendar
86
- mode="single"
87
- selected={date}
88
- onSelect={handleDateSelect}
89
- />
90
- </div>
91
- </PopoverContent>
92
- </Popover>
93
- );
94
- },
95
- );
96
-
97
- DatePicker.displayName = "DatePicker";
1
+ "use client";
2
+
3
+ import { useState, forwardRef, useEffect } from "react";
4
+ import { format } from "date-fns";
5
+ import { Calendar } from "./Calendar";
6
+ import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
7
+ import { cn } from "../../../infra/utils/clsx";
8
+
9
+ // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
10
+ // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
11
+ const isoParaDataLocal = (iso: string): Date => {
12
+ const [ano, mes, dia] = iso.split("-").map(Number);
13
+ return new Date(ano, mes - 1, dia);
14
+ };
15
+
16
+ interface DatePickerProps {
17
+ value?: string;
18
+ onChange?: (date: string | undefined) => void;
19
+ placeholder?: string;
20
+ className?: string;
21
+ disabled?: boolean;
22
+ }
23
+
24
+ export const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(
25
+ (
26
+ { value, onChange, placeholder = "Selecione a data", className, disabled },
27
+ ref,
28
+ ) => {
29
+ const [open, setOpen] = useState(false);
30
+ const [date, setDate] = useState<Date | undefined>(() => {
31
+ return value ? isoParaDataLocal(value) : undefined;
32
+ });
33
+
34
+ // Sincroniza estado interno quando value mudar externamente
35
+ useEffect(() => {
36
+ if (value) {
37
+ setDate(isoParaDataLocal(value));
38
+ } else {
39
+ setDate(undefined);
40
+ }
41
+ }, [value]);
42
+
43
+ const handleDateSelect = (selectedDate: Date | undefined) => {
44
+ setDate(selectedDate);
45
+
46
+ if (selectedDate) {
47
+ onChange?.(format(selectedDate, "yyyy-MM-dd"));
48
+ setOpen(false); // Fecha o popover após seleção
49
+ } else {
50
+ onChange?.(undefined);
51
+ }
52
+ };
53
+
54
+ const displayText = date ? format(date, "dd/MM/yyyy") : placeholder;
55
+
56
+ return (
57
+ <Popover open={open} onOpenChange={setOpen}>
58
+ <PopoverTrigger asChild>
59
+ <button
60
+ ref={ref}
61
+ disabled={disabled}
62
+ className={cn(
63
+ "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
64
+ "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
65
+ "disabled:opacity-50 disabled:cursor-not-allowed",
66
+ className,
67
+ )}
68
+ >
69
+ <span
70
+ className={cn(
71
+ "paragraph-small-medium",
72
+ date ? "text-gray-950" : "text-gray-500",
73
+ )}
74
+ >
75
+ {displayText}
76
+ </span>
77
+ </button>
78
+ </PopoverTrigger>
79
+ <PopoverContent
80
+ className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
81
+ align="start"
82
+ sideOffset={8}
83
+ >
84
+ <div className="p-3">
85
+ <Calendar
86
+ mode="single"
87
+ selected={date}
88
+ onSelect={handleDateSelect}
89
+ />
90
+ </div>
91
+ </PopoverContent>
92
+ </Popover>
93
+ );
94
+ },
95
+ );
96
+
97
+ DatePicker.displayName = "DatePicker";
@@ -1,108 +1,108 @@
1
- "use client";
2
-
3
- import { useState, forwardRef, useEffect } from "react";
4
- import { format } from "date-fns";
5
- import { Calendar as CalendarIcon } from "lucide-react";
6
- import { DateRange } from "react-day-picker";
7
- import { Calendar } from "./Calendar";
8
- import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
9
- import { cn } from "../../../infra/utils/clsx";
10
-
11
- // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
12
- // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
13
- const isoParaDataLocal = (iso: string): Date => {
14
- const [ano, mes, dia] = iso.split("-").map(Number);
15
- return new Date(ano, mes - 1, dia);
16
- };
17
-
18
- interface DateRangePickerProps {
19
- value?: { from: string; to: string };
20
- onChange?: (range: { from: string; to: string } | undefined) => void;
21
- placeholder?: string;
22
- className?: string;
23
- disabled?: boolean;
24
- }
25
-
26
- export const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProps>(
27
- ({ value, onChange, placeholder = "Selecione o período", className, disabled }, ref) => {
28
- const [open, setOpen] = useState(false);
29
- const [range, setRange] = useState<DateRange | undefined>(() => {
30
- if (value?.from && value?.to) {
31
- return {
32
- from: isoParaDataLocal(value.from),
33
- to: isoParaDataLocal(value.to)
34
- };
35
- }
36
- return undefined;
37
- });
38
-
39
- useEffect(() => {
40
- if (value?.from && value?.to) {
41
- setRange({
42
- from: isoParaDataLocal(value.from),
43
- to: isoParaDataLocal(value.to)
44
- });
45
- } else {
46
- setRange(undefined);
47
- }
48
- }, [value]);
49
-
50
- const handleRangeSelect = (newRange: DateRange | undefined) => {
51
- setRange(newRange);
52
-
53
- if (newRange?.from && newRange?.to) {
54
- onChange?.({
55
- from: format(newRange.from, "yyyy-MM-dd"),
56
- to: format(newRange.to, "yyyy-MM-dd")
57
- });
58
- } else {
59
- onChange?.(undefined);
60
- }
61
- };
62
-
63
- const displayText = range?.from && range?.to
64
- ? `${format(range.from, "dd/MM/yyyy")} - ${format(range.to, "dd/MM/yyyy")}`
65
- : placeholder;
66
-
67
- return (
68
- <Popover open={open} onOpenChange={setOpen}>
69
- <PopoverTrigger asChild>
70
- <button
71
- ref={ref}
72
- disabled={disabled}
73
- className={cn(
74
- "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
75
- "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
76
- "disabled:opacity-50 disabled:cursor-not-allowed",
77
- className
78
- )}
79
- >
80
- <CalendarIcon size={20} className="text-gray-400" />
81
- <span className={cn(
82
- "paragraph-small-medium",
83
- range?.from && range?.to ? "text-gray-950" : "text-gray-500"
84
- )}>
85
- {displayText}
86
- </span>
87
- </button>
88
- </PopoverTrigger>
89
- <PopoverContent
90
- className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
91
- align="start"
92
- sideOffset={8}
93
- >
94
- <div className="p-3">
95
- <Calendar
96
- mode="range"
97
- selected={range}
98
- onSelect={handleRangeSelect}
99
- numberOfMonths={1}
100
- />
101
- </div>
102
- </PopoverContent>
103
- </Popover>
104
- );
105
- }
106
- );
107
-
108
- DateRangePicker.displayName = "DateRangePicker";
1
+ "use client";
2
+
3
+ import { useState, forwardRef, useEffect } from "react";
4
+ import { format } from "date-fns";
5
+ import { Calendar as CalendarIcon } from "lucide-react";
6
+ import { DateRange } from "react-day-picker";
7
+ import { Calendar } from "./Calendar";
8
+ import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
9
+ import { cn } from "../../../infra/utils/clsx";
10
+
11
+ // Converte string ISO (yyyy-MM-dd) para Date no fuso horário local
12
+ // Evita bug de timezone onde new Date("2025-08-02") interpreta como UTC
13
+ const isoParaDataLocal = (iso: string): Date => {
14
+ const [ano, mes, dia] = iso.split("-").map(Number);
15
+ return new Date(ano, mes - 1, dia);
16
+ };
17
+
18
+ interface DateRangePickerProps {
19
+ value?: { from: string; to: string };
20
+ onChange?: (range: { from: string; to: string } | undefined) => void;
21
+ placeholder?: string;
22
+ className?: string;
23
+ disabled?: boolean;
24
+ }
25
+
26
+ export const DateRangePicker = forwardRef<HTMLButtonElement, DateRangePickerProps>(
27
+ ({ value, onChange, placeholder = "Selecione o período", className, disabled }, ref) => {
28
+ const [open, setOpen] = useState(false);
29
+ const [range, setRange] = useState<DateRange | undefined>(() => {
30
+ if (value?.from && value?.to) {
31
+ return {
32
+ from: isoParaDataLocal(value.from),
33
+ to: isoParaDataLocal(value.to)
34
+ };
35
+ }
36
+ return undefined;
37
+ });
38
+
39
+ useEffect(() => {
40
+ if (value?.from && value?.to) {
41
+ setRange({
42
+ from: isoParaDataLocal(value.from),
43
+ to: isoParaDataLocal(value.to)
44
+ });
45
+ } else {
46
+ setRange(undefined);
47
+ }
48
+ }, [value]);
49
+
50
+ const handleRangeSelect = (newRange: DateRange | undefined) => {
51
+ setRange(newRange);
52
+
53
+ if (newRange?.from && newRange?.to) {
54
+ onChange?.({
55
+ from: format(newRange.from, "yyyy-MM-dd"),
56
+ to: format(newRange.to, "yyyy-MM-dd")
57
+ });
58
+ } else {
59
+ onChange?.(undefined);
60
+ }
61
+ };
62
+
63
+ const displayText = range?.from && range?.to
64
+ ? `${format(range.from, "dd/MM/yyyy")} - ${format(range.to, "dd/MM/yyyy")}`
65
+ : placeholder;
66
+
67
+ return (
68
+ <Popover open={open} onOpenChange={setOpen}>
69
+ <PopoverTrigger asChild>
70
+ <button
71
+ ref={ref}
72
+ disabled={disabled}
73
+ className={cn(
74
+ "flex items-center gap-2 px-4 h-10 border rounded-lg transition-colors w-full justify-start",
75
+ "border-gray-200 hover:border-gray-400 focus-within:border-gray-950",
76
+ "disabled:opacity-50 disabled:cursor-not-allowed",
77
+ className
78
+ )}
79
+ >
80
+ <CalendarIcon size={20} className="text-gray-400" />
81
+ <span className={cn(
82
+ "paragraph-small-medium",
83
+ range?.from && range?.to ? "text-gray-950" : "text-gray-500"
84
+ )}>
85
+ {displayText}
86
+ </span>
87
+ </button>
88
+ </PopoverTrigger>
89
+ <PopoverContent
90
+ className="w-auto p-0 bg-white rounded-2xl shadow-md border border-gray-200"
91
+ align="start"
92
+ sideOffset={8}
93
+ >
94
+ <div className="p-3">
95
+ <Calendar
96
+ mode="range"
97
+ selected={range}
98
+ onSelect={handleRangeSelect}
99
+ numberOfMonths={1}
100
+ />
101
+ </div>
102
+ </PopoverContent>
103
+ </Popover>
104
+ );
105
+ }
106
+ );
107
+
108
+ DateRangePicker.displayName = "DateRangePicker";
@@ -1,20 +1,20 @@
1
- 'use client';
2
-
3
- import * as React from "react"
4
- import { cn } from "../../../infra/utils/clsx"
5
-
6
- function Input({ className, type, ...props }: React.ComponentProps<"input">) {
7
- return (
8
- <input
9
- type={type}
10
- data-slot="input"
11
- className={cn(
12
- "outline-none disabled:opacity-50 disabled:placeholder:opacity-50",
13
- className
14
- )}
15
- {...props}
16
- />
17
- )
18
- }
19
-
20
- export { Input }
1
+ 'use client';
2
+
3
+ import * as React from "react"
4
+ import { cn } from "../../../infra/utils/clsx"
5
+
6
+ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
7
+ return (
8
+ <input
9
+ type={type}
10
+ data-slot="input"
11
+ className={cn(
12
+ "outline-none disabled:opacity-50 disabled:placeholder:opacity-50",
13
+ className
14
+ )}
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ export { Input }