1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-25 12:56:41 +07:00
vault-frontend/src/hooks/auth/useLoginForm.ts
2022-01-19 12:30:04 +07:00

47 lines
1.2 KiB
TypeScript

import { useCallback } from 'react';
import { FormikConfig, useFormik } from 'formik';
import { Asserts, object, string } from 'yup';
import { ERRORS } from '~/constants/errors';
import { IUser } from '~/types/auth';
import { getValidationErrors } from '~/utils/errors/getValidationErrors';
import { showErrorToast } from '~/utils/errors/showToast';
const validationSchema = object({
username: string().required(ERRORS.REQUIRED),
password: string().required(ERRORS.REQUIRED),
});
export type LoginFormData = Asserts<typeof validationSchema>;
export const useLoginForm = (
fetcher: (username: string, password: string) => Promise<IUser>,
onSuccess: () => void
) => {
const onSubmit = useCallback<FormikConfig<LoginFormData>['onSubmit']>(
async (values, { setErrors }) => {
try {
await fetcher(values.username, values.password);
onSuccess();
} catch (error) {
showErrorToast(error);
const validationErrors = getValidationErrors(error);
if (validationErrors) {
setErrors(validationErrors);
}
}
},
[fetcher, onSuccess]
);
return useFormik({
validationSchema,
onSubmit,
initialValues: {
username: '',
password: '',
},
});
};