@greatapps/common 1.1.167 → 1.1.169

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 (167) 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/useTwoFactorAuthForm.mjs.map +1 -1
  5. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  6. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  7. package/dist/components/layouts/NavBar.mjs +29 -1
  8. package/dist/components/layouts/NavBar.mjs.map +1 -1
  9. package/dist/components/layouts/UsersSelectorPopover.mjs +9 -12
  10. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  11. package/dist/components/navigation/AppNavigation.mjs +1 -1
  12. package/dist/components/navigation/AppNavigation.mjs.map +1 -1
  13. package/dist/components/navigation/CancelledSubscriptionBanner.mjs +59 -0
  14. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -0
  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.map +1 -1
  18. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  19. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  20. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  21. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  22. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  23. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  24. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  25. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  26. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  27. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  28. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  29. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  30. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  31. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  32. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  33. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  34. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  35. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  36. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  37. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  38. package/dist/components/ui/form/Input.mjs.map +1 -1
  39. package/dist/components/ui/form/InputOtp.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 +28 -24
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/middleware.mjs.map +1 -1
  54. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  55. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  56. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  57. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  58. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  59. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  60. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  61. package/dist/modules/accounts/hooks/useTimezones.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/auth/services/auth.service.mjs +1 -1
  66. package/dist/modules/auth/services/auth.service.mjs.map +1 -1
  67. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  68. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  69. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  70. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  71. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  72. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  73. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  74. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  75. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  76. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  77. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  78. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  79. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  80. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  81. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  82. package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
  83. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  84. package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
  85. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  86. package/dist/utils/safeServerAction.mjs.map +1 -1
  87. package/dist/utils/withAction.mjs.map +1 -1
  88. package/package.json +90 -90
  89. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  90. package/src/components/account/DeleteAccountModal.tsx +130 -130
  91. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  92. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  93. package/src/components/layouts/AppMobileNavBar.tsx +125 -125
  94. package/src/components/layouts/AppNavBar.tsx +57 -57
  95. package/src/components/layouts/NavBar.tsx +139 -139
  96. package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
  97. package/src/components/navigation/NavItemsContext.ts +20 -20
  98. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  99. package/src/components/pages/notifications/Notifications.tsx +160 -160
  100. package/src/components/ui/buttons/Button.tsx +57 -57
  101. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  102. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  103. package/src/components/ui/data-display/Accordion.tsx +81 -81
  104. package/src/components/ui/data-display/Badge.tsx +47 -47
  105. package/src/components/ui/data-display/Card.tsx +93 -93
  106. package/src/components/ui/data-display/Pagination.tsx +126 -126
  107. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  108. package/src/components/ui/data-display/Separator.tsx +29 -29
  109. package/src/components/ui/data-display/Table.tsx +117 -117
  110. package/src/components/ui/data-display/Tabs.tsx +67 -67
  111. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  112. package/src/components/ui/feedback/DefaultCircularProgress.tsx +53 -53
  113. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  114. package/src/components/ui/feedback/Progress.tsx +40 -40
  115. package/src/components/ui/feedback/Toast.tsx +101 -101
  116. package/src/components/ui/form/Calendar.tsx +228 -228
  117. package/src/components/ui/form/Checkbox.tsx +31 -31
  118. package/src/components/ui/form/DatePicker.tsx +97 -97
  119. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  120. package/src/components/ui/form/Input.tsx +20 -20
  121. package/src/components/ui/form/InputOtp.tsx +80 -80
  122. package/src/components/ui/form/RadioGroup.tsx +45 -45
  123. package/src/components/ui/form/Select.tsx +200 -200
  124. package/src/components/ui/form/Switch.tsx +32 -32
  125. package/src/components/ui/form/Textarea.tsx +19 -19
  126. package/src/components/ui/overlay/Command.tsx +185 -185
  127. package/src/components/ui/overlay/Dialog.tsx +151 -151
  128. package/src/components/ui/overlay/Popover.tsx +49 -49
  129. package/src/components/ui/overlay/Sheet.tsx +159 -159
  130. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  131. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  132. package/src/index.ts +351 -348
  133. package/src/middleware.ts +4 -4
  134. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  135. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  136. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  137. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  138. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  139. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  140. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  141. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  142. package/src/modules/accounts/types.ts +214 -214
  143. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  144. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  145. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  146. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  147. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  148. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  149. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  150. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  151. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  152. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  153. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  154. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  155. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  156. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  157. package/src/modules/users/action/list-messages.action.ts +12 -12
  158. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  159. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  160. package/src/modules/users/hooks/messages.hook.ts +60 -60
  161. package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
  162. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  163. package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
  164. package/src/modules/whitelabel/styles-schema.ts +37 -37
  165. package/src/providers/whitelabel.provider.tsx +46 -46
  166. package/src/utils/safeServerAction.ts +21 -21
  167. package/src/utils/withAction.ts +13 -13
@@ -1,55 +1,55 @@
1
- 'use client';
2
-
3
- import { TriangleAlert } from 'lucide-react';
4
- import { toast } from 'sonner';
5
- import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/overlay/Dialog';
6
- import { Button } from '../ui/buttons/Button';
7
- import { Toast } from '../ui/feedback/Toast';
8
- import { useAccountModals } from '../../store/useAccountModals';
9
-
10
- export default function ConfirmDeleteAccountModal() {
11
- const { activeModal, pagesCount, close } = useAccountModals();
12
- const open = activeModal === 'confirmDelete';
13
-
14
- const handleConfirm = () => {
15
- toast.custom((t) => (
16
- <Toast variant="success" message="Conta excluída com sucesso" toastId={t} />
17
- ));
18
- close();
19
- };
20
-
21
- return (
22
- <Dialog open={open} onOpenChange={close}>
23
- <DialogContent className="flex flex-col p-0 gap-0 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%]!">
24
- <div className="flex flex-col gap-5 p-4 lg:p-5">
25
- <DialogHeader className="p-0">
26
- <DialogTitle className="paragraph-medium-semibold text-gray-950">
27
- Uma pena te ver ir!
28
- </DialogTitle>
29
- </DialogHeader>
30
-
31
- <div className="bg-red-50 p-4 lg:p-5 rounded-lg flex items-center gap-4">
32
- <TriangleAlert size={20} className="text-red-500 shrink-0" strokeWidth={2} />
33
- <p className="paragraph-small-regular text-gray-600">
34
- Todas suas{' '}
35
- <span className="font-semibold text-gray-950">{pagesCount} páginas</span>{' '}
36
- serão deletadas permanentemente. Essa ação é{' '}
37
- <span className="font-semibold text-gray-950">irreversível!</span>
38
- </p>
39
- </div>
40
- </div>
41
-
42
- <div className="h-px bg-gray-200" />
43
-
44
- <div className="flex items-center gap-2 p-4 lg:p-5">
45
- <Button className="h-10 flex-1" onClick={close}>
46
- Manter minha conta
47
- </Button>
48
- <Button variant="secondary" className="h-10! flex-1" onClick={handleConfirm}>
49
- Excluir mesmo assim
50
- </Button>
51
- </div>
52
- </DialogContent>
53
- </Dialog>
54
- );
55
- }
1
+ 'use client';
2
+
3
+ import { TriangleAlert } from 'lucide-react';
4
+ import { toast } from 'sonner';
5
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/overlay/Dialog';
6
+ import { Button } from '../ui/buttons/Button';
7
+ import { Toast } from '../ui/feedback/Toast';
8
+ import { useAccountModals } from '../../store/useAccountModals';
9
+
10
+ export default function ConfirmDeleteAccountModal() {
11
+ const { activeModal, pagesCount, close } = useAccountModals();
12
+ const open = activeModal === 'confirmDelete';
13
+
14
+ const handleConfirm = () => {
15
+ toast.custom((t) => (
16
+ <Toast variant="success" message="Conta excluída com sucesso" toastId={t} />
17
+ ));
18
+ close();
19
+ };
20
+
21
+ return (
22
+ <Dialog open={open} onOpenChange={close}>
23
+ <DialogContent className="flex flex-col p-0 gap-0 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%]!">
24
+ <div className="flex flex-col gap-5 p-4 lg:p-5">
25
+ <DialogHeader className="p-0">
26
+ <DialogTitle className="paragraph-medium-semibold text-gray-950">
27
+ Uma pena te ver ir!
28
+ </DialogTitle>
29
+ </DialogHeader>
30
+
31
+ <div className="bg-red-50 p-4 lg:p-5 rounded-lg flex items-center gap-4">
32
+ <TriangleAlert size={20} className="text-red-500 shrink-0" strokeWidth={2} />
33
+ <p className="paragraph-small-regular text-gray-600">
34
+ Todas suas{' '}
35
+ <span className="font-semibold text-gray-950">{pagesCount} páginas</span>{' '}
36
+ serão deletadas permanentemente. Essa ação é{' '}
37
+ <span className="font-semibold text-gray-950">irreversível!</span>
38
+ </p>
39
+ </div>
40
+ </div>
41
+
42
+ <div className="h-px bg-gray-200" />
43
+
44
+ <div className="flex items-center gap-2 p-4 lg:p-5">
45
+ <Button className="h-10 flex-1" onClick={close}>
46
+ Manter minha conta
47
+ </Button>
48
+ <Button variant="secondary" className="h-10! flex-1" onClick={handleConfirm}>
49
+ Excluir mesmo assim
50
+ </Button>
51
+ </div>
52
+ </DialogContent>
53
+ </Dialog>
54
+ );
55
+ }
@@ -1,130 +1,130 @@
1
- 'use client';
2
-
3
- import { useState, useCallback } from 'react';
4
- import { Lock, TriangleAlert } from 'lucide-react';
5
- import { toast } from 'sonner';
6
- import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/overlay/Dialog';
7
- import { Button } from '../ui/buttons/Button';
8
- import { FormField } from '../ui/form/FormField';
9
- import { SelectField } from '../ui/form/SelectField';
10
- import { TextAreaField } from '../ui/form/TextAreaField';
11
- import { Toast } from '../ui/feedback/Toast';
12
- import usePasswordVisibility from '../../hooks/usePasswordVisibility';
13
- import { useAccountModals } from '../../store/useAccountModals';
14
- import { AccountSectionType } from '../../enums/AccountSectionType';
15
-
16
- const REASON_OPTIONS = [
17
- { value: 'sem-funcao', label: 'A ferramenta não possui uma função que eu preciso' },
18
- { value: 'problemas', label: 'Encontrei problemas técnicos ou erros no sistema' },
19
- { value: 'suporte', label: 'Tive problemas com o suporte ou atendimento' },
20
- { value: 'demora', label: 'As atualizações demoram mais do que o esperado' },
21
- { value: 'temporario', label: 'O cancelamento é temporário' },
22
- { value: 'outro', label: 'Outro motivo' },
23
- ];
24
-
25
- export default function DeleteAccountModal() {
26
- const { activeModal, pagesCount, openConfigurations, openConfirmDelete, close } = useAccountModals();
27
- const open = activeModal === 'deleteAccount';
28
-
29
- const [reason, setReason] = useState('');
30
- const [description, setDescription] = useState('');
31
- const [password, setPassword] = useState('');
32
- const { showPassword, togglePassword } = usePasswordVisibility();
33
-
34
- const isFormValid = Boolean(reason && description && password);
35
-
36
- const resetForm = useCallback(() => {
37
- setReason('');
38
- setDescription('');
39
- setPassword('');
40
- }, []);
41
-
42
- const handleClose = () => {
43
- resetForm();
44
- openConfigurations(AccountSectionType.SECURITY);
45
- };
46
-
47
- const handleDelete = (e: React.FormEvent) => {
48
- e.preventDefault();
49
- if (!isFormValid) {
50
- toast.custom((t) => (
51
- <Toast variant="error" message="Preencha todos os campos obrigatórios" toastId={t} />
52
- ));
53
- return;
54
- }
55
- resetForm();
56
- openConfirmDelete(pagesCount);
57
- };
58
-
59
- return (
60
- <Dialog open={open} onOpenChange={handleClose}>
61
- <DialogContent className="flex flex-col p-0 gap-0 max-w-full! border-0 rounded-t-2xl rounded-b-none h-[100dvh] top-0! bottom-0! left-0! right-0! translate-x-0! translate-y-0! lg:max-w-lg! lg:h-auto! lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%]! lg:left-[50%]! lg:right-auto! lg:bottom-auto! lg:translate-x-[-50%]! lg:translate-y-[-50%]! overflow-y-auto">
62
- <form onSubmit={handleDelete} className="flex flex-col flex-1 lg:flex-none">
63
- <div className="flex flex-col gap-6 p-4 lg:p-6 flex-1 lg:flex-none">
64
- <DialogHeader className="p-0">
65
- <div className="flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5 mb-5">
66
- <TriangleAlert size={20} className="text-red-500" />
67
- </div>
68
- <DialogTitle>Excluir conta</DialogTitle>
69
- <DialogDescription className="paragraph-small-regular">
70
- Esta ação é <span className="font-semibold text-gray-950">irreversível</span>. Ao
71
- confirmar, sua conta e todos os seus dados serão excluídos.
72
- </DialogDescription>
73
- </DialogHeader>
74
-
75
- <SelectField
76
- label="Motivo do cancelamento"
77
- required
78
- placeholder="Selecione"
79
- options={REASON_OPTIONS}
80
- value={reason}
81
- onChange={(value) => setReason(value as string)}
82
- className="h-10!"
83
- />
84
-
85
- <div>
86
- <TextAreaField
87
- label="Descreva o que levou a tomar essa decisão"
88
- required
89
- placeholder="Explique sua decisão..."
90
- value={description}
91
- onChange={(e) => setDescription(e.target.value)}
92
- rows={4}
93
- maxLength={400}
94
- />
95
- <span className="paragraph-xsmall-medium text-gray-600 text-left mt-1 block">
96
- {description.length}/400 caracteres
97
- </span>
98
- </div>
99
-
100
- <FormField
101
- className="text-gray-600"
102
- label="Senha"
103
- type="password"
104
- placeholder="Informe sua senha"
105
- leftIcon={Lock}
106
- value={password}
107
- onChange={(e) => setPassword(e.target.value)}
108
- classnameContainer="h-10!"
109
- showPassword={showPassword}
110
- onTogglePassword={togglePassword}
111
- />
112
- </div>
113
-
114
- <div className="flex flex-row items-center gap-2 p-4 lg:p-6 border-t border-gray-200 bg-white mt-auto lg:mt-0">
115
- <Button
116
- variant="default"
117
- className="h-10 flex-1 bg-gray-950 text-white hover:bg-gray-800"
118
- type="submit"
119
- >
120
- Excluir conta
121
- </Button>
122
- <Button variant="secondary" className="h-10 flex-1" type="button" onClick={handleClose}>
123
- Fechar
124
- </Button>
125
- </div>
126
- </form>
127
- </DialogContent>
128
- </Dialog>
129
- );
130
- }
1
+ 'use client';
2
+
3
+ import { useState, useCallback } from 'react';
4
+ import { Lock, TriangleAlert } from 'lucide-react';
5
+ import { toast } from 'sonner';
6
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../ui/overlay/Dialog';
7
+ import { Button } from '../ui/buttons/Button';
8
+ import { FormField } from '../ui/form/FormField';
9
+ import { SelectField } from '../ui/form/SelectField';
10
+ import { TextAreaField } from '../ui/form/TextAreaField';
11
+ import { Toast } from '../ui/feedback/Toast';
12
+ import usePasswordVisibility from '../../hooks/usePasswordVisibility';
13
+ import { useAccountModals } from '../../store/useAccountModals';
14
+ import { AccountSectionType } from '../../enums/AccountSectionType';
15
+
16
+ const REASON_OPTIONS = [
17
+ { value: 'sem-funcao', label: 'A ferramenta não possui uma função que eu preciso' },
18
+ { value: 'problemas', label: 'Encontrei problemas técnicos ou erros no sistema' },
19
+ { value: 'suporte', label: 'Tive problemas com o suporte ou atendimento' },
20
+ { value: 'demora', label: 'As atualizações demoram mais do que o esperado' },
21
+ { value: 'temporario', label: 'O cancelamento é temporário' },
22
+ { value: 'outro', label: 'Outro motivo' },
23
+ ];
24
+
25
+ export default function DeleteAccountModal() {
26
+ const { activeModal, pagesCount, openConfigurations, openConfirmDelete, close } = useAccountModals();
27
+ const open = activeModal === 'deleteAccount';
28
+
29
+ const [reason, setReason] = useState('');
30
+ const [description, setDescription] = useState('');
31
+ const [password, setPassword] = useState('');
32
+ const { showPassword, togglePassword } = usePasswordVisibility();
33
+
34
+ const isFormValid = Boolean(reason && description && password);
35
+
36
+ const resetForm = useCallback(() => {
37
+ setReason('');
38
+ setDescription('');
39
+ setPassword('');
40
+ }, []);
41
+
42
+ const handleClose = () => {
43
+ resetForm();
44
+ openConfigurations(AccountSectionType.SECURITY);
45
+ };
46
+
47
+ const handleDelete = (e: React.FormEvent) => {
48
+ e.preventDefault();
49
+ if (!isFormValid) {
50
+ toast.custom((t) => (
51
+ <Toast variant="error" message="Preencha todos os campos obrigatórios" toastId={t} />
52
+ ));
53
+ return;
54
+ }
55
+ resetForm();
56
+ openConfirmDelete(pagesCount);
57
+ };
58
+
59
+ return (
60
+ <Dialog open={open} onOpenChange={handleClose}>
61
+ <DialogContent className="flex flex-col p-0 gap-0 max-w-full! border-0 rounded-t-2xl rounded-b-none h-[100dvh] top-0! bottom-0! left-0! right-0! translate-x-0! translate-y-0! lg:max-w-lg! lg:h-auto! lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%]! lg:left-[50%]! lg:right-auto! lg:bottom-auto! lg:translate-x-[-50%]! lg:translate-y-[-50%]! overflow-y-auto">
62
+ <form onSubmit={handleDelete} className="flex flex-col flex-1 lg:flex-none">
63
+ <div className="flex flex-col gap-6 p-4 lg:p-6 flex-1 lg:flex-none">
64
+ <DialogHeader className="p-0">
65
+ <div className="flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5 mb-5">
66
+ <TriangleAlert size={20} className="text-red-500" />
67
+ </div>
68
+ <DialogTitle>Excluir conta</DialogTitle>
69
+ <DialogDescription className="paragraph-small-regular">
70
+ Esta ação é <span className="font-semibold text-gray-950">irreversível</span>. Ao
71
+ confirmar, sua conta e todos os seus dados serão excluídos.
72
+ </DialogDescription>
73
+ </DialogHeader>
74
+
75
+ <SelectField
76
+ label="Motivo do cancelamento"
77
+ required
78
+ placeholder="Selecione"
79
+ options={REASON_OPTIONS}
80
+ value={reason}
81
+ onChange={(value) => setReason(value as string)}
82
+ className="h-10!"
83
+ />
84
+
85
+ <div>
86
+ <TextAreaField
87
+ label="Descreva o que levou a tomar essa decisão"
88
+ required
89
+ placeholder="Explique sua decisão..."
90
+ value={description}
91
+ onChange={(e) => setDescription(e.target.value)}
92
+ rows={4}
93
+ maxLength={400}
94
+ />
95
+ <span className="paragraph-xsmall-medium text-gray-600 text-left mt-1 block">
96
+ {description.length}/400 caracteres
97
+ </span>
98
+ </div>
99
+
100
+ <FormField
101
+ className="text-gray-600"
102
+ label="Senha"
103
+ type="password"
104
+ placeholder="Informe sua senha"
105
+ leftIcon={Lock}
106
+ value={password}
107
+ onChange={(e) => setPassword(e.target.value)}
108
+ classnameContainer="h-10!"
109
+ showPassword={showPassword}
110
+ onTogglePassword={togglePassword}
111
+ />
112
+ </div>
113
+
114
+ <div className="flex flex-row items-center gap-2 p-4 lg:p-6 border-t border-gray-200 bg-white mt-auto lg:mt-0">
115
+ <Button
116
+ variant="default"
117
+ className="h-10 flex-1 bg-gray-950 text-white hover:bg-gray-800"
118
+ type="submit"
119
+ >
120
+ Excluir conta
121
+ </Button>
122
+ <Button variant="secondary" className="h-10 flex-1" type="button" onClick={handleClose}>
123
+ Fechar
124
+ </Button>
125
+ </div>
126
+ </form>
127
+ </DialogContent>
128
+ </Dialog>
129
+ );
130
+ }
@@ -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
+ }