import validateUsernameRequest from '@/requests/users/profile/validateUsernameRequest'; import { BaseCreateUserSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; import { Switch } from '@headlessui/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Dispatch, FC, useContext } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import UserContext from '@/contexts/UserContext'; import createErrorToast from '@/util/createErrorToast'; import { toast } from 'react-hot-toast'; import { AccountPageAction, AccountPageState } from '@/reducers/accountPageReducer'; import FormError from '../ui/forms/FormError'; import FormInfo from '../ui/forms/FormInfo'; import FormLabel from '../ui/forms/FormLabel'; import FormTextInput from '../ui/forms/FormTextInput'; import { sendEditUserRequest, validateEmailRequest } from '@/requests/users/auth'; interface AccountInfoProps { pageState: AccountPageState; dispatch: Dispatch; } const AccountInfo: FC = ({ pageState, dispatch }) => { const { user, mutate } = useContext(UserContext); const EditUserSchema = BaseCreateUserSchema.pick({ username: true, email: true, firstName: true, lastName: true, }).extend({ email: z .string() .email({ message: 'Email must be a valid email address.' }) .refine( async (email) => { if (user!.email === email) return true; return validateEmailRequest({ email }); }, { message: 'Email is already taken.' }, ), username: z .string() .min(1, { message: 'Username must not be empty.' }) .max(20, { message: 'Username must be less than 20 characters.' }) .refine( async (username) => { if (user!.username === username) return true; return validateUsernameRequest(username); }, { message: 'Username is already taken.' }, ), }); const onSubmit = async (data: z.infer) => { const loadingToast = toast.loading('Submitting edits...'); try { await sendEditUserRequest({ user: user!, data }); toast.remove(loadingToast); toast.success('Edits submitted successfully.'); dispatch({ type: 'CLOSE_ALL' }); await mutate!(); } catch (error) { dispatch({ type: 'CLOSE_ALL' }); toast.remove(loadingToast); createErrorToast(error); await mutate!(); } }; const { register, handleSubmit, formState, reset } = useForm< z.infer >({ resolver: zodResolver(EditUserSchema), }); return (

Edit Your Account Info

Update your personal account information.

{ dispatch({ type: 'TOGGLE_ACCOUNT_INFO_VISIBILITY' }); await mutate!(); reset({ username: user!.username, email: user!.email, firstName: user!.firstName, lastName: user!.lastName, }); }} />
{pageState.accountInfoOpen && (
Username {formState.errors.username?.message} Email {formState.errors.email?.message}
First Name {formState.errors.firstName?.message}
Last Name {formState.errors.lastName?.message}
)}
); }; export default AccountInfo;