Как справиться с ошибкой и успешным ответом самым чистым способом? - PullRequest
0 голосов
/ 19 марта 2020

Как бы я показал ошибку ответа сервера или сообщение об успехе самым чистым способом? Прямо сейчас я использую функцию asyn c, чтобы сделать запрос ax ios, и в случае успеха / ошибки я просто обновляю локальное состояние (с реакцией-ловушкой), но я чувствую, что это "некрасиво" и я хочу, чтобы страницы были настолько чистыми, насколько это возможно, и поместил код для обработки сообщений об успехах и ошибках в запросе на обслуживание, за кулисами.

Пример:

ForgotPassword.jsx

import React, { useState } from 'react';
import Layout from '../components/core/Layout';
import axios from 'axios';
import { useForm } from 'react-hook-form';
import { Button, Form, Alert } from 'react-bootstrap';
import { regex } from '../constants';
import { isAuth } from '../helpers';
import { forgotPassword } from '../services/User';
import { Redirect } from 'react-router-dom';

const Forgot = () => {
  const {
    handleSubmit,
    register,
    errors,
    getValues,
    setError,
    setValue,
    clearError
  } = useForm({
    mode: 'onBlur'
  });

  register({ name: 'responseError' });
  register({ name: 'responseSuccess' });
  const { responseSuccess } = getValues();

  const onSubmit = async values => {
    try {
      const response = await forgotPassword(values);
      setValue([{ responseSuccess: response.data.message }]);
    // set response success msg to local state responseSuccess
    } catch (error) {
      setError('responseError', '', error);
      // set response error msg to local state responseError
    }
  };

  const forgotPasswordForm = () => (
    <>
      <Form onSubmit={handleSubmit(onSubmit)}>
        <Form.Group>
          <Form.Label>Email address</Form.Label>
          <Form.Control
            name='email'
            ref={register({
              required: true,
              pattern: {
                value: regex.email,
                message: 'Invalid email address'
              }
            })}
            type='email'
            placeholder='Enter email'
            isInvalid={errors.email}
          />
          <Form.Control.Feedback type={errors.email ? 'invalid' : 'valid'}>
            {errors.email && errors.email.message}
          </Form.Control.Feedback>
        </Form.Group>
        <Button variant='primary' type='submit'>
          Submit
        </Button>
      </Form>
      <br />
      {errors.responseError && (
        <Alert
          variant='danger'
          dismissible
          onClose={() => clearError('responseError')}>
          {errors.responseError.message}
        </Alert>
      )}
    </>
  );
  const forgotPasswordFormSuccess = () => (
    <Alert
      variant='success'
      className='mt-5'
      dismissible
      onClose={() => setValue([{ responseSuccess: '' }])}>
      {responseSuccess}
    </Alert>
  );
  if (isAuth()) return <Redirect to='/' />;
  return (
    <Layout>
      <div>
        <h1>Forgot password</h1>
        {responseSuccess ? forgotPasswordFormSuccess() : forgotPasswordForm()}
      </div>
    </Layout>
  );
};

export default Forgot;

Функция забытого пароля

export const forgotPassword = async ({ email }) => {
  return new Promise(async (resolve, reject) => {
    try {
      const response = await Axios({
        method: 'PUT',
        url: `${process.env.REACT_APP_API}/forgot-password`,
        data: { email }
      });
      resolve(response);
    } catch (error) {
      if (error.response) {
        reject(error.response && error.response.data.error);
      }
      reject('Something went wrong. please try again later.');
    }
  });
};

1 Ответ

0 голосов
/ 19 марта 2020

Надеюсь, это то, что вы хотите

export const forgotPassword = ({ email }) => {
    return new Promise((resolve, reject) => {
        axios(`${process.env.REACT_APP_API}/forgot-password`, {
            method: 'PUT',
            data: { email }
        })
        .then(res => resolve(res.data))
        .catch(err => reject(err))
    });
};

const onSubmit = values => {
    forgotPassword(values)
    .then(res => setValue([{ responseSuccess: res.message }]))
    .catch(err => setError('responseError', '', err));
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...