@greatapps/common 1.1.217 → 1.1.219
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.
- package/dist/components/account/ConfigurationsMyAccountModal.mjs +5 -5
- package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmDeleteAccountModal.mjs +2 -2
- package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmGlobalPreferencesModal.mjs +2 -2
- package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
- package/dist/components/account/DeleteAccountModal.mjs +3 -3
- package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/DisableTwoFactorAuthModal.mjs +2 -2
- package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs +2 -2
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/TwoFactorAuthModal.mjs +6 -6
- package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
- package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
- package/dist/components/account/sections/ChangeEmailModal.mjs +6 -6
- package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
- package/dist/components/account/sections/ChangePasswordSection.mjs +4 -4
- package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs +5 -5
- package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
- package/dist/components/account/sections/MyProfileSection.mjs +3 -3
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/account/sections/PreferencesSection.mjs +6 -6
- package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
- package/dist/components/account/sections/SecuritySection.mjs +3 -3
- package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
- package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
- package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
- package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
- package/dist/components/layouts/AppNavBar.mjs.map +1 -1
- package/dist/components/layouts/MdSideBarNavigation.mjs +2 -2
- package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
- package/dist/components/layouts/NavBar.mjs +2 -2
- package/dist/components/layouts/NavBar.mjs.map +1 -1
- package/dist/components/layouts/NotificationsPopover.mjs +4 -4
- package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
- package/dist/components/layouts/ProfilePopover.mjs +2 -2
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs +5 -5
- package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
- package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
- package/dist/components/navigation/ProjectSelectorPopover.mjs +6 -6
- package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
- package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs +5 -5
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
- package/dist/components/pages/notifications/Notifications.mjs +5 -5
- package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
- package/dist/components/ui/buttons/Button.mjs.map +1 -1
- package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
- package/dist/components/ui/buttons/CopyButton.mjs +2 -2
- package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
- package/dist/components/ui/data-display/Accordion.mjs +2 -2
- package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
- package/dist/components/ui/data-display/Badge.mjs.map +1 -1
- package/dist/components/ui/data-display/Card.mjs.map +1 -1
- package/dist/components/ui/data-display/Pagination.mjs +7 -7
- package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
- package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
- package/dist/components/ui/data-display/Separator.mjs.map +1 -1
- package/dist/components/ui/data-display/Table.mjs.map +1 -1
- package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
- package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
- package/dist/components/ui/feedback/Progress.mjs.map +1 -1
- package/dist/components/ui/feedback/Toast.mjs +7 -7
- package/dist/components/ui/feedback/Toast.mjs.map +1 -1
- package/dist/components/ui/form/Calendar.mjs +7 -7
- package/dist/components/ui/form/Calendar.mjs.map +1 -1
- package/dist/components/ui/form/Checkbox.mjs +2 -2
- package/dist/components/ui/form/Checkbox.mjs.map +1 -1
- package/dist/components/ui/form/ComboboxField.mjs +4 -4
- package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
- package/dist/components/ui/form/DatePicker.mjs.map +1 -1
- package/dist/components/ui/form/DateRangePicker.mjs +2 -2
- package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
- package/dist/components/ui/form/FormField.mjs +3 -3
- package/dist/components/ui/form/FormField.mjs.map +1 -1
- package/dist/components/ui/form/Input.mjs.map +1 -1
- package/dist/components/ui/form/InputOtp.mjs +2 -2
- package/dist/components/ui/form/InputOtp.mjs.map +1 -1
- package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
- package/dist/components/ui/form/RadioGroup.mjs +2 -2
- package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
- package/dist/components/ui/form/Select.mjs +6 -6
- package/dist/components/ui/form/Select.mjs.map +1 -1
- package/dist/components/ui/form/Switch.mjs.map +1 -1
- package/dist/components/ui/form/SwitchOptionFieldWithIcon.mjs.map +1 -1
- package/dist/components/ui/form/Textarea.mjs.map +1 -1
- package/dist/components/ui/overlay/Command.mjs +2 -2
- package/dist/components/ui/overlay/Command.mjs.map +1 -1
- package/dist/components/ui/overlay/Dialog.mjs +2 -2
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
- package/dist/components/ui/overlay/Popover.mjs.map +1 -1
- package/dist/components/ui/overlay/Sheet.mjs +2 -2
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
- package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
- package/dist/components/widgets/notifications/NotificationCard.mjs +2 -2
- package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
- package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middleware.mjs.map +1 -1
- package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
- package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
- package/dist/modules/accounts/services/account.service.mjs.map +1 -1
- package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
- package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
- package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
- package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
- package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
- package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
- package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
- package/dist/providers/whitelabel.provider.mjs.map +1 -1
- package/dist/utils/countries.mjs.map +1 -1
- package/dist/utils/safeServerAction.mjs.map +1 -1
- package/dist/utils/withAction.mjs.map +1 -1
- package/package.json +89 -90
- package/src/components/account/ConfigurationsMyAccountModal.tsx +5 -5
- package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
- package/src/components/account/ConfirmGlobalPreferencesModal.tsx +2 -2
- package/src/components/account/DeleteAccountModal.tsx +130 -130
- package/src/components/account/DisableTwoFactorAuthModal.tsx +2 -2
- package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
- package/src/components/account/TwoFactorAuthModal.tsx +6 -6
- package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
- package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
- package/src/components/account/sections/ChangeEmailModal.tsx +6 -6
- package/src/components/account/sections/ChangePasswordSection.tsx +4 -4
- package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
- package/src/components/account/sections/MyProfileSection.tsx +3 -3
- package/src/components/account/sections/PreferencesSection.tsx +6 -6
- package/src/components/account/sections/SecuritySection.tsx +3 -3
- package/src/components/embeds/CrispEmbed.tsx +101 -101
- package/src/components/embeds/FrillEmbed.tsx +119 -119
- package/src/components/layouts/AppMobileNavBar.tsx +111 -111
- package/src/components/layouts/AppNavBar.tsx +57 -57
- package/src/components/layouts/MdSideBarNavigation.tsx +4 -4
- package/src/components/layouts/NavBar.tsx +120 -120
- package/src/components/layouts/NotificationsPopover.tsx +4 -4
- package/src/components/layouts/ProfilePopover.tsx +2 -2
- package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
- package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
- package/src/components/navigation/NavItemsContext.ts +20 -20
- package/src/components/navigation/ProjectSelectorPopover.tsx +6 -6
- package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
- package/src/components/navigation/subcomponents/ProjectSelector.tsx +5 -5
- package/src/components/pages/notifications/Notifications.tsx +160 -160
- package/src/components/ui/buttons/Button.tsx +57 -57
- package/src/components/ui/buttons/CancelButton.tsx +14 -14
- package/src/components/ui/buttons/CopyButton.tsx +54 -54
- package/src/components/ui/data-display/Accordion.tsx +81 -81
- package/src/components/ui/data-display/Badge.tsx +47 -47
- package/src/components/ui/data-display/Card.tsx +93 -93
- package/src/components/ui/data-display/Pagination.tsx +126 -126
- package/src/components/ui/data-display/ScrollArea.tsx +59 -59
- package/src/components/ui/data-display/Separator.tsx +29 -29
- package/src/components/ui/data-display/Table.tsx +117 -117
- package/src/components/ui/data-display/Tabs.tsx +67 -67
- package/src/components/ui/feedback/CircularProgress.tsx +75 -75
- package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
- package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
- package/src/components/ui/feedback/Progress.tsx +40 -40
- package/src/components/ui/feedback/Toast.tsx +101 -101
- package/src/components/ui/form/Calendar.tsx +228 -228
- package/src/components/ui/form/Checkbox.tsx +31 -31
- package/src/components/ui/form/ComboboxField.tsx +4 -4
- package/src/components/ui/form/DatePicker.tsx +97 -97
- package/src/components/ui/form/DateRangePicker.tsx +108 -108
- package/src/components/ui/form/FormField.tsx +6 -5
- package/src/components/ui/form/Input.tsx +20 -20
- package/src/components/ui/form/InputOtp.tsx +80 -80
- package/src/components/ui/form/PhoneInput.tsx +205 -205
- package/src/components/ui/form/RadioGroup.tsx +45 -45
- package/src/components/ui/form/Select.tsx +200 -200
- package/src/components/ui/form/Switch.tsx +32 -32
- package/src/components/ui/form/SwitchOptionFieldWithIcon.tsx +2 -2
- package/src/components/ui/form/Textarea.tsx +19 -19
- package/src/components/ui/overlay/Command.tsx +185 -185
- package/src/components/ui/overlay/Dialog.tsx +151 -151
- package/src/components/ui/overlay/Popover.tsx +49 -49
- package/src/components/ui/overlay/Sheet.tsx +166 -166
- package/src/components/ui/overlay/Tooltip.tsx +62 -62
- package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
- package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
- package/src/index.ts +355 -355
- package/src/middleware.ts +4 -4
- package/src/modules/accounts/actions/account-management.action.ts +90 -90
- package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
- package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
- package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
- package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
- package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
- package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
- package/src/modules/accounts/hooks/useTimezones.ts +15 -15
- package/src/modules/accounts/services/account.service.ts +236 -236
- package/src/modules/accounts/types.ts +214 -214
- package/src/modules/auth/hooks/login.hook.tsx +13 -13
- package/src/modules/auth/hooks/logout.hook.tsx +11 -11
- package/src/modules/auth/hooks/register.hook.tsx +11 -11
- package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
- package/src/modules/projects/actions/add-project-user.action.ts +9 -9
- package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
- package/src/modules/projects/actions/list-available-users.action.ts +9 -9
- package/src/modules/projects/actions/list-project-users.action.ts +9 -9
- package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
- package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
- package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
- package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
- package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
- package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
- package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
- package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
- package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
- package/src/modules/users/action/find-user-by-id.action.ts +8 -8
- package/src/modules/users/action/list-messages.action.ts +12 -12
- package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
- package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
- package/src/modules/users/hooks/messages.hook.ts +60 -60
- package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
- package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
- package/src/modules/whitelabel/services/whitelabel-styles.service.ts +98 -98
- package/src/modules/whitelabel/styles-schema.ts +37 -37
- package/src/providers/whitelabel.provider.tsx +46 -46
- package/src/utils/countries.ts +224 -224
- package/src/utils/safeServerAction.ts +21 -21
- package/src/utils/withAction.ts +13 -13
|
@@ -1,231 +1,231 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import { Button } from '../../ui/buttons/Button';
|
|
5
|
-
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
|
|
6
|
-
import { Separator } from '../../ui/data-display/Separator';
|
|
7
|
-
import { InputOTP, InputOTPGroup, InputOTPSlot } from '../../ui/form/InputOtp';
|
|
8
|
-
import PhoneInput from '../../ui/form/PhoneInput';
|
|
9
|
-
import { formatTimer, formatPhone } from '../../../utils/format/masks';
|
|
10
|
-
import { OTP_CODE_LENGTH } from '../../../utils/validators/account';
|
|
11
|
-
import { useAuth } from '../../../providers/auth.provider';
|
|
12
|
-
import { useInvalidateUser } from '../../../modules/auth/hooks/useUserQuery';
|
|
13
|
-
import { confirmPhoneChangeAction } from '../../../modules/accounts/actions/account-management.action';
|
|
14
|
-
import useChangePhoneForm from '../hooks/useChangePhoneForm';
|
|
15
|
-
import useOtpVerification from '../hooks/useOtpVerification';
|
|
16
|
-
|
|
17
|
-
interface ChangePhoneModalProps {
|
|
18
|
-
open: boolean;
|
|
19
|
-
onClose: () => void;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
23
|
-
const { user } = useAuth();
|
|
24
|
-
const invalidateUser = useInvalidateUser();
|
|
25
|
-
|
|
26
|
-
const currentPhoneDisplay = user?.phone
|
|
27
|
-
? formatPhone(
|
|
28
|
-
user.ddi && user.phone.startsWith(user.ddi) ? user.phone.slice(user.ddi.length) : user.phone
|
|
29
|
-
)
|
|
30
|
-
: '';
|
|
31
|
-
|
|
32
|
-
const {
|
|
33
|
-
showVerification,
|
|
34
|
-
phoneValue,
|
|
35
|
-
phoneError,
|
|
36
|
-
isSubmitting,
|
|
37
|
-
submittedPhone,
|
|
38
|
-
handlePhoneChange,
|
|
39
|
-
handleContinue,
|
|
40
|
-
handleBack,
|
|
41
|
-
resetForm,
|
|
42
|
-
} = useChangePhoneForm();
|
|
43
|
-
|
|
44
|
-
const handleSuccess = () => {
|
|
45
|
-
invalidateUser();
|
|
46
|
-
resetForm();
|
|
47
|
-
onClose();
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const {
|
|
51
|
-
code,
|
|
52
|
-
isLoading,
|
|
53
|
-
hasError,
|
|
54
|
-
timer,
|
|
55
|
-
canResend,
|
|
56
|
-
isValidLength,
|
|
57
|
-
handleCodeChange,
|
|
58
|
-
handleValidate,
|
|
59
|
-
handleResend,
|
|
60
|
-
reset: resetOtp,
|
|
61
|
-
} = useOtpVerification({
|
|
62
|
-
onSuccess: handleSuccess,
|
|
63
|
-
successMessage: 'Telefone alterado',
|
|
64
|
-
validateFn: async (token) => {
|
|
65
|
-
const result = await confirmPhoneChangeAction(token, submittedPhone.local, submittedPhone.ddi);
|
|
66
|
-
return result.success;
|
|
67
|
-
},
|
|
68
|
-
resendFn: async () => {
|
|
69
|
-
const { requestPhoneChangeAction } = await import('../../../modules/accounts/actions/account-management.action');
|
|
70
|
-
const result = await requestPhoneChangeAction(submittedPhone.local, submittedPhone.ddi);
|
|
71
|
-
if (!result.success) {
|
|
72
|
-
throw new Error(result.error);
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
const handleClose = () => {
|
|
78
|
-
resetForm();
|
|
79
|
-
resetOtp();
|
|
80
|
-
onClose();
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const handleBackFromVerification = () => {
|
|
84
|
-
resetOtp();
|
|
85
|
-
handleBack();
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
<Dialog open={open} onOpenChange={handleClose}>
|
|
90
|
-
<DialogContent
|
|
91
|
-
showCloseButton={false}
|
|
92
|
-
overlayClassName="z-[1002]"
|
|
93
|
-
className="flex flex-col p-0 gap-0 max-w-full! border-0 rounded-t-2xl rounded-b-none h-dvh top-0! bottom-0! left-0! right-0! translate-x-0! translate-y-0! lg:max-w-125! lg:h-auto! 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%]! z-[1003]!"
|
|
94
|
-
>
|
|
95
|
-
{showVerification ? (
|
|
96
|
-
<DialogHeader className="flex flex-row items-center justify-between px-4 py-3 border-b border-gray-200 lg:border-b-0">
|
|
97
|
-
<Button variant="ghost" className="size-8! p-0" onClick={handleBackFromVerification}>
|
|
98
|
-
<
|
|
99
|
-
</Button>
|
|
100
|
-
<DialogTitle className="paragraph-medium-semibold text-gray-950 text-center flex-1">
|
|
101
|
-
Alterar telefone
|
|
102
|
-
</DialogTitle>
|
|
103
|
-
<Button variant="ghost" className="size-8! p-0" onClick={handleClose}>
|
|
104
|
-
<
|
|
105
|
-
</Button>
|
|
106
|
-
</DialogHeader>
|
|
107
|
-
) : (
|
|
108
|
-
<>
|
|
109
|
-
<DialogHeader className="sr-only">
|
|
110
|
-
<DialogTitle>Alterar telefone</DialogTitle>
|
|
111
|
-
</DialogHeader>
|
|
112
|
-
<div className="flex items-center justify-center px-4 py-3 relative border-b border-gray-200 lg:border-b-0">
|
|
113
|
-
<span className="paragraph-medium-semibold text-gray-950 text-center">
|
|
114
|
-
Alterar telefone
|
|
115
|
-
</span>
|
|
116
|
-
<Button
|
|
117
|
-
variant="ghost"
|
|
118
|
-
className="absolute right-2 size-8! p-0"
|
|
119
|
-
onClick={handleClose}
|
|
120
|
-
>
|
|
121
|
-
<
|
|
122
|
-
</Button>
|
|
123
|
-
</div>
|
|
124
|
-
</>
|
|
125
|
-
)}
|
|
126
|
-
|
|
127
|
-
<div className={`${showVerification ? 'w-full' : 'w-1/2'} h-0.75 bg-pages-300`} />
|
|
128
|
-
|
|
129
|
-
{showVerification ? (
|
|
130
|
-
<form
|
|
131
|
-
onSubmit={(e) => {
|
|
132
|
-
e.preventDefault();
|
|
133
|
-
handleValidate();
|
|
134
|
-
}}
|
|
135
|
-
className="flex flex-col flex-1 lg:flex-none"
|
|
136
|
-
>
|
|
137
|
-
<div className="px-4 lg:px-5 py-5 lg:py-6 flex flex-col gap-4 flex-1 lg:flex-none">
|
|
138
|
-
<div className="flex items-center justify-center size-12 bg-white rounded-lg shadow-xs border border-gray-200">
|
|
139
|
-
<
|
|
140
|
-
</div>
|
|
141
|
-
|
|
142
|
-
<div className="flex flex-col gap-1">
|
|
143
|
-
<h3 className="paragraph-medium-semibold text-gray-950">Código de validação</h3>
|
|
144
|
-
<p className="paragraph-small-regular text-gray-600">
|
|
145
|
-
Enviamos um código de validação para o número atual{' '}
|
|
146
|
-
<span className="font-semibold text-gray-950">{currentPhoneDisplay}.</span>
|
|
147
|
-
</p>
|
|
148
|
-
</div>
|
|
149
|
-
|
|
150
|
-
<div className="flex flex-col gap-2">
|
|
151
|
-
<InputOTP maxLength={OTP_CODE_LENGTH} value={code} onChange={handleCodeChange}>
|
|
152
|
-
<InputOTPGroup className="flex flex-row gap-2">
|
|
153
|
-
{[...Array(OTP_CODE_LENGTH)].map((_, i) => (
|
|
154
|
-
<InputOTPSlot
|
|
155
|
-
key={i}
|
|
156
|
-
index={i}
|
|
157
|
-
className={`uppercase text-2xl font-medium w-11 lg:w-12 h-13 lg:h-14 rounded-lg border bg-white shadow-none [&_div.animate-caret-blink]:bg-gray-950 ${hasError ? 'border-red-500' : 'border-gray-200'}`}
|
|
158
|
-
/>
|
|
159
|
-
))}
|
|
160
|
-
</InputOTPGroup>
|
|
161
|
-
</InputOTP>
|
|
162
|
-
{hasError && (
|
|
163
|
-
<p className="paragraph-small-regular text-red-500">Código incorreto</p>
|
|
164
|
-
)}
|
|
165
|
-
</div>
|
|
166
|
-
|
|
167
|
-
{canResend ? (
|
|
168
|
-
<button
|
|
169
|
-
type="button"
|
|
170
|
-
onClick={handleResend}
|
|
171
|
-
className="paragraph-small-medium text-gray-950 underline cursor-pointer hover:text-gray-700 w-fit"
|
|
172
|
-
>
|
|
173
|
-
Reenviar código
|
|
174
|
-
</button>
|
|
175
|
-
) : (
|
|
176
|
-
<p className="paragraph-small-regular text-gray-500">
|
|
177
|
-
Reenviar em{' '}
|
|
178
|
-
<span className="paragraph-small-semibold text-gray-950">
|
|
179
|
-
{formatTimer(timer)}
|
|
180
|
-
</span>
|
|
181
|
-
</p>
|
|
182
|
-
)}
|
|
183
|
-
</div>
|
|
184
|
-
|
|
185
|
-
<Separator />
|
|
186
|
-
|
|
187
|
-
<div className="flex items-center justify-between px-4 lg:px-5 py-4 lg:py-5 mt-auto lg:mt-0">
|
|
188
|
-
<Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
|
|
189
|
-
Cancelar
|
|
190
|
-
</Button>
|
|
191
|
-
<Button className="h-10!" type="submit" disabled={!isValidLength || isLoading}>
|
|
192
|
-
{isLoading ? 'Validando...' : 'Alterar telefone'}
|
|
193
|
-
</Button>
|
|
194
|
-
</div>
|
|
195
|
-
</form>
|
|
196
|
-
) : (
|
|
197
|
-
<form onSubmit={handleContinue} className="flex flex-col flex-1 lg:flex-none">
|
|
198
|
-
<div className="flex flex-col gap-5 lg:gap-6 px-4 lg:px-5 py-5 lg:py-6 flex-1 lg:flex-none">
|
|
199
|
-
<div className="flex flex-col gap-1">
|
|
200
|
-
<span className="paragraph-medium-semibold text-gray-950">
|
|
201
|
-
Atualizar telefone de contato
|
|
202
|
-
</span>
|
|
203
|
-
<span className="paragraph-small-regular text-gray-600">
|
|
204
|
-
Informe o novo número para manter seu contato atualizado.
|
|
205
|
-
</span>
|
|
206
|
-
</div>
|
|
207
|
-
|
|
208
|
-
<PhoneInput
|
|
209
|
-
label="Novo número"
|
|
210
|
-
placeholder="(00) 0 0000-0000"
|
|
211
|
-
value={phoneValue}
|
|
212
|
-
onChange={handlePhoneChange}
|
|
213
|
-
error={!!phoneError}
|
|
214
|
-
errorMessage={phoneError}
|
|
215
|
-
/>
|
|
216
|
-
</div>
|
|
217
|
-
|
|
218
|
-
<div className="flex items-center justify-between p-4 lg:p-5 border-t border-gray-200 mt-auto lg:mt-0">
|
|
219
|
-
<Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
|
|
220
|
-
Cancelar
|
|
221
|
-
</Button>
|
|
222
|
-
<Button className="h-10!" type="submit" disabled={isSubmitting}>
|
|
223
|
-
{isSubmitting ? 'Enviando...' : 'Continuar'}
|
|
224
|
-
</Button>
|
|
225
|
-
</div>
|
|
226
|
-
</form>
|
|
227
|
-
)}
|
|
228
|
-
</DialogContent>
|
|
229
|
-
</Dialog>
|
|
230
|
-
);
|
|
231
|
-
}
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { IconChevronLeft, IconX, IconMessage } from '@tabler/icons-react';
|
|
4
|
+
import { Button } from '../../ui/buttons/Button';
|
|
5
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
|
|
6
|
+
import { Separator } from '../../ui/data-display/Separator';
|
|
7
|
+
import { InputOTP, InputOTPGroup, InputOTPSlot } from '../../ui/form/InputOtp';
|
|
8
|
+
import PhoneInput from '../../ui/form/PhoneInput';
|
|
9
|
+
import { formatTimer, formatPhone } from '../../../utils/format/masks';
|
|
10
|
+
import { OTP_CODE_LENGTH } from '../../../utils/validators/account';
|
|
11
|
+
import { useAuth } from '../../../providers/auth.provider';
|
|
12
|
+
import { useInvalidateUser } from '../../../modules/auth/hooks/useUserQuery';
|
|
13
|
+
import { confirmPhoneChangeAction } from '../../../modules/accounts/actions/account-management.action';
|
|
14
|
+
import useChangePhoneForm from '../hooks/useChangePhoneForm';
|
|
15
|
+
import useOtpVerification from '../hooks/useOtpVerification';
|
|
16
|
+
|
|
17
|
+
interface ChangePhoneModalProps {
|
|
18
|
+
open: boolean;
|
|
19
|
+
onClose: () => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
|
|
23
|
+
const { user } = useAuth();
|
|
24
|
+
const invalidateUser = useInvalidateUser();
|
|
25
|
+
|
|
26
|
+
const currentPhoneDisplay = user?.phone
|
|
27
|
+
? formatPhone(
|
|
28
|
+
user.ddi && user.phone.startsWith(user.ddi) ? user.phone.slice(user.ddi.length) : user.phone
|
|
29
|
+
)
|
|
30
|
+
: '';
|
|
31
|
+
|
|
32
|
+
const {
|
|
33
|
+
showVerification,
|
|
34
|
+
phoneValue,
|
|
35
|
+
phoneError,
|
|
36
|
+
isSubmitting,
|
|
37
|
+
submittedPhone,
|
|
38
|
+
handlePhoneChange,
|
|
39
|
+
handleContinue,
|
|
40
|
+
handleBack,
|
|
41
|
+
resetForm,
|
|
42
|
+
} = useChangePhoneForm();
|
|
43
|
+
|
|
44
|
+
const handleSuccess = () => {
|
|
45
|
+
invalidateUser();
|
|
46
|
+
resetForm();
|
|
47
|
+
onClose();
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const {
|
|
51
|
+
code,
|
|
52
|
+
isLoading,
|
|
53
|
+
hasError,
|
|
54
|
+
timer,
|
|
55
|
+
canResend,
|
|
56
|
+
isValidLength,
|
|
57
|
+
handleCodeChange,
|
|
58
|
+
handleValidate,
|
|
59
|
+
handleResend,
|
|
60
|
+
reset: resetOtp,
|
|
61
|
+
} = useOtpVerification({
|
|
62
|
+
onSuccess: handleSuccess,
|
|
63
|
+
successMessage: 'Telefone alterado',
|
|
64
|
+
validateFn: async (token) => {
|
|
65
|
+
const result = await confirmPhoneChangeAction(token, submittedPhone.local, submittedPhone.ddi);
|
|
66
|
+
return result.success;
|
|
67
|
+
},
|
|
68
|
+
resendFn: async () => {
|
|
69
|
+
const { requestPhoneChangeAction } = await import('../../../modules/accounts/actions/account-management.action');
|
|
70
|
+
const result = await requestPhoneChangeAction(submittedPhone.local, submittedPhone.ddi);
|
|
71
|
+
if (!result.success) {
|
|
72
|
+
throw new Error(result.error);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const handleClose = () => {
|
|
78
|
+
resetForm();
|
|
79
|
+
resetOtp();
|
|
80
|
+
onClose();
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const handleBackFromVerification = () => {
|
|
84
|
+
resetOtp();
|
|
85
|
+
handleBack();
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<Dialog open={open} onOpenChange={handleClose}>
|
|
90
|
+
<DialogContent
|
|
91
|
+
showCloseButton={false}
|
|
92
|
+
overlayClassName="z-[1002]"
|
|
93
|
+
className="flex flex-col p-0 gap-0 max-w-full! border-0 rounded-t-2xl rounded-b-none h-dvh top-0! bottom-0! left-0! right-0! translate-x-0! translate-y-0! lg:max-w-125! lg:h-auto! 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%]! z-[1003]!"
|
|
94
|
+
>
|
|
95
|
+
{showVerification ? (
|
|
96
|
+
<DialogHeader className="flex flex-row items-center justify-between px-4 py-3 border-b border-gray-200 lg:border-b-0">
|
|
97
|
+
<Button variant="ghost" className="size-8! p-0" onClick={handleBackFromVerification}>
|
|
98
|
+
<IconChevronLeft size={20} className="text-gray-950" />
|
|
99
|
+
</Button>
|
|
100
|
+
<DialogTitle className="paragraph-medium-semibold text-gray-950 text-center flex-1">
|
|
101
|
+
Alterar telefone
|
|
102
|
+
</DialogTitle>
|
|
103
|
+
<Button variant="ghost" className="size-8! p-0" onClick={handleClose}>
|
|
104
|
+
<IconX size={18} className="text-gray-500" />
|
|
105
|
+
</Button>
|
|
106
|
+
</DialogHeader>
|
|
107
|
+
) : (
|
|
108
|
+
<>
|
|
109
|
+
<DialogHeader className="sr-only">
|
|
110
|
+
<DialogTitle>Alterar telefone</DialogTitle>
|
|
111
|
+
</DialogHeader>
|
|
112
|
+
<div className="flex items-center justify-center px-4 py-3 relative border-b border-gray-200 lg:border-b-0">
|
|
113
|
+
<span className="paragraph-medium-semibold text-gray-950 text-center">
|
|
114
|
+
Alterar telefone
|
|
115
|
+
</span>
|
|
116
|
+
<Button
|
|
117
|
+
variant="ghost"
|
|
118
|
+
className="absolute right-2 size-8! p-0"
|
|
119
|
+
onClick={handleClose}
|
|
120
|
+
>
|
|
121
|
+
<IconX size={18} className="text-gray-500" />
|
|
122
|
+
</Button>
|
|
123
|
+
</div>
|
|
124
|
+
</>
|
|
125
|
+
)}
|
|
126
|
+
|
|
127
|
+
<div className={`${showVerification ? 'w-full' : 'w-1/2'} h-0.75 bg-pages-300`} />
|
|
128
|
+
|
|
129
|
+
{showVerification ? (
|
|
130
|
+
<form
|
|
131
|
+
onSubmit={(e) => {
|
|
132
|
+
e.preventDefault();
|
|
133
|
+
handleValidate();
|
|
134
|
+
}}
|
|
135
|
+
className="flex flex-col flex-1 lg:flex-none"
|
|
136
|
+
>
|
|
137
|
+
<div className="px-4 lg:px-5 py-5 lg:py-6 flex flex-col gap-4 flex-1 lg:flex-none">
|
|
138
|
+
<div className="flex items-center justify-center size-12 bg-white rounded-lg shadow-xs border border-gray-200">
|
|
139
|
+
<IconMessage size={20} className="text-gray-950" />
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<div className="flex flex-col gap-1">
|
|
143
|
+
<h3 className="paragraph-medium-semibold text-gray-950">Código de validação</h3>
|
|
144
|
+
<p className="paragraph-small-regular text-gray-600">
|
|
145
|
+
Enviamos um código de validação para o número atual{' '}
|
|
146
|
+
<span className="font-semibold text-gray-950">{currentPhoneDisplay}.</span>
|
|
147
|
+
</p>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<div className="flex flex-col gap-2">
|
|
151
|
+
<InputOTP maxLength={OTP_CODE_LENGTH} value={code} onChange={handleCodeChange}>
|
|
152
|
+
<InputOTPGroup className="flex flex-row gap-2">
|
|
153
|
+
{[...Array(OTP_CODE_LENGTH)].map((_, i) => (
|
|
154
|
+
<InputOTPSlot
|
|
155
|
+
key={i}
|
|
156
|
+
index={i}
|
|
157
|
+
className={`uppercase text-2xl font-medium w-11 lg:w-12 h-13 lg:h-14 rounded-lg border bg-white shadow-none [&_div.animate-caret-blink]:bg-gray-950 ${hasError ? 'border-red-500' : 'border-gray-200'}`}
|
|
158
|
+
/>
|
|
159
|
+
))}
|
|
160
|
+
</InputOTPGroup>
|
|
161
|
+
</InputOTP>
|
|
162
|
+
{hasError && (
|
|
163
|
+
<p className="paragraph-small-regular text-red-500">Código incorreto</p>
|
|
164
|
+
)}
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
{canResend ? (
|
|
168
|
+
<button
|
|
169
|
+
type="button"
|
|
170
|
+
onClick={handleResend}
|
|
171
|
+
className="paragraph-small-medium text-gray-950 underline cursor-pointer hover:text-gray-700 w-fit"
|
|
172
|
+
>
|
|
173
|
+
Reenviar código
|
|
174
|
+
</button>
|
|
175
|
+
) : (
|
|
176
|
+
<p className="paragraph-small-regular text-gray-500">
|
|
177
|
+
Reenviar em{' '}
|
|
178
|
+
<span className="paragraph-small-semibold text-gray-950">
|
|
179
|
+
{formatTimer(timer)}
|
|
180
|
+
</span>
|
|
181
|
+
</p>
|
|
182
|
+
)}
|
|
183
|
+
</div>
|
|
184
|
+
|
|
185
|
+
<Separator />
|
|
186
|
+
|
|
187
|
+
<div className="flex items-center justify-between px-4 lg:px-5 py-4 lg:py-5 mt-auto lg:mt-0">
|
|
188
|
+
<Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
|
|
189
|
+
Cancelar
|
|
190
|
+
</Button>
|
|
191
|
+
<Button className="h-10!" type="submit" disabled={!isValidLength || isLoading}>
|
|
192
|
+
{isLoading ? 'Validando...' : 'Alterar telefone'}
|
|
193
|
+
</Button>
|
|
194
|
+
</div>
|
|
195
|
+
</form>
|
|
196
|
+
) : (
|
|
197
|
+
<form onSubmit={handleContinue} className="flex flex-col flex-1 lg:flex-none">
|
|
198
|
+
<div className="flex flex-col gap-5 lg:gap-6 px-4 lg:px-5 py-5 lg:py-6 flex-1 lg:flex-none">
|
|
199
|
+
<div className="flex flex-col gap-1">
|
|
200
|
+
<span className="paragraph-medium-semibold text-gray-950">
|
|
201
|
+
Atualizar telefone de contato
|
|
202
|
+
</span>
|
|
203
|
+
<span className="paragraph-small-regular text-gray-600">
|
|
204
|
+
Informe o novo número para manter seu contato atualizado.
|
|
205
|
+
</span>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<PhoneInput
|
|
209
|
+
label="Novo número"
|
|
210
|
+
placeholder="(00) 0 0000-0000"
|
|
211
|
+
value={phoneValue}
|
|
212
|
+
onChange={handlePhoneChange}
|
|
213
|
+
error={!!phoneError}
|
|
214
|
+
errorMessage={phoneError}
|
|
215
|
+
/>
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
<div className="flex items-center justify-between p-4 lg:p-5 border-t border-gray-200 mt-auto lg:mt-0">
|
|
219
|
+
<Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
|
|
220
|
+
Cancelar
|
|
221
|
+
</Button>
|
|
222
|
+
<Button className="h-10!" type="submit" disabled={isSubmitting}>
|
|
223
|
+
{isSubmitting ? 'Enviando...' : 'Continuar'}
|
|
224
|
+
</Button>
|
|
225
|
+
</div>
|
|
226
|
+
</form>
|
|
227
|
+
)}
|
|
228
|
+
</DialogContent>
|
|
229
|
+
</Dialog>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
@@ -5,7 +5,7 @@ import Image from 'next/image';
|
|
|
5
5
|
import { useForm } from 'react-hook-form';
|
|
6
6
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
7
7
|
import { toast } from 'sonner';
|
|
8
|
-
import {
|
|
8
|
+
import { IconUpload, IconTrash } from '@tabler/icons-react';
|
|
9
9
|
import { Button } from '../../ui/buttons/Button';
|
|
10
10
|
import { Separator } from '../../ui/data-display/Separator';
|
|
11
11
|
import { Toast } from '../../ui/feedback/Toast';
|
|
@@ -162,7 +162,7 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
162
162
|
className="size-12 rounded-full bg-gray-50 border border-dashed border-gray-200 flex items-center justify-center cursor-pointer"
|
|
163
163
|
onClick={() => fileInputRef.current?.click()}
|
|
164
164
|
>
|
|
165
|
-
<
|
|
165
|
+
<IconUpload size={20} className="text-gray-400" />
|
|
166
166
|
</div>
|
|
167
167
|
)}
|
|
168
168
|
{avatarPreview ? (
|
|
@@ -181,7 +181,7 @@ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps)
|
|
|
181
181
|
className="h-8!"
|
|
182
182
|
onClick={handleRemovePhoto}
|
|
183
183
|
>
|
|
184
|
-
<
|
|
184
|
+
<IconTrash size={16} className="text-gray-500" />
|
|
185
185
|
</Button>
|
|
186
186
|
</div>
|
|
187
187
|
) : (
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { useForm } from 'react-hook-form';
|
|
5
5
|
import { toast } from 'sonner';
|
|
6
|
-
import {
|
|
6
|
+
import { IconLock, IconMail, IconMessageCircle } from '@tabler/icons-react';
|
|
7
7
|
import { Button } from '../../ui/buttons/Button';
|
|
8
8
|
import { Separator } from '../../ui/data-display/Separator';
|
|
9
9
|
import { Toast } from '../../ui/feedback/Toast';
|
|
@@ -167,7 +167,7 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
167
167
|
options={currencies}
|
|
168
168
|
value={watch('currency')}
|
|
169
169
|
onChange={(value) => setValue('currency', value, { shouldDirty: true })}
|
|
170
|
-
icon={!canEditPreferences ? <
|
|
170
|
+
icon={!canEditPreferences ? <IconLock className="size-4 text-gray-400" /> : undefined}
|
|
171
171
|
disabled={!canEditPreferences}
|
|
172
172
|
/>
|
|
173
173
|
</div>
|
|
@@ -185,7 +185,7 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
185
185
|
options={timezones}
|
|
186
186
|
value={watch('timezone')}
|
|
187
187
|
onChange={(value) => setValue('timezone', value, { shouldDirty: true })}
|
|
188
|
-
icon={!canEditPreferences ? <
|
|
188
|
+
icon={!canEditPreferences ? <IconLock className="size-4 text-gray-400" /> : undefined}
|
|
189
189
|
disabled={!canEditPreferences}
|
|
190
190
|
/>
|
|
191
191
|
<SelectField
|
|
@@ -198,7 +198,7 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
198
198
|
onChange={(value) =>
|
|
199
199
|
setValue('timeFormat', value as string, { shouldDirty: true })
|
|
200
200
|
}
|
|
201
|
-
icon={<
|
|
201
|
+
icon={<IconLock className="size-4 text-gray-400" />}
|
|
202
202
|
disabled
|
|
203
203
|
/>
|
|
204
204
|
</div>
|
|
@@ -211,14 +211,14 @@ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
|
|
|
211
211
|
<div className="flex flex-col gap-3">
|
|
212
212
|
<div className="flex flex-col border border-gray-200 rounded-lg">
|
|
213
213
|
<SwitchOptionFieldWithIcon
|
|
214
|
-
icon={
|
|
214
|
+
icon={IconMessageCircle}
|
|
215
215
|
label="WhatsApp"
|
|
216
216
|
description="Receber notificações importantes por WhatsApp"
|
|
217
217
|
checked={receiveSms}
|
|
218
218
|
onCheckedChange={(val: boolean) => setValue('receive_sms', val, { shouldDirty: true })}
|
|
219
219
|
/>
|
|
220
220
|
<SwitchOptionFieldWithIcon
|
|
221
|
-
icon={
|
|
221
|
+
icon={IconMail}
|
|
222
222
|
label="E-mail"
|
|
223
223
|
description="Receber notificações e atualizações por email"
|
|
224
224
|
checked={receiveEmail}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useState, useCallback } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { IconLock, IconTool } from '@tabler/icons-react';
|
|
5
5
|
import { Badge } from '../../ui/data-display/Badge';
|
|
6
6
|
import { Button } from '../../ui/buttons/Button';
|
|
7
7
|
import { useAuth } from '../../../providers/auth.provider';
|
|
@@ -65,7 +65,7 @@ export function SecuritySection({
|
|
|
65
65
|
>
|
|
66
66
|
<div className="flex flex-1 items-start lg:items-center gap-4 lg:gap-5">
|
|
67
67
|
<div className="size-10 rounded-lg bg-gray-50 flex items-center justify-center shrink-0">
|
|
68
|
-
<
|
|
68
|
+
<IconTool size={20} className="text-gray-950" />
|
|
69
69
|
</div>
|
|
70
70
|
<div className="flex flex-col gap-1.5 flex-1">
|
|
71
71
|
<div className="flex flex-wrap items-center gap-2">
|
|
@@ -101,7 +101,7 @@ export function SecuritySection({
|
|
|
101
101
|
>
|
|
102
102
|
<div className="flex flex-1 items-start lg:items-center gap-4 lg:gap-5">
|
|
103
103
|
<div className="size-10 rounded-lg bg-gray-50 flex items-center justify-center shrink-0">
|
|
104
|
-
<
|
|
104
|
+
<IconLock size={20} className="text-gray-950" />
|
|
105
105
|
</div>
|
|
106
106
|
<div className="flex flex-col gap-1.5 flex-1">
|
|
107
107
|
<span className="paragraph-small-semibold text-gray-950">
|