UNPKG

devegram-vuex-ajax-manager

Version:

Devegram Vuex Ajax Manager is package for managing ajax requests via a scalable simple structure, it handles different outgoing sources, auth token, api version, and more.

232 lines (208 loc) 6.42 kB
import axios from 'axios'; export const dispatch = (ctx, api, success = null, error = null) => { if (!api.hasOwnProperty('service')) api.service = ctx.state.service return new Promise((resolve, reject) => { ctx.dispatch('ajaxManager/api', api, { root: true }).then(r => { if (typeof success === 'function') resolve(success(r, ctx)) else resolve(r); }).catch(e => { if (typeof error === 'function') reject(error(e, ctx)) else reject(e); }); }) } export const ajax = (api, success = null, error = null) => { return new Promise((resolve, reject) => { $store.dispatch('ajaxManager/api', api, { root: true }).then(r => { if (typeof success === 'function') resolve(success(r)) else resolve(r); }).catch(e => { if (typeof error === 'function') reject(error(e)) else reject(e); }); }) } const ajaxManager = { namespaced: true, state: { token: null, services: { github: { url: 'https://github.com', port: '', apiVer: '', token: '' } }, defaultHeaders: { 'accept': 'application/json', 'content-type': 'application/json' }, loadingRequests: 0, debug: false, errorHandler: (error, reject, params) => { if (ajaxManager.debug) console.log('ajax manager Error Handler', error) if (!error.response) return //let errorCode = error.response.status let data = error.response.data if (data && data.hasOwnProperty('@alert')) { let alert = data['@alert'] $services['alert'][alert.type](alert.title, alert.text) } if (data && data.message) $services['toast']['danger'](data.message) if (data && data.hasOwnProperty('@toast')) { let toast = data['@toast'] $services['toast'][toast.type](toast.title) } if (params.hasOwnProperty('onError')) { params.onError(error, params) } else { reject(error); } }, successHandler: null, finallyHandler: null, }, mutations: { SET_SERVICE (state, services) { if (services.constructor !== Array) { services = [services] } services.forEach((service) => { let c = service.config state.services[service.name] = {...c} state.services[service.name].path = c.url + (c.port? ':' + c.port : '') + (c.apiVer? '/' + c.apiVer : '') }) }, SET_ERROR_HANDLER (state, func) { state.errorHandler = func }, SET_SUCCESS_HANDLER (state, func) { state.successHandler = func }, SET_FINALLY_HANDLER (state, func) { state.finallyHandler = func }, SET_DEBUG (state, status) { state.debug = status }, SET_TOKEN (state, params) { state.token = params.token localStorage.setItem('ajax_manager_token', params.token) }, LOADER_INCREMENT (state, params) { state.loadingRequests++; }, LOADER_DECREMENT (state, params) { state.loadingRequests--; }, SET_DEFAULT_HEADERS (state, headers) { state.defaultHeaders = headers } }, actions: { setService ({ commit }, params) { commit('SET_SERVICE', params) }, setErrorHandler ({ commit }, func) { commit('SET_ERROR_HANDLER', func) }, setSuccessHandler ({ commit }, func) { commit('SET_SUCCESS_HANDLER', func) }, setFinallyHandler ({ commit }, func) { commit('SET_FINALLY_HANDLER', func) }, setDebug ({ commit }, status) { commit('SET_DEBUG', status) }, setToken ({ commit }, params) { commit('SET_TOKEN', params) }, loaderIncrement ({ commit }, params) { commit('LOADER_INCREMENT', params) }, loaderDecrement ({ commit }, params) { commit('LOADER_DECREMENT', params) }, setDefaultHeaders ({ commit }, headers) { commit('SET_DEFAULT_HEADERS', headers) }, api ({state, dispatch}, params) { let url = params.url let headers = params.headers || {}; let service = false if (state.services.hasOwnProperty(params.service)) { service = state.services[params.service]; url = service.path + url } if (!params.hasOwnProperty('noDefaultHeaders')) { headers = { ...headers, ...state.defaultHeaders } } if (!params.hasOwnProperty('noToken') && !params.hasOwnProperty('noService')) { let token = null if (params.token) { token = params.token } else if (service.token) { token = params.token } else { token = state.token if (!token) { token = localStorage.getItem('ajax_manager_token') state.token = token } } headers.Authorization = 'Bearer ' + token } let crossDomain = true if (params.hasOwnProperty('crossDomain')) { crossDomain = params.crossDomain } let timeout = 300000 if (params.hasOwnProperty('timeout')) { timeout = params.timeout } const request = { method: params.verb, url, data: params.data, headers: headers, crossDomain: crossDomain, timeout: timeout } if (params.responseType) { request.responseType = params.responseType; } let isThereloadingScreenProp = params.hasOwnProperty('noLoadingScreen') if (!isThereloadingScreenProp) params.noLoadingScreen = true let loadingScreenPropValue = !params.noLoadingScreen if (loadingScreenPropValue) { dispatch('loaderIncrement'); } return new Promise((resolve, reject) => { axios(request).then(response => { if (typeof state.successHandler === 'function') state.successHandler(response, params) resolve(response); }, error => { state.errorHandler(error, reject, params) }).finally(() => { if (loadingScreenPropValue) { dispatch('loaderDecrement') } }) }) } } } export default ajaxManager