@aurigma/design-atoms
Version:
Design Atoms is a part of Customer's Canvas SDK which allows for manipulating individual design elements through your code.
128 lines • 5.1 kB
JavaScript
export class MultiCallRequest {
constructor(_service, _imageLoaderService) {
this._service = _service;
this._imageLoaderService = _imageLoaderService;
this._multiCallInProgress = false;
this._multiCallItems = null;
this._multiCallCallbacks = null;
this._endMultiCallPromiseFuncs = null;
this._multiCallInProgress = false;
this._multiCallItems = [];
this._multiCallCallbacks = [];
this._multiCallCounter = 0;
this._endMultiCallPromiseFuncs = [];
}
increaseCounter() {
this._multiCallCounter++;
}
decreaseCounter() {
this._multiCallCounter--;
return this._multiCallCounter;
}
enqueueEndMultiCall() {
return new Promise((resolve, reject) => this._endMultiCallPromiseFuncs.push([resolve, reject]));
}
get multiCallStarted() {
return this._multiCallCounter > 0;
}
beginMultiCall() {
this.increaseCounter();
}
endMultiCall(requestImage = true) {
if (this.decreaseCounter() > 0) {
return this.enqueueEndMultiCall();
}
if (this._multiCallItems == null || this._multiCallItems.length < 1) {
this._onMultiCallFinally();
return Promise.resolve(false);
}
const items = this._multiCallItems;
const callbacks = this._multiCallCallbacks;
const promiseFuncs = this._endMultiCallPromiseFuncs;
this._multiCallItems = [];
this._multiCallCallbacks = [];
this._endMultiCallPromiseFuncs = [];
return this._updateByMultiCall(items, callbacks, promiseFuncs, requestImage);
}
queueForMultiCall(data, success, failure) {
if (this._multiCallInProgress)
return false;
this._multiCallItems.push(data);
this._multiCallCallbacks.push([success, failure]);
return true;
}
_updateByMultiCall(items, callbacks, promiseFuncs, requestImage = true) {
this._multiCallInProgress = true;
return new Promise((resolve, reject) => {
const filteredItems = this._filter(items, callbacks);
this._updateByMultiCallRequest({ items: filteredItems.items }, response => this._onMultiCallDone(response, filteredItems.callbacks, resolve, promiseFuncs, requestImage), (error, userContext, methodName) => this._onMultiCallFailed(error, userContext, methodName, items, callbacks, reject, promiseFuncs));
});
}
_filter(items, callbacks) {
items = items.reverse();
callbacks = callbacks.reverse();
const uniqIdsIndexes = [];
const itemDataIds = [];
items = items.filter((d, index) => {
if (d.itemData == null || itemDataIds.includes(d.itemData.id))
return false;
itemDataIds.push(d.itemData.id);
uniqIdsIndexes.push(index);
return true;
});
return {
items: items,
callbacks: uniqIdsIndexes.map(i => callbacks[i])
};
}
_onMultiCallDone(data, callbacks, updateByMultiCallResolve, promiseFuncs, requestImage = true) {
try {
if (requestImage)
this._imageLoaderService.loadCombinedImage(data.combinedImageDescription);
const resultItems = data.items;
for (let i = 0; i < resultItems.length; i++)
this._processItemResult(resultItems[i], callbacks[i]);
}
finally {
this._onMultiCallFinally();
updateByMultiCallResolve(true);
if (promiseFuncs != null)
promiseFuncs.forEach(x => x[0](true));
}
}
_processItemResult(resultItem, callbacks) {
try {
const [successCallback, failedCallback] = callbacks;
if (resultItem.error)
failedCallback({ errorMessage: resultItem.errorMessage });
else {
successCallback(resultItem.result);
}
}
catch (e) {
console.error("Error while processing ItemHandlers service response", e);
}
}
_onMultiCallFailed(error, userContext, methodName, items, callbacks, updateByMultiCallReject, promiseFuncs) {
try {
for (let i = 0; i < callbacks.length; i++)
if (callbacks[i][1])
callbacks[i][1](error, userContext, methodName);
}
finally {
this._onMultiCallFinally();
updateByMultiCallReject();
if (promiseFuncs != null)
promiseFuncs.forEach(x => x[1]());
}
}
_updateByMultiCallRequest(data, resolve, failure) {
this._service.sendRequest("UpdateByMultiCallRequest", data, resolve, failure);
}
_onMultiCallFinally() {
this._multiCallInProgress = false;
this._multiCallItems = [];
this._multiCallCallbacks = [];
}
}
//# sourceMappingURL=MultiCallRequest.js.map