Skip to content

Instantly share code, notes, and snippets.

@peerhenry
Created February 22, 2019 12:43
Show Gist options
  • Select an option

  • Save peerhenry/34d306386f29745915daf3cec6200bc4 to your computer and use it in GitHub Desktop.

Select an option

Save peerhenry/34d306386f29745915daf3cec6200bc4 to your computer and use it in GitHub Desktop.
infi vuex blogpost refactor 3
setupApiCall(
customerModule,
'fetchCustomer',
fetchCustomerUrl,
axios.get,
{
formatUrl: (url, payload) => (fetchCustomerUrl + '?ID=' + payload.customerId),
handleResponse: (context, response) => { context.commit('setCustomer', response.data) }
}
)
setupApiCall(
customerModule,
'updateCustomer',
updateCustomerUrl,
axios.post
)
const validOption = (options, key) => options && options[key] && typeof options[key] === 'function'
const formatOptions = options => {
let result = {}
result.formatUrl = validOption(options, 'formatUrl') ? options.formatUrl : (context, payload, url) => url
result.handleResponse = validOption(options, 'handleResponse') ? options.handleResponse : _ => _
return result
}
function setupApiCall(vuexModule, name, url, call, argOptions) {
const options = formatOptions(argOptions)
const pendingKey = name + 'Pending'
const errorKey = name + 'Error'
const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1)
const pendingMutationKey = 'set' + capitalizedName + 'Pending'
const errorMutationKey = 'set' + capitalizedName + 'Error'
vuexModule.state[pendingKey] = false
vuexModule.state[errorKey] = undefined
vuexModule.getters[pendingKey] = (state) => state[pendingKey]
vuexModule.getters[errorKey] = (state) => state[errorKey]
vuexModule.mutations[pendingMutationKey] = (state, pending) => state[pendingKey] = pending
vuexModule.mutations[errorMutationKey] = (state, error) => state[errorKey] = error
vuexModule.actions[name] = (context, payload) => {
context.commit(pendingMutationKey, true)
context.commit(errorMutationKey, undefined)
const formattedUrl = options.formatUrl(url, payload)
call(formattedUrl, payload).then(
(response) => {
context.commit(pendingMutationKey, false)
options.handleResponse(context, response)
},
(error) => {
context.commit(pendingMutationKey, false)
context.commit(errorMutationKey, error)
}
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment