getQuery(ajaxOption, changeOption, appDispatch) {
if (typeof changeOption === 'function') {
appDispatch = changeOption;
changeOption = {};
}
if (Array.isArray(changeOption)) {
changeOption = {
changes: changeOption
}
}
let actionReducer;
const opt = Object.assign({}, ajaxOption, changeOption);
if (!opt.operate) {
opt.operate = opt.name || cuid()
}
if (opt.uri) {
actionReducer = this.createCrudFor(opt);
} else if (typeof opt.request === 'function') {
actionReducer = (dispatch, extraOption = {}) => {
const processData = extraOption.processData || opt.processData;
const suppressGlobalProgress = extraOption.suppressGlobalProgress || opt.suppressGlobalProgress;
const suppressGlobalErrorNotification = extraOption.suppressGlobalErrorNotification || opt.suppressGlobalErrorNotification;
const actionOption = {
suppressGlobalErrorNotification: suppressGlobalErrorNotification,
suppressGlobalProgress: suppressGlobalProgress
};
const promise = opt.request(opt.params || opt.body, {
dispatch: dispatch,
processData: processData,
action: actionOption,
changes: opt.changes,
callback: extraOption.callback,
errorNotification: extraOption.errorNotification
});
promise.fromSubscribe = (callback) => {
if (callback) {
promise.then(res => {
callback(null, res);
}, callback);
}
return promise;
}
return promise;
}
} else if (opt.response !== undefined) {
const operate = opt.operate;
const ucOperate = ucfirst(operate);
const needToOperate = operate && (opt.change || opt.changes);
actionReducer = (dispatch, extraOption = {}) => {
const processData = extraOption.processData || opt.processData || BaseModel.processData;
const suppressGlobalProgress = extraOption.suppressGlobalProgress || opt.suppressGlobalProgress;
const suppressGlobalErrorNotification = extraOption.suppressGlobalErrorNotification || opt.suppressGlobalErrorNotification;
needToOperate && this.createActionCreator([], [this.createActionName(ucOperate)]);
const payloadOption = {
name: opt.name || operate,
params: opt.params || opt.body,
change: opt.change,
changes: opt.changes
};
const actionOption = {
suppressGlobalErrorNotification: suppressGlobalErrorNotification,
suppressGlobalProgress: suppressGlobalProgress
};
const _isPromise = isPromise(opt.response);
const promise = _isPromise
? opt.response
: Promise.resolve(opt.response);
if (needToOperate) {
if (!_isPromise) {
const data = processData(opt.response);
dispatch && dispatch(this.createAction(this.createActionName(ucOperate, 'action'), data, Object.assign(payloadOption, {data: opt.response}), actionOption));
}
this.emit('before' + ucOperate, opt)
}
promise.fromSubscribe = (callback) => {
if (callback) {
promise.then(res => {
callback(null, res);
}, callback);
}
return promise;
}
promise.fromSubscribe(extraOption.callback);
promise.then(res => {
const data = processData(res);
if (needToOperate) {
if (_isPromise) {
dispatch && dispatch(this.createAction(this.createActionName(ucOperate, 'action'), data, Object.assign(payloadOption, {data: opt.response}), actionOption));
}
this.emit('after' + ucOperate, null, data);
}
return data;
});
return promise;
}
}
if (appDispatch) {
return actionReducer(appDispatch);
} else {
return actionReducer;
}
}
createCrudFor(opt) {
const operate = opt.operate;
const ucOperate = ucfirst(operate);
const needToOperate = operate && (opt.change || opt.changes);
needToOperate && this.createActionCreator([this.createActionName(ucOperate)], []);
const actionReducer = (dispatch, extraOption = {}) => {
const processData = extraOption.processData || opt.processData || BaseModel.processData;
const suppressGlobalProgress = extraOption.suppressGlobalProgress || opt.suppressGlobalProgress;
const suppressGlobalErrorNotification = extraOption.suppressGlobalErrorNotification || opt.suppressGlobalErrorNotification;
const payloadOption = {
name: opt.name || operate,
params: opt.params || opt.body,
change: opt.change,
changes: opt.changes
};
const actionOption = {
suppressGlobalErrorNotification: suppressGlobalErrorNotification,
suppressGlobalProgress: suppressGlobalProgress
};
if (needToOperate) {
dispatch && dispatch(this.createAction(this.createActionName(ucOperate, 'start'), opt.initialValue, Object.assign(payloadOption, {data: promise}), actionOption));
this.emit('before' + ucOperate, opt);
}
const promise = Api({url: opt.uri, method: opt.method, data: opt.body, headers: opt.headers, errorNotification: opt.errorNotification});
promise.fromSubscribe = (callback) => {
if (callback) {
promise.then(res => {
callback(null, res);
}, callback);
}
return promise;
}
promise.fromSubscribe(extraOption.callback);
promise.then((response) => {
let data = processData(response, dispatch);
if (needToOperate) {
dispatch && dispatch(this.createAction(this.createActionName(ucOperate, 'success'), data, Object.assign(payloadOption, {data: response}), actionOption));
this.emit('after' + ucOperate, null, data);
}
return data;
}, (err) => {
if (needToOperate) {
dispatch && dispatch(this.createAction(this.createActionName(ucOperate, 'error'), null, Object.assign(payloadOption, {data: err}), Object.assign(actionOption, {error: err})));
this.emit('after' + ucOperate, err);
}
return err;
});
return promise;
}
return actionReducer;
}
pollingQuery(ajaxOption, changeOption, appDispatch) {
const actionReducer = (dispatch, extraOption = {}) => {
const poller = new Poller({
catchError: ajaxOption.catchError,
smart: ajaxOption.smart,
delay: ajaxOption.delay,
action: () => {
return this.getQuery(ajaxOption, changeOption)(dispatch, extraOption);
}
});
this
.$pollers_
.push(poller);
return poller;
}
if (appDispatch) {
return actionReducer(appDispatch);
} else {
return actionReducer;
}
}
clearPolling() {
this
.$pollers_
.forEach(poller => {
poller.remove();
});
}
destroy() {
this.removeAllListeners();
this.clearPolling();
}
}