Как я могу изменить свой дескриптор изменить и отправить на редуктор? - PullRequest
1 голос
/ 03 марта 2020

Я пытался перевести свою форму проверки подлинности в редуктор в течение 3 дней, и я искал и читал все, что мог найти, и нашел частичный ответ для изменения дескриптора, но не могу понять, как сделать функцию отправки дескриптора, Я видел, как другие сделали это, но ни один из них не похож на мой, пожалуйста, подскажите мне, как найти мое решение, вот мой код до редукторов:

import React, {createContext, useState} from 'react';
import axios from "axios";

export const SignInContext = createContext();

const SignInContextProvider = (props) => {

    const [formData, setFormData] = useState({

        email: '',
        password: '',

        error: '',
        success: false
    })

    const {email, password, error, success} = formData;


    const clickSubmit = async event => {
        event.preventDefault()

        setFormData({...formData})

        await axios.interceptors.response.use((response) => {
            // do something with the response data
            // console.log('Response was received');

            return response;
        }, error => {
            // handle the response error
            // console.log(error.response.data.message)
            setFormData({...formData, error: error.response.data.message, success: false})
            return Promise.reject(error.response.data.message);
        });


        await axios({
            method: 'post',
            url: 'http://localhost:5001/api/user/signin',
            data: {email, password}
        })
            .then((response) => {
                    console.log(response);
                    if (response.data.status===200) {
                        setFormData({...formData, success: response.data.message});
                        localStorage.setItem('myData', response.data.token);
                        localStorage.setItem('type', response.data.type);
                    }
                    else {
                        setFormData({...formData, error: response.data.message, success: false});
                    }
                },
                (error) => (
                    console.log(error),
                        setFormData({...formData, error: error, success: false})
                ));

    }

    const handleChange = name => event => {
        setFormData({...formData, error: false, [name]: event.target.value})
    };

    const showError = () => (
        <div>
            <div className="alert alert-danger text-center" style={{display: error ? '' : 'none'}}>
                {error}
            </div>
        </div>
    );

    const showSuccess = () => (
        <div className="alert alert-success text-center" style={{display: formData.success ? '' : 'none'}}>
            {success}
        </div>
    );

    return (
        <SignInContext.Provider value={{ ...formData, clickSubmit, handleChange, showError, showSuccess }}>
            {props.children}
        </SignInContext.Provider>
    );
};

export default SignInContextProvider;

это редуктор изменения ручки:

export const signInReducer = (state, {field, value}) => {
    return [...state, {
        [field]: value
    }]
}

вот мой метод смены рукоятки для редуктора:

const initialState = {

    email: '',
    password: '',

    error: '',
    success: false
};

const {email, password, error, success} = signInData;

const handleChange = e => {
    dispatch({ field: e.target.name, value: e.target.value })
}

Я не ищу решения для раздачи, но я устал от поиска пути в течение 3 дней, мне нужно идите дальше, пожалуйста, ведите меня

1 Ответ

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

Благодаря @ Тиму Ермилову

import React, { createContext, useReducer } from 'react';
import axios from 'axios';

export const SignInContext = createContext();

const initialState = {
  formData: {
    email: '',
    password: '',
  },
  error: '',
  success: false
};

function reducer(state, action) {
  switch (action.type) {
    case 'save':
      return { ...action.payload };
    case 'error':
      // TODO: do something with error
      return { ...action.payload };
    case 'success':
        return { ...action.payload };
    case 'change':
      return { ...state, formData: action.payload.formData };
    default:
      throw new Error();
  }
}

const SignInContextProvider = props => {
  const [state, dispatch] = useReducer(reducer, initialState);

  const { email, password, error, success } = state;

  const clickSubmit = async event => {
    event.preventDefault();

    dispatch({ type: 'save', payload: formData });

    await axios.interceptors.response.use(
      response => {
        // do something with the response data
        // console.log('Response was received');

        return response;
      },
      error => {
        // handle the response error
        // console.log(error.response.data.message)
        dispatch({
          type: 'error',
          payload: {
            formData,
            error: error.response.data.message,
            success: false
          }
        });
        return Promise.reject(error.response.data.message);
      }
    );

    await axios({
      method: 'post',
      url: 'http://localhost:5001/api/user/signin',
      data: { email, password }
    }).then(
      response => {
        console.log(response);
        if (response.data.status === 200) {
          dispatch({type: 'success', payload: {...formData, success: response.data.message }});
          localStorage.setItem('myData', response.data.token);
          localStorage.setItem('type', response.data.type);
        } else {
          dispatch({
            type: 'error',
            payload: {
            formData,
            error: response.data.message,
            success: false
            }
          });
        }
      },
      error => (
        console.log(error),
        dispatch({type: 'error', payload: { formData, error: error, success: false } })
      )
    );
  };

  const handleChange = name => event => {
    dispatch({type: 'change', payload: formData }});
  };

  const showError = () => (
    <div>
      <div
        className="alert alert-danger text-center"
        style={{ display: error ? '' : 'none' }}
      >
        {error}
      </div>
    </div>
  );

  const showSuccess = () => (
    <div
      className="alert alert-success text-center"
      style={{ display: formData.success ? '' : 'none' }}
    >
      {success}
    </div>
  );

  return (
    <SignInContext.Provider
      value={{ ...formData, clickSubmit, handleChange, showError, showSuccess }}
    >
      {props.children}
    </SignInContext.Provider>
  );
};

export default SignInContextProvider;
...