import { joiResolver } from '@hookform/resolvers/joi'; import { CrisisAlert, ManageAccounts } from '@mui/icons-material'; import { Button, Divider, TextField } from '@mui/material'; import Joi from 'joi'; import { useRouter } from 'next/router'; import { Trans, useTranslation } from 'next-i18next'; import { useEffect, useMemo, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useMutation } from 'react-query'; import Avatar from '@/components/shared/Avatar'; import BaseModal from '@/components/shared/BaseModal'; import { deleteAccount, updateProfile, UpdateProfileParams } from '@/services/auth'; import { ServerError } from '@/services/axios'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import { setModalState } from '@/store/modal/modalSlice'; type FormData = { name: string; email: string; }; const defaultState: FormData = { name: '', email: '', }; const schema = Joi.object({ name: Joi.string().required(), email: Joi.string() .email({ tlds: { allow: false } }) .required(), }); const UserProfileModal = () => { const router = useRouter(); const { t } = useTranslation(); const dispatch = useAppDispatch(); const [deleteText, setDeleteText] = useState(''); const isDeleteTextValid = useMemo(() => deleteText.toLowerCase() === 'delete', [deleteText]); const user = useAppSelector((state) => state.auth.user); const { open: isOpen } = useAppSelector((state) => state.modal['auth.profile']); const { mutateAsync: deleteAccountMutation } = useMutation(deleteAccount); const { mutateAsync: updateProfileMutation } = useMutation(updateProfile); const { reset, getFieldState, control, handleSubmit } = useForm({ defaultValues: defaultState, resolver: joiResolver(schema), }); useEffect(() => { if (user && !getFieldState('name').isTouched && !getFieldState('email').isTouched) { reset({ name: user.name, email: user.email }); } }, [user]); const handleClose = () => { dispatch(setModalState({ modal: 'auth.profile', state: { open: false } })); }; const handleUpdate = handleSubmit(async (data) => { handleClose(); await updateProfileMutation({ name: data.name }); }); const handleDelete = async () => { await deleteAccountMutation(); handleClose(); router.push('/'); }; return ( }>
( )} />

You can update your profile picture on{' '} Gravatar

( )} />
{t('modals.auth.profile.delete-account.heading')}

{t('modals.auth.profile.delete-account.body', { keyword: 'delete' })}

setDeleteText(e.target.value)} />
); }; export default UserProfileModal;