Forked from gilankpam/redux-request-success-failure.js
Created
February 24, 2019 17:27
-
-
Save princeppy/db7d64fd67dd4663e45bdf21c5147cf4 to your computer and use it in GitHub Desktop.
redux-request-success-failure.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function reduxHelper (actionName, fn) { | |
if (typeof actionName !== 'string') { | |
throw new Error('actionName must be a string') | |
} | |
if (typeof fn !== 'function') { | |
throw new Error('fn must be a function') | |
} | |
const actionNameUpper = actionName.toUpperCase() | |
const actionRequest = actionNameUpper + '_REQUEST' | |
const actionSuccess = actionNameUpper + '_SUCCESS' | |
const actionFailure = actionNameUpper + '_FAILURE' | |
const initialState = { | |
data: null, | |
loading: false, | |
error: null | |
} | |
const reducer = (state = initialState, action) => { | |
switch (action.type) { | |
case actionRequest: | |
return { | |
...state, | |
loading: true | |
} | |
case actionSuccess: | |
return { | |
...state, | |
loading: false, | |
data: action.data !== undefined ? action.data : null | |
} | |
case actionFailure: | |
return { | |
...state, | |
loading: false, | |
error: action.error | |
} | |
default: | |
return state | |
} | |
} | |
// we are not using arrow function, because there no arguments binding | |
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions | |
const action = function () { | |
const args = arguments | |
return dispatch => { | |
dispatch({ | |
type: actionRequest | |
}) | |
try { | |
const result = fn.apply(null, args) | |
// It's a promise | |
if (typeof result.then === 'function') { | |
result.then(data => dispatch({ | |
type: actionSuccess, | |
data | |
})) | |
.catch(error => dispatch({ | |
type: actionFailure, | |
error | |
})) | |
} else { | |
dispatch({ | |
type: actionSuccess, | |
data: result | |
}) | |
} | |
} catch (error) { | |
dispatch({ | |
type: actionFailure, | |
error | |
}) | |
} | |
} | |
} | |
return { | |
action, | |
actionTypes: { | |
request: actionRequest, | |
success: actionSuccess, | |
failure: actionFailure | |
}, | |
reducer | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment