Skip to content

Instantly share code, notes, and snippets.

@MosesEsan
Last active April 8, 2021 16:50
Show Gist options
  • Save MosesEsan/2043cd73c7347d9f3926c66d8697a1dc to your computer and use it in GitHub Desktop.
Save MosesEsan/2043cd73c7347d9f3926c66d8697a1dc to your computer and use it in GitHub Desktop.
Trade Journal App Provider File
import React, {useMemo, useContext, useReducer, createContext} from 'react';
//IMPORT REDUCER, INITIAL STATE AND ACTION TYPES
import crudReducer, {CRUD_REQUEST, CRUD_STATE, FETCH_REQUEST, FETCH_STATE, initialState} from "./reducer"
// CONTEXT ===================================
const HomeContext = createContext();
function HomeProvider(props) {
const [state, dispatch] = useReducer(crudReducer, initialState || {});
const fetch = async (apiRequest, refresh = false, dataKey = "data") => {
let fetchState = refresh ? FETCH_STATE.REFRESH : FETCH_STATE.INITIAL;
dispatch({type: FETCH_REQUEST, fetchState});
try {
let response = await apiRequest();
let data = response[dataKey];
dispatch({type: FETCH_REQUEST, fetchState: FETCH_STATE.SUCCESS, data: data})
} catch (error) {
dispatch({type: FETCH_REQUEST, fetchState: FETCH_STATE.ERROR, error})
}
};
//2 - CRUD Operations
const read = (id) => {
let index = state.data.findIndex((obj) => obj.id === id);
return (index !== -1) ? state.data[index]: null;
};
const crud = {
create: (data) => dispatch({type: CRUD_REQUEST, crudState: CRUD_STATE.CREATE, data}),
read:read,
update: (data) => dispatch({type: CRUD_REQUEST, crudState: CRUD_STATE.UPDATE, data}),
delete: (id) => dispatch({type: CRUD_REQUEST, crudState: CRUD_STATE.DELETE, id:id})
};
const value = useMemo(() => {
return {state, dispatch, fetch, crud};
}, [state]);
return (
<HomeContext.Provider value={value}>
{props.children}
</HomeContext.Provider>
);
}
const useHome = () => useContext(HomeContext);
export { HomeContext, useHome }
export default HomeProvider;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment