1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00

fixed error handling on user form

This commit is contained in:
Fedor Katurov 2022-09-13 18:29:18 +07:00
parent 216cec0bd1
commit 35fd30daab
4 changed files with 32 additions and 26 deletions

View file

@ -16,9 +16,6 @@ import styles from './styles.module.scss';
interface UserSettingsViewProps {}
const getError = (error?: string) =>
error && has(error, ERROR_LITERAL) ? error : undefined;
const UserSettingsView: FC<UserSettingsViewProps> = () => {
const { values, handleChange, errors } = useSettings();
const { isPhone } = useWindowSize();
@ -41,7 +38,7 @@ const UserSettingsView: FC<UserSettingsViewProps> = () => {
value={values.fullname}
handler={handleChange('fullname')}
title="Полное имя"
error={getError(errors.fullname)}
error={errors.fullname}
/>
<Textarea
@ -79,14 +76,14 @@ const UserSettingsView: FC<UserSettingsViewProps> = () => {
value={values.username}
handler={handleChange('username')}
title="Логин"
error={getError(errors.username)}
error={errors.username}
/>
<InputText
value={values.email}
handler={handleChange('email')}
title="E-mail"
error={getError(errors.email)}
error={errors.email}
/>
<InputText
@ -94,7 +91,7 @@ const UserSettingsView: FC<UserSettingsViewProps> = () => {
handler={handleChange('newPassword')}
title="Новый пароль"
type="password"
error={getError(errors.newPassword)}
error={errors.newPassword}
/>
<InputText
@ -102,7 +99,7 @@ const UserSettingsView: FC<UserSettingsViewProps> = () => {
handler={handleChange('password')}
title="Старый пароль"
type="password"
error={getError(errors.password)}
error={errors.password}
/>
<div className={styles.small}>

View file

@ -9,7 +9,10 @@ import { showErrorToast } from '~/utils/errors/showToast';
export const usePatchUser = () => {
const { update } = useUser();
const { uploadFile } = useUploader(UploadSubject.Avatar, UploadTarget.Profiles);
const { uploadFile } = useUploader(
UploadSubject.Avatar,
UploadTarget.Profiles,
);
const save = useCallback(
async (user: Partial<ApiUpdateUserRequest['user']>) => {
@ -17,7 +20,7 @@ export const usePatchUser = () => {
await update(result.user);
return result.user;
},
[update]
[update],
);
const updatePhoto = useCallback(
@ -29,7 +32,7 @@ export const usePatchUser = () => {
showErrorToast(error);
}
},
[uploadFile, save]
[uploadFile, save],
);
return { updatePhoto, save };

View file

@ -1,6 +1,8 @@
import { hasPath, path } from '~/utils/ramda';
export const getValidationErrors = (error: unknown): Record<string, string> | undefined => {
export const getValidationErrors = (
error: unknown,
): Record<string, string> | undefined => {
if (hasPath(['response', 'data', 'errors'], error)) {
return path(['response', 'data', 'errors'], error);
}

View file

@ -1,6 +1,11 @@
import { FC, PropsWithChildren, useCallback, useRef } from 'react';
import { FormikConfig, useFormik, FormikProvider, useFormikContext } from 'formik';
import {
FormikConfig,
useFormik,
FormikProvider,
useFormikContext,
} from 'formik';
import { Asserts, object, string } from 'yup';
import { ERRORS } from '~/constants/errors';
@ -13,15 +18,11 @@ import { showErrorToast } from '~/utils/errors/showToast';
import { showToastSuccess } from '~/utils/toast';
const validationSchema = object({
username: string()
.default('')
.required(ERRORS.REQUIRED),
username: string().default('').required(ERRORS.REQUIRED),
fullname: string().default(''),
newPassword: string().optional(),
description: string().default(''),
email: string()
.default('')
.email(ERRORS.NOT_AN_EMAIL),
email: string().default('').email(ERRORS.NOT_AN_EMAIL),
password: string().optional(),
});
@ -29,7 +30,7 @@ export type ProfileFormData = Asserts<typeof validationSchema>;
export const useSettingsForm = (
values: ProfileFormData,
submitter: (data: ProfileFormData) => Promise<IUser>
submitter: (data: ProfileFormData) => Promise<IUser>,
) => {
const initialValues = useRef(values).current;
@ -39,7 +40,9 @@ export const useSettingsForm = (
const fields = {
...values,
password: values.password?.length ? values.password : undefined,
new_password: values.newPassword?.length ? values.newPassword : undefined,
new_password: values.newPassword?.length
? values.newPassword
: undefined,
};
const result = await submitter(fields);
@ -51,11 +54,12 @@ export const useSettingsForm = (
const validationErrors = getValidationErrors(error);
if (validationErrors) {
console.log(validationErrors);
setErrors(validationErrors);
}
}
},
[submitter]
[submitter],
);
return useFormik({
@ -71,10 +75,10 @@ export const SettingsProvider: FC<PropsWithChildren<{}>> = ({ children }) => {
const formik = useSettingsForm(
{ ...user, password: '', newPassword: '' },
save
save,
);
return <FormikProvider value={formik}>{children}</FormikProvider>
}
return <FormikProvider value={formik}>{children}</FormikProvider>;
};
export const useSettings = () => useFormikContext<ProfileFormData>();