Skip to content

Instantly share code, notes, and snippets.

@MosesEsan
Last active April 8, 2021 16:50
Show Gist options
  • Save MosesEsan/7d080b09486cfba8e5e44579946505fe to your computer and use it in GitHub Desktop.
Save MosesEsan/7d080b09486cfba8e5e44579946505fe to your computer and use it in GitHub Desktop.
Trade Journal App Reducer
//ACTION TYPES
export const FETCH_REQUEST = 'FETCH_REQUEST';
export const CRUD_REQUEST = 'CRUD_REQUEST';
//FETCH REQUEST STATES
export const FETCH_STATE = {
INITIAL: 'INITIAL',
REFRESH: 'REFRESH',
ERROR: 'ERROR',
SUCCESS: 'SUCCESS'
};
export const CRUD_STATE = {
CREATE: 'CREATE',
UPDATE: 'UPDATE',
DELETE: 'DELETE'
};
//====
//INITIAL STATE
export const initialState = {
isFetching: true,
isRefreshing: false,
error: null,
data: []
};
//HANDLERS
export default function crudReducer (state = initialState, action) {
switch (action.type) {
case FETCH_REQUEST:{
let [...data] = state.data;
let fetchState = action.fetchState;
//REQUEST STATE
let isFetching = (fetchState === FETCH_STATE.INITIAL);
let isRefreshing = (fetchState === FETCH_STATE.REFRESH);
let requestState = {isFetching, isRefreshing};
//DATA STATE
let newState = {};
if (fetchState === FETCH_STATE.ERROR) newState = {error: action.error};
else if (fetchState === FETCH_STATE.SUCCESS) newState = {data: action.data, error:null};
return {...state, ...requestState, ...newState};
}
case CRUD_REQUEST:{
let [...data] = state.data;
let newData = action.data || null;
let crudState = action.crudState;
if (crudState === CRUD_STATE.CREATE) data.unshift(newData);
else if (crudState === CRUD_STATE.UPDATE) {
const index = data.findIndex((obj) => obj.id === newData.id);
if (index !== -1) data[index] = {...data[index], ...newData};
}else if (crudState === CRUD_STATE.DELETE) {
let id = action.id;
data = data.filter((obj) => obj.id !== id);
}
return {...state, data};
}
default:
return state;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment