State management techniques
import React from "react";import getUser from "./userApi";import history from "./history";const AuthContext = React.createContext();function reducer(currentState, newState) {return { ...currentState, ...newState };}function useAuth() {const context = React.useContext(AuthContext);if (!context) throw new Error("useAuth must be used in AuthProvider");return context;}function AuthProvider(props) {const [state, setState] = React.useReducer(reducer, {isLogged: false,isLogging: false,user: null,error: null});async function doLogin(user) {try {setState({ isLogging: true });const result = await getUser(user);setState({user: result,isLogging: false,isLogged: true,error: null});} catch (error) {setState({ isLogging: false, error });}}function doLogout() {setState({ isLogged: false, user: null });history.push("/");}const value = React.useMemo(() => ({ state, setState, doLogin, doLogout }), [state]);return <AuthContext.Provider value={value} {...props} />;}export { AuthProvider, useAuth };