Я не думаю, что вы должны использовать ошибку Formik для вашей ошибки в базе данных.Ошибки Formik предназначены для проверки входных данных формы.Чтобы сохранить и ссылаться на ошибку API, я бы useState
.
ОБНОВЛЕНИЕ: вместо useState
, вы можете использовать Formik's status
object. Обработка ошибок API - это пример, который он приводит для status
.
Я думаю, проблема в том, что в Formik name
означает ссылку на имя входа.Вместо этого вы обязательно добавляете новое свойство name к объекту errors
, используя setFieldError
, но firebaseErrorMessage
не является полем в вашей форме.(Поделитесь своим initialValues
объектом, чтобы проверить это.)
Имеет ли это смысл?Одна досадная часть этого заключается в том, что, возможно, существует некоторая стилизация, связанная с <ErrorMessage>
, которую вы не можете использовать напрямую.Но, на мой взгляд, вероятно, более важно правильно структурировать вашу систему, и тогда вы сможете имитировать стили по мере необходимости.
Вот мое предложение кода:
const RenderForm = ({ isSubmitting, isValid, status }) => (
<Form>
<h3>Sign Up</h3>
<Email name="email" />
<Password name="password" />
<Button disabled={!isValid || isSubmitting} type="submit">
Submit
</Button>
{status.firebaseErrorMessage && <p>{status.firebaseErrorMessage}</p>}
</Form>
);
export const LoginForm = () => {
async function authenticateUser(values, setStatus, setSubmitting) {
const { email, password } = values;
setSubmitting(true);
try {
await firebase.login(email, password);
navigate("/", { replace: true });
} catch (error) {
console.log("Authentication Error: ", error);
setStatus({
firebaseErrorMessage: error.message
});
} finally {
setSubmitting(false);
}
}
return (
<>
<h1>Form</h1>
<Formik
render={props => <RenderForm {...props} />}
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={async (values, { setStatus, setSubmitting, resetForm }) => {
await authenticateUser(values, setStatus, setSubmitting);
resetForm();
}}
/>
</>
);
};