@greatapps/common 1.1.212 → 1.1.214

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 (182) 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.map +1 -1
  12. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  13. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  14. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  15. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  16. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  17. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  18. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  19. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  20. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  21. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  22. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  23. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  24. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  25. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  26. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  27. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  28. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  29. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  30. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  31. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  32. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  33. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  34. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  35. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  36. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  37. package/dist/components/ui/form/Input.mjs.map +1 -1
  38. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  39. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  40. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  41. package/dist/components/ui/form/Select.mjs +1 -1
  42. package/dist/components/ui/form/Select.mjs.map +1 -1
  43. package/dist/components/ui/form/Switch.mjs.map +1 -1
  44. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  45. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  46. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  47. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  48. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  49. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  50. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  51. package/dist/index.mjs.map +1 -1
  52. package/dist/middleware.mjs.map +1 -1
  53. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  54. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  55. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  56. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  57. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  58. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  59. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  60. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  61. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  62. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  63. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  64. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  65. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  66. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  67. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  68. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  69. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  70. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  71. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  72. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  73. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  74. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  75. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  76. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  77. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  78. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  79. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  80. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  81. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  82. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  83. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  84. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  85. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  86. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  87. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  88. package/dist/utils/countries.mjs.map +1 -1
  89. package/dist/utils/safeServerAction.mjs.map +1 -1
  90. package/dist/utils/withAction.mjs.map +1 -1
  91. package/package.json +90 -90
  92. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  93. package/src/components/account/DeleteAccountModal.tsx +130 -130
  94. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  95. package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
  96. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  97. package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
  98. package/src/components/embeds/CrispEmbed.tsx +101 -101
  99. package/src/components/embeds/FrillEmbed.tsx +119 -119
  100. package/src/components/layouts/AppMobileNavBar.tsx +111 -111
  101. package/src/components/layouts/AppNavBar.tsx +57 -57
  102. package/src/components/layouts/NavBar.tsx +122 -122
  103. package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
  104. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  105. package/src/components/navigation/NavItemsContext.ts +20 -20
  106. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  107. package/src/components/pages/notifications/Notifications.tsx +160 -160
  108. package/src/components/ui/buttons/Button.tsx +57 -57
  109. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  110. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  111. package/src/components/ui/data-display/Accordion.tsx +81 -81
  112. package/src/components/ui/data-display/Badge.tsx +47 -47
  113. package/src/components/ui/data-display/Card.tsx +93 -93
  114. package/src/components/ui/data-display/Pagination.tsx +126 -126
  115. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  116. package/src/components/ui/data-display/Separator.tsx +29 -29
  117. package/src/components/ui/data-display/Table.tsx +117 -117
  118. package/src/components/ui/data-display/Tabs.tsx +67 -67
  119. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  120. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  121. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  122. package/src/components/ui/feedback/Progress.tsx +40 -40
  123. package/src/components/ui/feedback/Toast.tsx +101 -101
  124. package/src/components/ui/form/Calendar.tsx +228 -228
  125. package/src/components/ui/form/Checkbox.tsx +31 -31
  126. package/src/components/ui/form/DatePicker.tsx +97 -97
  127. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  128. package/src/components/ui/form/Input.tsx +20 -20
  129. package/src/components/ui/form/InputOtp.tsx +80 -80
  130. package/src/components/ui/form/PhoneInput.tsx +205 -205
  131. package/src/components/ui/form/RadioGroup.tsx +45 -45
  132. package/src/components/ui/form/Select.tsx +200 -200
  133. package/src/components/ui/form/Switch.tsx +32 -32
  134. package/src/components/ui/form/Textarea.tsx +19 -19
  135. package/src/components/ui/overlay/Command.tsx +185 -185
  136. package/src/components/ui/overlay/Dialog.tsx +151 -151
  137. package/src/components/ui/overlay/Popover.tsx +49 -49
  138. package/src/components/ui/overlay/Sheet.tsx +166 -166
  139. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  140. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  141. package/src/index.ts +355 -355
  142. package/src/middleware.ts +4 -4
  143. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  144. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  145. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  146. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  147. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  148. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  149. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  150. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  151. package/src/modules/accounts/services/account.service.ts +236 -236
  152. package/src/modules/accounts/types.ts +214 -214
  153. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  154. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  155. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  156. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  157. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  158. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  159. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  160. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  161. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  162. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  163. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  164. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  165. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  166. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  167. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  168. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  169. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  170. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  171. package/src/modules/users/action/list-messages.action.ts +12 -12
  172. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  173. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  174. package/src/modules/users/hooks/messages.hook.ts +60 -60
  175. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  176. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  177. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
  178. package/src/modules/whitelabel/styles-schema.ts +37 -37
  179. package/src/providers/whitelabel.provider.tsx +46 -46
  180. package/src/utils/countries.ts +224 -224
  181. package/src/utils/safeServerAction.ts +21 -21
  182. package/src/utils/withAction.ts +13 -13
@@ -1,49 +1,49 @@
1
- 'use client';
2
-
3
- import { TriangleAlert } from 'lucide-react';
4
- import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/overlay/Dialog';
5
- import { Button } from '../ui/buttons/Button';
6
- import { useAccountModals } from '../../store/useAccountModals';
7
-
8
- export default function IsntPossibleDeleteAccountModal() {
9
- const { activeModal, close, config } = useAccountModals();
10
- const { onGoToSubscription } = config;
11
- const open = activeModal === 'isntPossibleDelete';
12
-
13
- return (
14
- <Dialog open={open} onOpenChange={close}>
15
- <DialogContent className="max-w-[calc(100%-2rem)]! w-full rounded-lg border sm:max-w-[400px]! lg:max-w-[470px]! lg:top-[50%]! lg:left-[50%]! lg:right-auto! lg:bottom-auto! lg:translate-x-[-50%]! lg:translate-y-[-50%]!">
16
- <div className="flex flex-col gap-5">
17
- <div className="flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5">
18
- <TriangleAlert size={20} className="text-red-500" />
19
- </div>
20
- <DialogHeader className="p-0 gap-2">
21
- <DialogTitle className="paragraph-medium-semibold text-gray-950">
22
- Não é possível excluir a conta
23
- </DialogTitle>
24
- <DialogDescription className="paragraph-small-regular text-gray-600">
25
- Você tem uma assinatura ativa. Para excluir sua conta,{' '}
26
- <span className="font-semibold text-gray-950">primeiro cancele a assinatura</span> na
27
- página Assinatura e depois tente novamente.
28
- </DialogDescription>
29
- </DialogHeader>
30
- </div>
31
-
32
- <div className="h-px bg-gray-200 -mx-6" />
33
-
34
- <div className="flex flex-row items-center gap-2">
35
- <Button className="h-10 flex-1" onClick={close}>
36
- Ok, entendi
37
- </Button>
38
- <Button
39
- variant="secondary"
40
- className="h-10 flex-1"
41
- onClick={onGoToSubscription ?? close}
42
- >
43
- Ir para assinatura
44
- </Button>
45
- </div>
46
- </DialogContent>
47
- </Dialog>
48
- );
49
- }
1
+ 'use client';
2
+
3
+ import { TriangleAlert } from 'lucide-react';
4
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/overlay/Dialog';
5
+ import { Button } from '../ui/buttons/Button';
6
+ import { useAccountModals } from '../../store/useAccountModals';
7
+
8
+ export default function IsntPossibleDeleteAccountModal() {
9
+ const { activeModal, close, config } = useAccountModals();
10
+ const { onGoToSubscription } = config;
11
+ const open = activeModal === 'isntPossibleDelete';
12
+
13
+ return (
14
+ <Dialog open={open} onOpenChange={close}>
15
+ <DialogContent className="max-w-[calc(100%-2rem)]! w-full rounded-lg border sm:max-w-[400px]! lg:max-w-[470px]! lg:top-[50%]! lg:left-[50%]! lg:right-auto! lg:bottom-auto! lg:translate-x-[-50%]! lg:translate-y-[-50%]!">
16
+ <div className="flex flex-col gap-5">
17
+ <div className="flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5">
18
+ <TriangleAlert size={20} className="text-red-500" />
19
+ </div>
20
+ <DialogHeader className="p-0 gap-2">
21
+ <DialogTitle className="paragraph-medium-semibold text-gray-950">
22
+ Não é possível excluir a conta
23
+ </DialogTitle>
24
+ <DialogDescription className="paragraph-small-regular text-gray-600">
25
+ Você tem uma assinatura ativa. Para excluir sua conta,{' '}
26
+ <span className="font-semibold text-gray-950">primeiro cancele a assinatura</span> na
27
+ página Assinatura e depois tente novamente.
28
+ </DialogDescription>
29
+ </DialogHeader>
30
+ </div>
31
+
32
+ <div className="h-px bg-gray-200 -mx-6" />
33
+
34
+ <div className="flex flex-row items-center gap-2">
35
+ <Button className="h-10 flex-1" onClick={close}>
36
+ Ok, entendi
37
+ </Button>
38
+ <Button
39
+ variant="secondary"
40
+ className="h-10 flex-1"
41
+ onClick={onGoToSubscription ?? close}
42
+ >
43
+ Ir para assinatura
44
+ </Button>
45
+ </div>
46
+ </DialogContent>
47
+ </Dialog>
48
+ );
49
+ }
@@ -1,81 +1,81 @@
1
- 'use client';
2
-
3
- import { useState, useCallback } from 'react';
4
- import { toast } from 'sonner';
5
- import { Toast } from '../../ui/feedback/Toast';
6
- import { requestPhoneChangeAction } from '../../../modules/accounts/actions/account-management.action';
7
-
8
- function splitPhoneValue(fullValue: string): { ddi: string; local: string } {
9
- const trimmed = fullValue.trim();
10
- const spaceIdx = trimmed.indexOf(' ');
11
- if (spaceIdx === -1) return { ddi: '+55', local: trimmed };
12
- return { ddi: trimmed.slice(0, spaceIdx), local: trimmed.slice(spaceIdx + 1) };
13
- }
14
-
15
- export default function useChangePhoneForm() {
16
- const [showVerification, setShowVerification] = useState(false);
17
- const [phoneValue, setPhoneValue] = useState('');
18
- const [phoneError, setPhoneError] = useState('');
19
- const [isSubmitting, setIsSubmitting] = useState(false);
20
- const [submittedPhone, setSubmittedPhone] = useState({ ddi: '+55', local: '' });
21
-
22
- const handlePhoneChange = useCallback((value: string) => {
23
- setPhoneValue(value);
24
- if (phoneError) setPhoneError('');
25
- }, [phoneError]);
26
-
27
- const handleContinue = useCallback(async (e: React.FormEvent) => {
28
- e.preventDefault();
29
-
30
- const { ddi, local } = splitPhoneValue(phoneValue);
31
-
32
- if (!local || local.replace(/\D/g, '').length < 8) {
33
- setPhoneError('Número de telefone inválido');
34
- return;
35
- }
36
-
37
- setIsSubmitting(true);
38
- try {
39
- const result = await requestPhoneChangeAction(local, ddi);
40
-
41
- if (!result.success) {
42
- toast.custom((t) => (
43
- <Toast
44
- variant="error"
45
- message={result.error ?? 'Número já existente ou ocorreu um erro. Tente novamente mais tarde.'}
46
- toastId={t}
47
- />
48
- ));
49
- return;
50
- }
51
-
52
- setSubmittedPhone({ ddi, local });
53
- setShowVerification(true);
54
- } finally {
55
- setIsSubmitting(false);
56
- }
57
- }, [phoneValue]);
58
-
59
- const handleBack = useCallback(() => {
60
- setShowVerification(false);
61
- }, []);
62
-
63
- const resetForm = useCallback(() => {
64
- setPhoneValue('');
65
- setPhoneError('');
66
- setSubmittedPhone({ ddi: '+55', local: '' });
67
- setShowVerification(false);
68
- }, []);
69
-
70
- return {
71
- showVerification,
72
- phoneValue,
73
- phoneError,
74
- isSubmitting,
75
- submittedPhone,
76
- handlePhoneChange,
77
- handleContinue,
78
- handleBack,
79
- resetForm,
80
- };
81
- }
1
+ 'use client';
2
+
3
+ import { useState, useCallback } from 'react';
4
+ import { toast } from 'sonner';
5
+ import { Toast } from '../../ui/feedback/Toast';
6
+ import { requestPhoneChangeAction } from '../../../modules/accounts/actions/account-management.action';
7
+
8
+ function splitPhoneValue(fullValue: string): { ddi: string; local: string } {
9
+ const trimmed = fullValue.trim();
10
+ const spaceIdx = trimmed.indexOf(' ');
11
+ if (spaceIdx === -1) return { ddi: '+55', local: trimmed };
12
+ return { ddi: trimmed.slice(0, spaceIdx), local: trimmed.slice(spaceIdx + 1) };
13
+ }
14
+
15
+ export default function useChangePhoneForm() {
16
+ const [showVerification, setShowVerification] = useState(false);
17
+ const [phoneValue, setPhoneValue] = useState('');
18
+ const [phoneError, setPhoneError] = useState('');
19
+ const [isSubmitting, setIsSubmitting] = useState(false);
20
+ const [submittedPhone, setSubmittedPhone] = useState({ ddi: '+55', local: '' });
21
+
22
+ const handlePhoneChange = useCallback((value: string) => {
23
+ setPhoneValue(value);
24
+ if (phoneError) setPhoneError('');
25
+ }, [phoneError]);
26
+
27
+ const handleContinue = useCallback(async (e: React.FormEvent) => {
28
+ e.preventDefault();
29
+
30
+ const { ddi, local } = splitPhoneValue(phoneValue);
31
+
32
+ if (!local || local.replace(/\D/g, '').length < 8) {
33
+ setPhoneError('Número de telefone inválido');
34
+ return;
35
+ }
36
+
37
+ setIsSubmitting(true);
38
+ try {
39
+ const result = await requestPhoneChangeAction(local, ddi);
40
+
41
+ if (!result.success) {
42
+ toast.custom((t) => (
43
+ <Toast
44
+ variant="error"
45
+ message={result.error ?? 'Número já existente ou ocorreu um erro. Tente novamente mais tarde.'}
46
+ toastId={t}
47
+ />
48
+ ));
49
+ return;
50
+ }
51
+
52
+ setSubmittedPhone({ ddi, local });
53
+ setShowVerification(true);
54
+ } finally {
55
+ setIsSubmitting(false);
56
+ }
57
+ }, [phoneValue]);
58
+
59
+ const handleBack = useCallback(() => {
60
+ setShowVerification(false);
61
+ }, []);
62
+
63
+ const resetForm = useCallback(() => {
64
+ setPhoneValue('');
65
+ setPhoneError('');
66
+ setSubmittedPhone({ ddi: '+55', local: '' });
67
+ setShowVerification(false);
68
+ }, []);
69
+
70
+ return {
71
+ showVerification,
72
+ phoneValue,
73
+ phoneError,
74
+ isSubmitting,
75
+ submittedPhone,
76
+ handlePhoneChange,
77
+ handleContinue,
78
+ handleBack,
79
+ resetForm,
80
+ };
81
+ }
@@ -1,101 +1,101 @@
1
- 'use client';
2
-
3
- import { useState, useCallback, useEffect } from 'react';
4
- import { useMutation } from '@tanstack/react-query';
5
- import { toast } from 'sonner';
6
- import { Toast } from '../../ui/feedback/Toast';
7
- import { copyToClipboard } from '../../../utils/browser/clipboard';
8
- import {
9
- generateTwoFactorAction,
10
- confirmTwoFactorAction,
11
- } from '../../../modules/accounts/actions/account-management.action';
12
- import { withAction } from '../../../utils/withAction';
13
-
14
- type Step = 'code' | 'recovery';
15
-
16
- interface UseTwoFactorAuthFormProps {
17
- onSuccess?: () => void;
18
- open?: boolean;
19
- }
20
-
21
- export default function useTwoFactorAuthForm({ onSuccess, open }: UseTwoFactorAuthFormProps = {}) {
22
- const [code, setCode] = useState('');
23
- const [step, setStep] = useState<Step>('code');
24
-
25
- const generateMutation = useMutation({
26
- mutationFn: withAction(generateTwoFactorAction),
27
- onError: () => {
28
- toast.custom((t) => (
29
- <Toast variant="error" message="Erro ao gerar QR Code. Tente novamente." toastId={t} />
30
- ));
31
- },
32
- });
33
-
34
- const confirmMutation = useMutation({
35
- mutationFn: withAction(confirmTwoFactorAction),
36
- onSuccess: () => {
37
- setStep('recovery');
38
- },
39
- onError: () => {
40
- toast.custom((t) => (
41
- <Toast variant="error" message="Erro ao confirmar código. Tente novamente." toastId={t} />
42
- ));
43
- },
44
- });
45
-
46
- const { mutate: triggerGenerate } = generateMutation;
47
-
48
- useEffect(() => {
49
- if (open) {
50
- triggerGenerate();
51
- }
52
- }, [open, triggerGenerate]);
53
-
54
- const generateFailed = generateMutation.isError;
55
-
56
- const isCodeComplete = code.length === 6;
57
-
58
- const handleSubmit = () => {
59
- if (!isCodeComplete) return;
60
- confirmMutation.mutate(code);
61
- };
62
-
63
- const handleFinalize = () => {
64
- onSuccess?.();
65
- setTimeout(resetForm, 300);
66
- };
67
-
68
- const handleCopyCodes = useCallback(async () => {
69
- const codes = generateMutation.data?.backupCodes ?? [];
70
- const success = await copyToClipboard(codes.join('\n'));
71
- if (success) {
72
- toast.custom((t) => (
73
- <Toast variant="success" message="Códigos copiados com sucesso" toastId={t} />
74
- ));
75
- }
76
- }, [generateMutation.data]);
77
-
78
- const resetForm = () => {
79
- setCode('');
80
- setStep('code');
81
- generateMutation.reset();
82
- confirmMutation.reset();
83
- };
84
-
85
- return {
86
- code,
87
- setCode,
88
- isCodeComplete,
89
- isGenerating: generateMutation.isPending,
90
- isConfirming: confirmMutation.isPending,
91
- generateFailed,
92
- retryGenerate: triggerGenerate,
93
- qrcode: generateMutation.data?.qrcode,
94
- backupCodes: generateMutation.data?.backupCodes ?? [],
95
- step,
96
- handleSubmit,
97
- handleFinalize,
98
- handleCopyCodes,
99
- resetForm,
100
- };
101
- }
1
+ 'use client';
2
+
3
+ import { useState, useCallback, useEffect } from 'react';
4
+ import { useMutation } from '@tanstack/react-query';
5
+ import { toast } from 'sonner';
6
+ import { Toast } from '../../ui/feedback/Toast';
7
+ import { copyToClipboard } from '../../../utils/browser/clipboard';
8
+ import {
9
+ generateTwoFactorAction,
10
+ confirmTwoFactorAction,
11
+ } from '../../../modules/accounts/actions/account-management.action';
12
+ import { withAction } from '../../../utils/withAction';
13
+
14
+ type Step = 'code' | 'recovery';
15
+
16
+ interface UseTwoFactorAuthFormProps {
17
+ onSuccess?: () => void;
18
+ open?: boolean;
19
+ }
20
+
21
+ export default function useTwoFactorAuthForm({ onSuccess, open }: UseTwoFactorAuthFormProps = {}) {
22
+ const [code, setCode] = useState('');
23
+ const [step, setStep] = useState<Step>('code');
24
+
25
+ const generateMutation = useMutation({
26
+ mutationFn: withAction(generateTwoFactorAction),
27
+ onError: () => {
28
+ toast.custom((t) => (
29
+ <Toast variant="error" message="Erro ao gerar QR Code. Tente novamente." toastId={t} />
30
+ ));
31
+ },
32
+ });
33
+
34
+ const confirmMutation = useMutation({
35
+ mutationFn: withAction(confirmTwoFactorAction),
36
+ onSuccess: () => {
37
+ setStep('recovery');
38
+ },
39
+ onError: () => {
40
+ toast.custom((t) => (
41
+ <Toast variant="error" message="Erro ao confirmar código. Tente novamente." toastId={t} />
42
+ ));
43
+ },
44
+ });
45
+
46
+ const { mutate: triggerGenerate } = generateMutation;
47
+
48
+ useEffect(() => {
49
+ if (open) {
50
+ triggerGenerate();
51
+ }
52
+ }, [open, triggerGenerate]);
53
+
54
+ const generateFailed = generateMutation.isError;
55
+
56
+ const isCodeComplete = code.length === 6;
57
+
58
+ const handleSubmit = () => {
59
+ if (!isCodeComplete) return;
60
+ confirmMutation.mutate(code);
61
+ };
62
+
63
+ const handleFinalize = () => {
64
+ onSuccess?.();
65
+ setTimeout(resetForm, 300);
66
+ };
67
+
68
+ const handleCopyCodes = useCallback(async () => {
69
+ const codes = generateMutation.data?.backupCodes ?? [];
70
+ const success = await copyToClipboard(codes.join('\n'));
71
+ if (success) {
72
+ toast.custom((t) => (
73
+ <Toast variant="success" message="Códigos copiados com sucesso" toastId={t} />
74
+ ));
75
+ }
76
+ }, [generateMutation.data]);
77
+
78
+ const resetForm = () => {
79
+ setCode('');
80
+ setStep('code');
81
+ generateMutation.reset();
82
+ confirmMutation.reset();
83
+ };
84
+
85
+ return {
86
+ code,
87
+ setCode,
88
+ isCodeComplete,
89
+ isGenerating: generateMutation.isPending,
90
+ isConfirming: confirmMutation.isPending,
91
+ generateFailed,
92
+ retryGenerate: triggerGenerate,
93
+ qrcode: generateMutation.data?.qrcode,
94
+ backupCodes: generateMutation.data?.backupCodes ?? [],
95
+ step,
96
+ handleSubmit,
97
+ handleFinalize,
98
+ handleCopyCodes,
99
+ resetForm,
100
+ };
101
+ }