@greatapps/common 1.1.127 → 1.1.129

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 (152) 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.map +1 -1
  8. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  9. package/dist/components/navigation/ProjectSelectorPopover.mjs +2 -10
  10. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  11. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  12. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  13. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  14. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  15. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  16. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  17. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  18. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  19. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  20. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  21. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  22. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  23. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  24. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  25. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  26. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  27. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  28. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  29. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  30. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  31. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  32. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  33. package/dist/components/ui/form/Input.mjs.map +1 -1
  34. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  35. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  36. package/dist/components/ui/form/Select.mjs +1 -1
  37. package/dist/components/ui/form/Select.mjs.map +1 -1
  38. package/dist/components/ui/form/Switch.mjs.map +1 -1
  39. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  40. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  41. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  42. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  43. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  44. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  45. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  46. package/dist/index.mjs.map +1 -1
  47. package/dist/infra/api/client.mjs +23 -11
  48. package/dist/infra/api/client.mjs.map +1 -1
  49. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  50. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  51. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  52. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  53. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  54. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  55. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  56. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  57. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  58. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  59. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  60. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  61. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  62. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  63. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  64. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  65. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  66. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  67. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  68. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  69. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  70. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  71. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  72. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  73. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  74. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  75. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  76. package/dist/utils/safeServerAction.mjs.map +1 -1
  77. package/dist/utils/withAction.mjs.map +1 -1
  78. package/package.json +84 -84
  79. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  80. package/src/components/account/DeleteAccountModal.tsx +130 -130
  81. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  82. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  83. package/src/components/layouts/AppMobileNavBar.tsx +125 -125
  84. package/src/components/layouts/AppNavBar.tsx +57 -57
  85. package/src/components/layouts/NavBar.tsx +139 -139
  86. package/src/components/navigation/NavItemsContext.ts +20 -20
  87. package/src/components/navigation/ProjectSelectorPopover.tsx +4 -7
  88. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  89. package/src/components/pages/notifications/Notifications.tsx +160 -160
  90. package/src/components/ui/buttons/Button.tsx +57 -57
  91. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  92. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  93. package/src/components/ui/data-display/Accordion.tsx +81 -81
  94. package/src/components/ui/data-display/Badge.tsx +47 -47
  95. package/src/components/ui/data-display/Card.tsx +93 -93
  96. package/src/components/ui/data-display/Pagination.tsx +126 -126
  97. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  98. package/src/components/ui/data-display/Separator.tsx +29 -29
  99. package/src/components/ui/data-display/Table.tsx +117 -117
  100. package/src/components/ui/data-display/Tabs.tsx +67 -67
  101. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  102. package/src/components/ui/feedback/DefaultCircularProgress.tsx +53 -53
  103. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  104. package/src/components/ui/feedback/Progress.tsx +40 -40
  105. package/src/components/ui/feedback/Toast.tsx +101 -101
  106. package/src/components/ui/form/Calendar.tsx +228 -228
  107. package/src/components/ui/form/Checkbox.tsx +31 -31
  108. package/src/components/ui/form/DatePicker.tsx +97 -97
  109. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  110. package/src/components/ui/form/Input.tsx +20 -20
  111. package/src/components/ui/form/InputOtp.tsx +80 -80
  112. package/src/components/ui/form/RadioGroup.tsx +45 -45
  113. package/src/components/ui/form/Select.tsx +200 -200
  114. package/src/components/ui/form/Switch.tsx +32 -32
  115. package/src/components/ui/form/Textarea.tsx +19 -19
  116. package/src/components/ui/overlay/Command.tsx +185 -185
  117. package/src/components/ui/overlay/Dialog.tsx +151 -151
  118. package/src/components/ui/overlay/Popover.tsx +49 -49
  119. package/src/components/ui/overlay/Sheet.tsx +159 -159
  120. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  121. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  122. package/src/index.ts +346 -346
  123. package/src/infra/api/client.ts +37 -12
  124. package/src/modules/accounts/actions/account-management.action.ts +90 -90
  125. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  126. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  127. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  128. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  129. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  130. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  131. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  132. package/src/modules/auth/hooks/login.hook.tsx +17 -17
  133. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  134. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  135. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  136. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  137. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  138. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  139. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  140. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  141. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  142. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  143. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  144. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
  145. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  146. package/src/modules/users/action/list-messages.action.ts +12 -12
  147. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  148. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  149. package/src/modules/users/hooks/messages.hook.ts +60 -60
  150. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  151. package/src/utils/safeServerAction.ts +21 -21
  152. package/src/utils/withAction.ts +13 -13
package/package.json CHANGED
@@ -1,84 +1,84 @@
1
- {
2
- "name": "@greatapps/common",
3
- "version": "1.1.127",
4
- "description": "Shared library for GreatApps frontend applications",
5
- "main": "./dist/index.mjs",
6
- "types": "./src/index.ts",
7
- "exports": {
8
- ".": {
9
- "import": "./dist/index.mjs",
10
- "types": "./src/index.ts"
11
- },
12
- "./server": {
13
- "import": "./dist/server.mjs",
14
- "types": "./src/server.ts"
15
- }
16
- },
17
- "files": [
18
- "dist",
19
- "src"
20
- ],
21
- "scripts": {
22
- "build": "tsup",
23
- "dev": "tsup --watch",
24
- "typecheck": "tsc --noEmit"
25
- },
26
- "keywords": [],
27
- "author": "",
28
- "license": "ISC",
29
- "dependencies": {
30
- "@greatapps/cache": "^2.0.1",
31
- "@radix-ui/react-accordion": "^1.2.12",
32
- "@radix-ui/react-checkbox": "^1.3.3",
33
- "@radix-ui/react-popover": "^1.1.15",
34
- "@radix-ui/react-progress": "^1.1.8",
35
- "@radix-ui/react-radio-group": "^1.3.8",
36
- "@radix-ui/react-scroll-area": "^1.2.10",
37
- "@radix-ui/react-select": "^2.2.6",
38
- "@radix-ui/react-separator": "^1.1.8",
39
- "@radix-ui/react-switch": "^1.2.6",
40
- "@radix-ui/react-tabs": "^1.1.13",
41
- "@radix-ui/react-tooltip": "^1.2.8",
42
- "@tanstack/query-broadcast-client-experimental": "^5.95.2",
43
- "@tanstack/react-query-persist-client": "^5.95.2",
44
- "axios": "^1.13.6",
45
- "class-variance-authority": "^0.7.1",
46
- "clsx": "^2.1.1",
47
- "cmdk": "^1.1.1",
48
- "date-fns": "^4.1.0",
49
- "idb-keyval": "^6.2.2",
50
- "input-otp": "^1.4.2",
51
- "lucide-react": "^0.575.0",
52
- "react-day-picker": "^9.14.0",
53
- "server-only": "^0.0.1",
54
- "sonner": ">=2.0.0",
55
- "tailwind-merge": "^3.5.0",
56
- "zod": "^4.3.6"
57
- },
58
- "devDependencies": {
59
- "@hookform/resolvers": "^5.2.2",
60
- "@tanstack/react-query": "^5.95.2",
61
- "@tanstack/react-query-devtools": "^5.95.2",
62
- "@types/node": "^25.5.0",
63
- "@types/react": "^19.2.14",
64
- "@types/react-dom": "^19.2.3",
65
- "glob": "^13.0.6",
66
- "next": "16.2.1",
67
- "react": "19.1.4",
68
- "react-dom": "19.1.4",
69
- "react-hook-form": "^7.72.0",
70
- "tsup": "^8.5.1",
71
- "typescript": "^5.9.3",
72
- "zustand": "^5.0.12"
73
- },
74
- "peerDependencies": {
75
- "@hookform/resolvers": ">=3.0.0",
76
- "@tanstack/react-query": ">=5.0.0",
77
- "next": ">=16.0.0",
78
- "react": ">=19.0.0",
79
- "react-dom": ">=19.0.0",
80
- "react-hook-form": ">=7.0.0",
81
- "sonner": ">=2.0.0",
82
- "zustand": ">=4.0.0"
83
- }
84
- }
1
+ {
2
+ "name": "@greatapps/common",
3
+ "version": "1.1.129",
4
+ "description": "Shared library for GreatApps frontend applications",
5
+ "main": "./dist/index.mjs",
6
+ "types": "./src/index.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.mjs",
10
+ "types": "./src/index.ts"
11
+ },
12
+ "./server": {
13
+ "import": "./dist/server.mjs",
14
+ "types": "./src/server.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsup",
23
+ "dev": "tsup --watch",
24
+ "typecheck": "tsc --noEmit"
25
+ },
26
+ "keywords": [],
27
+ "author": "",
28
+ "license": "ISC",
29
+ "dependencies": {
30
+ "@greatapps/cache": "^2.0.1",
31
+ "@radix-ui/react-accordion": "^1.2.12",
32
+ "@radix-ui/react-checkbox": "^1.3.3",
33
+ "@radix-ui/react-popover": "^1.1.15",
34
+ "@radix-ui/react-progress": "^1.1.8",
35
+ "@radix-ui/react-radio-group": "^1.3.8",
36
+ "@radix-ui/react-scroll-area": "^1.2.10",
37
+ "@radix-ui/react-select": "^2.2.6",
38
+ "@radix-ui/react-separator": "^1.1.8",
39
+ "@radix-ui/react-switch": "^1.2.6",
40
+ "@radix-ui/react-tabs": "^1.1.13",
41
+ "@radix-ui/react-tooltip": "^1.2.8",
42
+ "@tanstack/query-broadcast-client-experimental": "^5.95.2",
43
+ "@tanstack/react-query-persist-client": "^5.95.2",
44
+ "axios": "^1.13.6",
45
+ "class-variance-authority": "^0.7.1",
46
+ "clsx": "^2.1.1",
47
+ "cmdk": "^1.1.1",
48
+ "date-fns": "^4.1.0",
49
+ "idb-keyval": "^6.2.2",
50
+ "input-otp": "^1.4.2",
51
+ "lucide-react": "^0.575.0",
52
+ "react-day-picker": "^9.14.0",
53
+ "server-only": "^0.0.1",
54
+ "sonner": ">=2.0.0",
55
+ "tailwind-merge": "^3.5.0",
56
+ "zod": "^4.3.6"
57
+ },
58
+ "devDependencies": {
59
+ "@hookform/resolvers": "^5.2.2",
60
+ "@tanstack/react-query": "^5.95.2",
61
+ "@tanstack/react-query-devtools": "^5.95.2",
62
+ "@types/node": "^25.5.0",
63
+ "@types/react": "^19.2.14",
64
+ "@types/react-dom": "^19.2.3",
65
+ "glob": "^13.0.6",
66
+ "next": "16.2.1",
67
+ "react": "19.1.4",
68
+ "react-dom": "19.1.4",
69
+ "react-hook-form": "^7.72.0",
70
+ "tsup": "^8.5.1",
71
+ "typescript": "^5.9.3",
72
+ "zustand": "^5.0.12"
73
+ },
74
+ "peerDependencies": {
75
+ "@hookform/resolvers": ">=3.0.0",
76
+ "@tanstack/react-query": ">=5.0.0",
77
+ "next": ">=16.0.0",
78
+ "react": ">=19.0.0",
79
+ "react-dom": ">=19.0.0",
80
+ "react-hook-form": ">=7.0.0",
81
+ "sonner": ">=2.0.0",
82
+ "zustand": ">=4.0.0"
83
+ }
84
+ }
@@ -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
+ }