@greatapps/common 1.1.258 → 1.1.260
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 +1 -1
- package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
- package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
- 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.map +1 -1
- package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
- 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 +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.map +1 -1
- package/dist/components/layouts/NavBar.mjs.map +1 -1
- package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
- package/dist/components/modals/BuyCreditsModal.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.map +1 -1
- package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
- 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.map +1 -1
- 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/CardBrandIcons.mjs.map +1 -1
- package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
- package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
- package/dist/components/ui/data-display/PaymentInfoCard.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/Skeleton.mjs.map +1 -1
- package/dist/components/ui/feedback/Toast.mjs.map +1 -1
- package/dist/components/ui/form/Calendar.mjs.map +1 -1
- package/dist/components/ui/form/Checkbox.mjs.map +1 -1
- 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.map +1 -1
- 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.map +1 -1
- package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
- package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
- package/dist/components/ui/form/Select.mjs +1 -1
- 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/Textarea.mjs.map +1 -1
- package/dist/components/ui/overlay/Command.mjs.map +1 -1
- 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.map +1 -1
- package/dist/components/ui/overlay/Tooltip.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/actions/validate-session.action.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/cards/actions/list-cards.action.mjs.map +1 -1
- package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
- package/dist/modules/cards/services/cards.service.mjs.map +1 -1
- package/dist/modules/cards/types.mjs.map +1 -1
- package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
- package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
- package/dist/modules/plans/services/plans.service.mjs.map +1 -1
- package/dist/modules/plans/types/plan.type.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/calculate-subscription.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
- package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/calculate-subscription.hook.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/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.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/actions/revalidate-whitelabel-styles.action.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/revalidate-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/store/useBuyCreditsModal.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 -89
- package/src/components/account/ConfigurationsMyAccountModal.tsx +150 -150
- package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
- package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
- package/src/components/account/DeleteAccountModal.tsx +130 -130
- package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
- package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
- package/src/components/account/TwoFactorAuthModal.tsx +223 -223
- 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 +225 -225
- package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
- package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
- package/src/components/account/sections/MyProfileSection.tsx +327 -327
- package/src/components/account/sections/PreferencesSection.tsx +273 -273
- package/src/components/account/sections/SecuritySection.tsx +160 -160
- package/src/components/embeds/CrispEmbed.tsx +101 -101
- package/src/components/embeds/FrillEmbed.tsx +119 -119
- package/src/components/layouts/AppMobileNavBar.tsx +118 -118
- package/src/components/layouts/AppNavBar.tsx +51 -51
- package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
- package/src/components/layouts/NavBar.tsx +120 -120
- package/src/components/layouts/NotificationsPopover.tsx +115 -115
- package/src/components/layouts/ProfilePopover.tsx +164 -164
- package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
- package/src/components/modals/BuyCreditsModal.tsx +301 -301
- package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
- package/src/components/navigation/NavItemsContext.ts +20 -20
- package/src/components/navigation/ProjectSelectorPopover.tsx +157 -157
- package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
- package/src/components/navigation/subcomponents/ProjectSelector.tsx +156 -156
- 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/CardBrandIcons.tsx +336 -336
- package/src/components/ui/data-display/CardItem.tsx +75 -75
- package/src/components/ui/data-display/Pagination.tsx +126 -126
- package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
- 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/Skeleton.tsx +5 -5
- 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 +154 -154
- 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 +131 -131
- 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/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/hooks/copy-to-clipboard.hook.tsx +67 -67
- package/src/index.ts +376 -376
- package/src/middleware.ts +4 -4
- package/src/modules/accounts/actions/account-management.action.ts +91 -91
- 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/actions/validate-session.action.ts +56 -56
- 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/cards/actions/list-cards.action.ts +8 -8
- package/src/modules/cards/hooks/cards.hook.ts +14 -14
- package/src/modules/cards/services/cards.service.ts +32 -32
- package/src/modules/cards/types.ts +32 -32
- package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
- package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
- package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +17 -17
- package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
- package/src/modules/plans/services/plans.service.ts +36 -36
- package/src/modules/plans/types/plan.type.ts +21 -21
- 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/calculate-subscription.action.ts +9 -9
- package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
- package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +26 -26
- package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
- package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
- package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
- package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
- package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
- package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
- package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
- package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
- package/src/modules/subscriptions/utils/periodicity.ts +52 -52
- package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
- 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/actions/revalidate-whitelabel-styles.action.ts +10 -10
- package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
- package/src/modules/whitelabel/schema.ts +83 -83
- package/src/modules/whitelabel/services/whitelabel-styles.service.ts +129 -129
- package/src/modules/whitelabel/styles-schema.ts +37 -37
- package/src/providers/whitelabel.provider.tsx +54 -54
- package/src/store/useBuyCreditsModal.ts +25 -25
- package/src/utils/countries.ts +224 -224
- package/src/utils/safeServerAction.ts +21 -21
- package/src/utils/withAction.ts +13 -13
|
@@ -1,327 +1,327 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useState, useRef } from 'react';
|
|
4
|
-
import Image from 'next/image';
|
|
5
|
-
import { useForm } from 'react-hook-form';
|
|
6
|
-
import { zodResolver } from '@hookform/resolvers/zod';
|
|
7
|
-
import { toast } from 'sonner';
|
|
8
|
-
import { IconUpload, IconTrash } from '@tabler/icons-react';
|
|
9
|
-
import { Button } from '../../ui/buttons/Button';
|
|
10
|
-
import { Separator } from '../../ui/data-display/Separator';
|
|
11
|
-
import { Toast } from '../../ui/feedback/Toast';
|
|
12
|
-
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
|
|
13
|
-
import { FormField } from '../../ui/form/FormField';
|
|
14
|
-
import { SelectField } from '../../ui/form/SelectField';
|
|
15
|
-
import PhoneInput from '../../ui/form/PhoneInput';
|
|
16
|
-
import { useAuth } from '../../../providers/auth.provider';
|
|
17
|
-
import { UserProfile } from '../../../modules/users/schema';
|
|
18
|
-
import { myProfileSchema, type MyProfileFormData } from '../../../utils/validators/account';
|
|
19
|
-
import {
|
|
20
|
-
useUpdateAccountUser,
|
|
21
|
-
useDeleteAccount,
|
|
22
|
-
useDeleteAccountUser,
|
|
23
|
-
} from '../../../modules/accounts/hooks/useAccountManagement';
|
|
24
|
-
import { GENDER_OPTIONS } from '../constants';
|
|
25
|
-
import { ChangePhoneModal } from './ChangePhoneModal';
|
|
26
|
-
import { ChangeEmailModal } from './ChangeEmailModal';
|
|
27
|
-
|
|
28
|
-
interface MyProfileSectionProps {
|
|
29
|
-
onClose: () => void;
|
|
30
|
-
storageUrl?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps) {
|
|
34
|
-
const { user, logout } = useAuth();
|
|
35
|
-
const updateAccountUser = useUpdateAccountUser();
|
|
36
|
-
const deleteAccount = useDeleteAccount();
|
|
37
|
-
const deleteAccountUser = useDeleteAccountUser();
|
|
38
|
-
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
39
|
-
const [selectedPhoto, setSelectedPhoto] = useState<File | null>(null);
|
|
40
|
-
const [photoRemoved, setPhotoRemoved] = useState(false);
|
|
41
|
-
const [changePhoneOpen, setChangePhoneOpen] = useState(false);
|
|
42
|
-
const [changeEmailOpen, setChangeEmailOpen] = useState(false);
|
|
43
|
-
const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
|
|
44
|
-
|
|
45
|
-
const isOwner = user?.profile === UserProfile.owner;
|
|
46
|
-
const isDeleting = deleteAccount.isPending || deleteAccountUser.isPending;
|
|
47
|
-
|
|
48
|
-
const form = useForm<MyProfileFormData>({
|
|
49
|
-
resolver: zodResolver(myProfileSchema),
|
|
50
|
-
mode: 'onChange',
|
|
51
|
-
defaultValues: {
|
|
52
|
-
name: user?.name ?? '',
|
|
53
|
-
last_name: user?.last_name ?? '',
|
|
54
|
-
gender: GENDER_OPTIONS.find((g) => g.apiValue === user?.gender)?.value ?? '',
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const {
|
|
59
|
-
register,
|
|
60
|
-
handleSubmit,
|
|
61
|
-
watch,
|
|
62
|
-
setValue,
|
|
63
|
-
formState: { errors, isSubmitting },
|
|
64
|
-
} = form;
|
|
65
|
-
|
|
66
|
-
const baseStorageUrl = storageUrl ?? process.env.NEXT_PUBLIC_STORAGE_URL ?? '';
|
|
67
|
-
|
|
68
|
-
const avatarPreview = selectedPhoto
|
|
69
|
-
? URL.createObjectURL(selectedPhoto)
|
|
70
|
-
: !photoRemoved && user?.photo
|
|
71
|
-
? `${baseStorageUrl}/${user.photo}`
|
|
72
|
-
: null;
|
|
73
|
-
|
|
74
|
-
const handlePhotoChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
75
|
-
const file = e.target.files?.[0] ?? null;
|
|
76
|
-
if (file) {
|
|
77
|
-
setSelectedPhoto(file);
|
|
78
|
-
setPhotoRemoved(false);
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const handleRemovePhoto = () => {
|
|
83
|
-
setSelectedPhoto(null);
|
|
84
|
-
setPhotoRemoved(true);
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const handleDelete = async () => {
|
|
88
|
-
try {
|
|
89
|
-
if (isOwner) {
|
|
90
|
-
await deleteAccount.mutateAsync();
|
|
91
|
-
} else {
|
|
92
|
-
await deleteAccountUser.mutateAsync(user!.id);
|
|
93
|
-
}
|
|
94
|
-
await logout();
|
|
95
|
-
} catch (error) {
|
|
96
|
-
toast.custom((t) => (
|
|
97
|
-
<Toast
|
|
98
|
-
variant="error"
|
|
99
|
-
message={error instanceof Error ? error.message : 'Erro ao excluir. Tente novamente.'}
|
|
100
|
-
toastId={t}
|
|
101
|
-
/>
|
|
102
|
-
));
|
|
103
|
-
setDeleteConfirmOpen(false);
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const onSubmit = async (data: MyProfileFormData) => {
|
|
108
|
-
try {
|
|
109
|
-
await updateAccountUser.mutateAsync({
|
|
110
|
-
name: data.name,
|
|
111
|
-
last_name: data.last_name,
|
|
112
|
-
gender: GENDER_OPTIONS.find((g) => g.value === data.gender)?.apiValue,
|
|
113
|
-
...(selectedPhoto ? { photo: selectedPhoto } : {}),
|
|
114
|
-
...(photoRemoved ? { photo: '' } : {}),
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
form.reset(data);
|
|
118
|
-
setSelectedPhoto(null);
|
|
119
|
-
setPhotoRemoved(false);
|
|
120
|
-
toast.custom((t) => (
|
|
121
|
-
<Toast variant="success" message="Perfil atualizado com sucesso" toastId={t} />
|
|
122
|
-
));
|
|
123
|
-
onClose();
|
|
124
|
-
} catch (error) {
|
|
125
|
-
toast.custom((t) => (
|
|
126
|
-
<Toast
|
|
127
|
-
variant="error"
|
|
128
|
-
message={error instanceof Error ? error.message : 'Erro ao atualizar perfil'}
|
|
129
|
-
toastId={t}
|
|
130
|
-
/>
|
|
131
|
-
));
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
return (
|
|
136
|
-
<>
|
|
137
|
-
<form onSubmit={handleSubmit(onSubmit)} className="lg:h-full lg:flex lg:flex-col">
|
|
138
|
-
<input
|
|
139
|
-
ref={fileInputRef}
|
|
140
|
-
type="file"
|
|
141
|
-
accept="image/*"
|
|
142
|
-
className="hidden"
|
|
143
|
-
onChange={handlePhotoChange}
|
|
144
|
-
/>
|
|
145
|
-
<div className="absolute inset-0 overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:static lg:flex-1 lg:min-h-0 lg:overscroll-auto flex flex-col gap-5 lg:gap-6">
|
|
146
|
-
<span className="paragraph-medium-semibold text-gray-950 hidden lg:block">
|
|
147
|
-
Meu perfil
|
|
148
|
-
</span>
|
|
149
|
-
<div className="flex flex-col gap-5">
|
|
150
|
-
<div className="flex items-center gap-4">
|
|
151
|
-
{avatarPreview ? (
|
|
152
|
-
<Image
|
|
153
|
-
src={avatarPreview}
|
|
154
|
-
alt="Foto do usuário"
|
|
155
|
-
width={48}
|
|
156
|
-
height={48}
|
|
157
|
-
className="size-12 rounded-full object-cover cursor-pointer"
|
|
158
|
-
onClick={() => fileInputRef.current?.click()}
|
|
159
|
-
/>
|
|
160
|
-
) : (
|
|
161
|
-
<div
|
|
162
|
-
className="size-12 rounded-full bg-gray-50 border border-dashed border-gray-200 flex items-center justify-center cursor-pointer"
|
|
163
|
-
onClick={() => fileInputRef.current?.click()}
|
|
164
|
-
>
|
|
165
|
-
<IconUpload size={20} className="text-gray-400" />
|
|
166
|
-
</div>
|
|
167
|
-
)}
|
|
168
|
-
{avatarPreview ? (
|
|
169
|
-
<div className="flex items-center gap-2">
|
|
170
|
-
<Button
|
|
171
|
-
variant="secondary"
|
|
172
|
-
className="w-fit h-8!"
|
|
173
|
-
type="button"
|
|
174
|
-
onClick={() => fileInputRef.current?.click()}
|
|
175
|
-
>
|
|
176
|
-
Alterar foto
|
|
177
|
-
</Button>
|
|
178
|
-
<Button
|
|
179
|
-
type="button"
|
|
180
|
-
variant="ghost"
|
|
181
|
-
className="h-8!"
|
|
182
|
-
onClick={handleRemovePhoto}
|
|
183
|
-
>
|
|
184
|
-
<IconTrash size={16} className="text-gray-500" />
|
|
185
|
-
</Button>
|
|
186
|
-
</div>
|
|
187
|
-
) : (
|
|
188
|
-
<Button
|
|
189
|
-
variant="secondary"
|
|
190
|
-
className="w-fit h-8!"
|
|
191
|
-
type="button"
|
|
192
|
-
onClick={() => fileInputRef.current?.click()}
|
|
193
|
-
>
|
|
194
|
-
Alterar foto
|
|
195
|
-
</Button>
|
|
196
|
-
)}
|
|
197
|
-
</div>
|
|
198
|
-
|
|
199
|
-
<div className="flex flex-col gap-8">
|
|
200
|
-
<div className="flex flex-col gap-4">
|
|
201
|
-
<div className="flex gap-4">
|
|
202
|
-
<FormField
|
|
203
|
-
label="Nome"
|
|
204
|
-
placeholder="Digite seu nome"
|
|
205
|
-
error={!!errors.name}
|
|
206
|
-
errorMessage={errors.name?.message}
|
|
207
|
-
{...register('name')}
|
|
208
|
-
/>
|
|
209
|
-
<FormField
|
|
210
|
-
label="Sobrenome"
|
|
211
|
-
placeholder="Digite seu sobrenome"
|
|
212
|
-
error={!!errors.last_name}
|
|
213
|
-
errorMessage={errors.last_name?.message}
|
|
214
|
-
{...register('last_name')}
|
|
215
|
-
/>
|
|
216
|
-
</div>
|
|
217
|
-
<SelectField
|
|
218
|
-
label="Gênero"
|
|
219
|
-
placeholder="Selecione seu gênero"
|
|
220
|
-
options={GENDER_OPTIONS}
|
|
221
|
-
value={watch('gender')}
|
|
222
|
-
className="h-10!"
|
|
223
|
-
onChange={(value) => setValue('gender', value as string)}
|
|
224
|
-
/>
|
|
225
|
-
<div className="relative">
|
|
226
|
-
<PhoneInput
|
|
227
|
-
label="Telefone"
|
|
228
|
-
value={user?.phone ?? ''}
|
|
229
|
-
disabled
|
|
230
|
-
classnameContainer="bg-gray-50 border-0!"
|
|
231
|
-
/>
|
|
232
|
-
<button
|
|
233
|
-
type="button"
|
|
234
|
-
className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
|
|
235
|
-
onClick={() => setChangePhoneOpen(true)}
|
|
236
|
-
>
|
|
237
|
-
Alterar
|
|
238
|
-
</button>
|
|
239
|
-
</div>
|
|
240
|
-
</div>
|
|
241
|
-
|
|
242
|
-
<Separator />
|
|
243
|
-
|
|
244
|
-
<div className="flex flex-col gap-4">
|
|
245
|
-
<span className="paragraph-medium-semibold text-gray-600">Dados de acesso</span>
|
|
246
|
-
<div className="relative">
|
|
247
|
-
<div className='cursor-not-allowed'>
|
|
248
|
-
<FormField
|
|
249
|
-
label="E-mail"
|
|
250
|
-
value={user?.email ?? ''}
|
|
251
|
-
disabled
|
|
252
|
-
classnameContainer="bg-gray-50 border-0!"
|
|
253
|
-
/>
|
|
254
|
-
</div>
|
|
255
|
-
<button
|
|
256
|
-
type="button"
|
|
257
|
-
className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
|
|
258
|
-
onClick={() => setChangeEmailOpen(true)}
|
|
259
|
-
>
|
|
260
|
-
Alterar
|
|
261
|
-
</button>
|
|
262
|
-
</div>
|
|
263
|
-
</div>
|
|
264
|
-
</div>
|
|
265
|
-
</div>
|
|
266
|
-
</div>
|
|
267
|
-
|
|
268
|
-
<div className="fixed bottom-0 left-0 right-0 lg:static flex items-center h-20 px-4 lg:px-5 border-t border-gray-200 justify-between bg-white z-10">
|
|
269
|
-
<Button
|
|
270
|
-
variant="secondary"
|
|
271
|
-
className="h-10!"
|
|
272
|
-
type="button"
|
|
273
|
-
disabled={isSubmitting}
|
|
274
|
-
onClick={() => {
|
|
275
|
-
form.reset();
|
|
276
|
-
setSelectedPhoto(null);
|
|
277
|
-
setPhotoRemoved(false);
|
|
278
|
-
onClose();
|
|
279
|
-
}}
|
|
280
|
-
>
|
|
281
|
-
Cancelar
|
|
282
|
-
</Button>
|
|
283
|
-
<Button className="h-10! cursor-pointer" type="submit" disabled={isSubmitting}>
|
|
284
|
-
{isSubmitting ? 'Salvando...' : 'Salvar alterações'}
|
|
285
|
-
</Button>
|
|
286
|
-
</div>
|
|
287
|
-
</form>
|
|
288
|
-
|
|
289
|
-
<ChangePhoneModal open={changePhoneOpen} onClose={() => setChangePhoneOpen(false)} />
|
|
290
|
-
<ChangeEmailModal open={changeEmailOpen} onClose={() => setChangeEmailOpen(false)} />
|
|
291
|
-
|
|
292
|
-
<Dialog open={deleteConfirmOpen} onOpenChange={setDeleteConfirmOpen}>
|
|
293
|
-
<DialogContent className="max-w-sm! gap-5">
|
|
294
|
-
<DialogHeader>
|
|
295
|
-
<DialogTitle className="paragraph-large-semibold text-gray-950">
|
|
296
|
-
{isOwner ? 'Excluir conta' : 'Excluir usuário'}
|
|
297
|
-
</DialogTitle>
|
|
298
|
-
</DialogHeader>
|
|
299
|
-
<p className="paragraph-small-regular text-gray-600">
|
|
300
|
-
{isOwner
|
|
301
|
-
? 'Tem certeza que deseja excluir sua conta? Todos os dados serão apagados permanentemente e essa ação não pode ser desfeita.'
|
|
302
|
-
: 'Tem certeza que deseja excluir seu usuário? Você perderá acesso a esta conta permanentemente.'}
|
|
303
|
-
</p>
|
|
304
|
-
<div className="flex items-center gap-3 justify-end">
|
|
305
|
-
<Button
|
|
306
|
-
type="button"
|
|
307
|
-
variant="secondary"
|
|
308
|
-
className="h-10!"
|
|
309
|
-
disabled={isDeleting}
|
|
310
|
-
onClick={() => setDeleteConfirmOpen(false)}
|
|
311
|
-
>
|
|
312
|
-
Cancelar
|
|
313
|
-
</Button>
|
|
314
|
-
<Button
|
|
315
|
-
type="button"
|
|
316
|
-
className="h-10! bg-red-600 hover:bg-red-700 text-white border-0!"
|
|
317
|
-
disabled={isDeleting}
|
|
318
|
-
onClick={handleDelete}
|
|
319
|
-
>
|
|
320
|
-
{isDeleting ? 'Excluindo...' : 'Confirmar exclusão'}
|
|
321
|
-
</Button>
|
|
322
|
-
</div>
|
|
323
|
-
</DialogContent>
|
|
324
|
-
</Dialog>
|
|
325
|
-
</>
|
|
326
|
-
);
|
|
327
|
-
}
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState, useRef } from 'react';
|
|
4
|
+
import Image from 'next/image';
|
|
5
|
+
import { useForm } from 'react-hook-form';
|
|
6
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
7
|
+
import { toast } from 'sonner';
|
|
8
|
+
import { IconUpload, IconTrash } from '@tabler/icons-react';
|
|
9
|
+
import { Button } from '../../ui/buttons/Button';
|
|
10
|
+
import { Separator } from '../../ui/data-display/Separator';
|
|
11
|
+
import { Toast } from '../../ui/feedback/Toast';
|
|
12
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
|
|
13
|
+
import { FormField } from '../../ui/form/FormField';
|
|
14
|
+
import { SelectField } from '../../ui/form/SelectField';
|
|
15
|
+
import PhoneInput from '../../ui/form/PhoneInput';
|
|
16
|
+
import { useAuth } from '../../../providers/auth.provider';
|
|
17
|
+
import { UserProfile } from '../../../modules/users/schema';
|
|
18
|
+
import { myProfileSchema, type MyProfileFormData } from '../../../utils/validators/account';
|
|
19
|
+
import {
|
|
20
|
+
useUpdateAccountUser,
|
|
21
|
+
useDeleteAccount,
|
|
22
|
+
useDeleteAccountUser,
|
|
23
|
+
} from '../../../modules/accounts/hooks/useAccountManagement';
|
|
24
|
+
import { GENDER_OPTIONS } from '../constants';
|
|
25
|
+
import { ChangePhoneModal } from './ChangePhoneModal';
|
|
26
|
+
import { ChangeEmailModal } from './ChangeEmailModal';
|
|
27
|
+
|
|
28
|
+
interface MyProfileSectionProps {
|
|
29
|
+
onClose: () => void;
|
|
30
|
+
storageUrl?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps) {
|
|
34
|
+
const { user, logout } = useAuth();
|
|
35
|
+
const updateAccountUser = useUpdateAccountUser();
|
|
36
|
+
const deleteAccount = useDeleteAccount();
|
|
37
|
+
const deleteAccountUser = useDeleteAccountUser();
|
|
38
|
+
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
39
|
+
const [selectedPhoto, setSelectedPhoto] = useState<File | null>(null);
|
|
40
|
+
const [photoRemoved, setPhotoRemoved] = useState(false);
|
|
41
|
+
const [changePhoneOpen, setChangePhoneOpen] = useState(false);
|
|
42
|
+
const [changeEmailOpen, setChangeEmailOpen] = useState(false);
|
|
43
|
+
const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
|
|
44
|
+
|
|
45
|
+
const isOwner = user?.profile === UserProfile.owner;
|
|
46
|
+
const isDeleting = deleteAccount.isPending || deleteAccountUser.isPending;
|
|
47
|
+
|
|
48
|
+
const form = useForm<MyProfileFormData>({
|
|
49
|
+
resolver: zodResolver(myProfileSchema),
|
|
50
|
+
mode: 'onChange',
|
|
51
|
+
defaultValues: {
|
|
52
|
+
name: user?.name ?? '',
|
|
53
|
+
last_name: user?.last_name ?? '',
|
|
54
|
+
gender: GENDER_OPTIONS.find((g) => g.apiValue === user?.gender)?.value ?? '',
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const {
|
|
59
|
+
register,
|
|
60
|
+
handleSubmit,
|
|
61
|
+
watch,
|
|
62
|
+
setValue,
|
|
63
|
+
formState: { errors, isSubmitting },
|
|
64
|
+
} = form;
|
|
65
|
+
|
|
66
|
+
const baseStorageUrl = storageUrl ?? process.env.NEXT_PUBLIC_STORAGE_URL ?? '';
|
|
67
|
+
|
|
68
|
+
const avatarPreview = selectedPhoto
|
|
69
|
+
? URL.createObjectURL(selectedPhoto)
|
|
70
|
+
: !photoRemoved && user?.photo
|
|
71
|
+
? `${baseStorageUrl}/${user.photo}`
|
|
72
|
+
: null;
|
|
73
|
+
|
|
74
|
+
const handlePhotoChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
75
|
+
const file = e.target.files?.[0] ?? null;
|
|
76
|
+
if (file) {
|
|
77
|
+
setSelectedPhoto(file);
|
|
78
|
+
setPhotoRemoved(false);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const handleRemovePhoto = () => {
|
|
83
|
+
setSelectedPhoto(null);
|
|
84
|
+
setPhotoRemoved(true);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const handleDelete = async () => {
|
|
88
|
+
try {
|
|
89
|
+
if (isOwner) {
|
|
90
|
+
await deleteAccount.mutateAsync();
|
|
91
|
+
} else {
|
|
92
|
+
await deleteAccountUser.mutateAsync(user!.id);
|
|
93
|
+
}
|
|
94
|
+
await logout();
|
|
95
|
+
} catch (error) {
|
|
96
|
+
toast.custom((t) => (
|
|
97
|
+
<Toast
|
|
98
|
+
variant="error"
|
|
99
|
+
message={error instanceof Error ? error.message : 'Erro ao excluir. Tente novamente.'}
|
|
100
|
+
toastId={t}
|
|
101
|
+
/>
|
|
102
|
+
));
|
|
103
|
+
setDeleteConfirmOpen(false);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const onSubmit = async (data: MyProfileFormData) => {
|
|
108
|
+
try {
|
|
109
|
+
await updateAccountUser.mutateAsync({
|
|
110
|
+
name: data.name,
|
|
111
|
+
last_name: data.last_name,
|
|
112
|
+
gender: GENDER_OPTIONS.find((g) => g.value === data.gender)?.apiValue,
|
|
113
|
+
...(selectedPhoto ? { photo: selectedPhoto } : {}),
|
|
114
|
+
...(photoRemoved ? { photo: '' } : {}),
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
form.reset(data);
|
|
118
|
+
setSelectedPhoto(null);
|
|
119
|
+
setPhotoRemoved(false);
|
|
120
|
+
toast.custom((t) => (
|
|
121
|
+
<Toast variant="success" message="Perfil atualizado com sucesso" toastId={t} />
|
|
122
|
+
));
|
|
123
|
+
onClose();
|
|
124
|
+
} catch (error) {
|
|
125
|
+
toast.custom((t) => (
|
|
126
|
+
<Toast
|
|
127
|
+
variant="error"
|
|
128
|
+
message={error instanceof Error ? error.message : 'Erro ao atualizar perfil'}
|
|
129
|
+
toastId={t}
|
|
130
|
+
/>
|
|
131
|
+
));
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
<>
|
|
137
|
+
<form onSubmit={handleSubmit(onSubmit)} className="lg:h-full lg:flex lg:flex-col">
|
|
138
|
+
<input
|
|
139
|
+
ref={fileInputRef}
|
|
140
|
+
type="file"
|
|
141
|
+
accept="image/*"
|
|
142
|
+
className="hidden"
|
|
143
|
+
onChange={handlePhotoChange}
|
|
144
|
+
/>
|
|
145
|
+
<div className="absolute inset-0 overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:static lg:flex-1 lg:min-h-0 lg:overscroll-auto flex flex-col gap-5 lg:gap-6">
|
|
146
|
+
<span className="paragraph-medium-semibold text-gray-950 hidden lg:block">
|
|
147
|
+
Meu perfil
|
|
148
|
+
</span>
|
|
149
|
+
<div className="flex flex-col gap-5">
|
|
150
|
+
<div className="flex items-center gap-4">
|
|
151
|
+
{avatarPreview ? (
|
|
152
|
+
<Image
|
|
153
|
+
src={avatarPreview}
|
|
154
|
+
alt="Foto do usuário"
|
|
155
|
+
width={48}
|
|
156
|
+
height={48}
|
|
157
|
+
className="size-12 rounded-full object-cover cursor-pointer"
|
|
158
|
+
onClick={() => fileInputRef.current?.click()}
|
|
159
|
+
/>
|
|
160
|
+
) : (
|
|
161
|
+
<div
|
|
162
|
+
className="size-12 rounded-full bg-gray-50 border border-dashed border-gray-200 flex items-center justify-center cursor-pointer"
|
|
163
|
+
onClick={() => fileInputRef.current?.click()}
|
|
164
|
+
>
|
|
165
|
+
<IconUpload size={20} className="text-gray-400" />
|
|
166
|
+
</div>
|
|
167
|
+
)}
|
|
168
|
+
{avatarPreview ? (
|
|
169
|
+
<div className="flex items-center gap-2">
|
|
170
|
+
<Button
|
|
171
|
+
variant="secondary"
|
|
172
|
+
className="w-fit h-8!"
|
|
173
|
+
type="button"
|
|
174
|
+
onClick={() => fileInputRef.current?.click()}
|
|
175
|
+
>
|
|
176
|
+
Alterar foto
|
|
177
|
+
</Button>
|
|
178
|
+
<Button
|
|
179
|
+
type="button"
|
|
180
|
+
variant="ghost"
|
|
181
|
+
className="h-8!"
|
|
182
|
+
onClick={handleRemovePhoto}
|
|
183
|
+
>
|
|
184
|
+
<IconTrash size={16} className="text-gray-500" />
|
|
185
|
+
</Button>
|
|
186
|
+
</div>
|
|
187
|
+
) : (
|
|
188
|
+
<Button
|
|
189
|
+
variant="secondary"
|
|
190
|
+
className="w-fit h-8!"
|
|
191
|
+
type="button"
|
|
192
|
+
onClick={() => fileInputRef.current?.click()}
|
|
193
|
+
>
|
|
194
|
+
Alterar foto
|
|
195
|
+
</Button>
|
|
196
|
+
)}
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<div className="flex flex-col gap-8">
|
|
200
|
+
<div className="flex flex-col gap-4">
|
|
201
|
+
<div className="flex gap-4">
|
|
202
|
+
<FormField
|
|
203
|
+
label="Nome"
|
|
204
|
+
placeholder="Digite seu nome"
|
|
205
|
+
error={!!errors.name}
|
|
206
|
+
errorMessage={errors.name?.message}
|
|
207
|
+
{...register('name')}
|
|
208
|
+
/>
|
|
209
|
+
<FormField
|
|
210
|
+
label="Sobrenome"
|
|
211
|
+
placeholder="Digite seu sobrenome"
|
|
212
|
+
error={!!errors.last_name}
|
|
213
|
+
errorMessage={errors.last_name?.message}
|
|
214
|
+
{...register('last_name')}
|
|
215
|
+
/>
|
|
216
|
+
</div>
|
|
217
|
+
<SelectField
|
|
218
|
+
label="Gênero"
|
|
219
|
+
placeholder="Selecione seu gênero"
|
|
220
|
+
options={GENDER_OPTIONS}
|
|
221
|
+
value={watch('gender')}
|
|
222
|
+
className="h-10!"
|
|
223
|
+
onChange={(value) => setValue('gender', value as string)}
|
|
224
|
+
/>
|
|
225
|
+
<div className="relative">
|
|
226
|
+
<PhoneInput
|
|
227
|
+
label="Telefone"
|
|
228
|
+
value={user?.phone ?? ''}
|
|
229
|
+
disabled
|
|
230
|
+
classnameContainer="bg-gray-50 border-0!"
|
|
231
|
+
/>
|
|
232
|
+
<button
|
|
233
|
+
type="button"
|
|
234
|
+
className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
|
|
235
|
+
onClick={() => setChangePhoneOpen(true)}
|
|
236
|
+
>
|
|
237
|
+
Alterar
|
|
238
|
+
</button>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
|
|
242
|
+
<Separator />
|
|
243
|
+
|
|
244
|
+
<div className="flex flex-col gap-4">
|
|
245
|
+
<span className="paragraph-medium-semibold text-gray-600">Dados de acesso</span>
|
|
246
|
+
<div className="relative">
|
|
247
|
+
<div className='cursor-not-allowed'>
|
|
248
|
+
<FormField
|
|
249
|
+
label="E-mail"
|
|
250
|
+
value={user?.email ?? ''}
|
|
251
|
+
disabled
|
|
252
|
+
classnameContainer="bg-gray-50 border-0!"
|
|
253
|
+
/>
|
|
254
|
+
</div>
|
|
255
|
+
<button
|
|
256
|
+
type="button"
|
|
257
|
+
className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
|
|
258
|
+
onClick={() => setChangeEmailOpen(true)}
|
|
259
|
+
>
|
|
260
|
+
Alterar
|
|
261
|
+
</button>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
<div className="fixed bottom-0 left-0 right-0 lg:static flex items-center h-20 px-4 lg:px-5 border-t border-gray-200 justify-between bg-white z-10">
|
|
269
|
+
<Button
|
|
270
|
+
variant="secondary"
|
|
271
|
+
className="h-10!"
|
|
272
|
+
type="button"
|
|
273
|
+
disabled={isSubmitting}
|
|
274
|
+
onClick={() => {
|
|
275
|
+
form.reset();
|
|
276
|
+
setSelectedPhoto(null);
|
|
277
|
+
setPhotoRemoved(false);
|
|
278
|
+
onClose();
|
|
279
|
+
}}
|
|
280
|
+
>
|
|
281
|
+
Cancelar
|
|
282
|
+
</Button>
|
|
283
|
+
<Button className="h-10! cursor-pointer" type="submit" disabled={isSubmitting}>
|
|
284
|
+
{isSubmitting ? 'Salvando...' : 'Salvar alterações'}
|
|
285
|
+
</Button>
|
|
286
|
+
</div>
|
|
287
|
+
</form>
|
|
288
|
+
|
|
289
|
+
<ChangePhoneModal open={changePhoneOpen} onClose={() => setChangePhoneOpen(false)} />
|
|
290
|
+
<ChangeEmailModal open={changeEmailOpen} onClose={() => setChangeEmailOpen(false)} />
|
|
291
|
+
|
|
292
|
+
<Dialog open={deleteConfirmOpen} onOpenChange={setDeleteConfirmOpen}>
|
|
293
|
+
<DialogContent className="max-w-sm! gap-5">
|
|
294
|
+
<DialogHeader>
|
|
295
|
+
<DialogTitle className="paragraph-large-semibold text-gray-950">
|
|
296
|
+
{isOwner ? 'Excluir conta' : 'Excluir usuário'}
|
|
297
|
+
</DialogTitle>
|
|
298
|
+
</DialogHeader>
|
|
299
|
+
<p className="paragraph-small-regular text-gray-600">
|
|
300
|
+
{isOwner
|
|
301
|
+
? 'Tem certeza que deseja excluir sua conta? Todos os dados serão apagados permanentemente e essa ação não pode ser desfeita.'
|
|
302
|
+
: 'Tem certeza que deseja excluir seu usuário? Você perderá acesso a esta conta permanentemente.'}
|
|
303
|
+
</p>
|
|
304
|
+
<div className="flex items-center gap-3 justify-end">
|
|
305
|
+
<Button
|
|
306
|
+
type="button"
|
|
307
|
+
variant="secondary"
|
|
308
|
+
className="h-10!"
|
|
309
|
+
disabled={isDeleting}
|
|
310
|
+
onClick={() => setDeleteConfirmOpen(false)}
|
|
311
|
+
>
|
|
312
|
+
Cancelar
|
|
313
|
+
</Button>
|
|
314
|
+
<Button
|
|
315
|
+
type="button"
|
|
316
|
+
className="h-10! bg-red-600 hover:bg-red-700 text-white border-0!"
|
|
317
|
+
disabled={isDeleting}
|
|
318
|
+
onClick={handleDelete}
|
|
319
|
+
>
|
|
320
|
+
{isDeleting ? 'Excluindo...' : 'Confirmar exclusão'}
|
|
321
|
+
</Button>
|
|
322
|
+
</div>
|
|
323
|
+
</DialogContent>
|
|
324
|
+
</Dialog>
|
|
325
|
+
</>
|
|
326
|
+
);
|
|
327
|
+
}
|