Lage.tech

BotmationNotes
moon indicating dark mode
sun indicating light mode

State

State management techniques

Context

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 };