@zohodesk/platform-middleware_poc
Version:
Generalized Contract for the events from Marketplace App, In-App widgets, CRM-Plus and EFC
311 lines (271 loc) • 11.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.zAppHookEvent = exports.zAppBroadcastEvent = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.isEventNeededToBroadCast = isEventNeededToBroadCast;
exports.handleEvent = handleEvent;
exports.validateConfig = validateConfig;
exports.constructWidgetData = constructWidgetData;
var _selectn = require('selectn');
var _selectn2 = _interopRequireDefault(_selectn);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function clearNonRuntimeWidgetInstances() {
var allwidgetsInstance = ZApp.GetAllWidgetInstance();
allwidgetsInstance = Object.keys(allwidgetsInstance);
var widgetInstance = null;
for (var i = 0; i < allwidgetsInstance.length; i++) {
widgetInstance = ZApp.GetWidgetInstance(allwidgetsInstance[i]);
if (widgetInstance.getIFrame() === null) {
ZApp.DeleteWidgetInstance(allwidgetsInstance[i]);
}
}
}
function patchString(string, data) {
if (!string || typeof string !== 'string') {
throw new Error('Invalid String');
}
if (!data || (typeof data === 'undefined' ? 'undefined' : _typeof(data)) !== 'object') {
throw new Error('Invalid Params object');
}
var patchedString = string.replace(/\{\{\w+\}\}?/g, function (match) {
var key = match.replace(/[{{}}]/g, '');
return data[key] || match;
});
return patchedString;
}
function isObject(obj) {
return obj.constructor === {}.constructor;
}
// function getComputedParams(paramsObj) {
// return Object.keys(paramsObj.computeParams).reduce((result, param) => {
// result[param] = selectn(patchString(paramsObj.computeParams[param], paramsObj.data), paramsObj.data);
// return result;
// }, {});
// }
// function paraseData(dataObj) {
// return Object.keys(dataObj.params).reduce((result, param) => {
// if (typeof dataObj.params[param] === "object") {
// paraseData({
// params: params[param],
// data: dataObj.data
// })
// } else {
// result[param] = selectn(patchString(dataObj.params[param], dataObj.data), dataObj.data);
// }
// return result;
// }, {});
// }
// export function constructDataForEvent(dataObj) {
// let computedParams = getComputedParams({ computeParams: dataObj.computeParams, data: dataObj.data });
// computedParams = Object.assign({}, computedParams, dataObj.data);
// return paraseData({ params: dataObj.params, data: computedParams });
// }
// export let zAppBroadcastEvent = (eventObj) => {
// if (typeof ZApp !== 'undefined') {
// clearNonRuntimeWidgetInstances();
// ZApp.BroadcastEvent(eventObj.name, eventObj.data);
// }
// PlatformInstance.BroadcastEvent({ name: eventObj.name, data: eventObj.data })
// }
function isValidEventObj(eventObj) {
return eventObj.eventName && eventObj.responseHandler && typeof eventObj.responseHandler == 'function' ? true : false;
}
function hasWidgetsForEvent(eventName) {
return ZApp.GetWidgetsByEvent(eventName).length > 0 ? true : false;
}
function isEventNeededToBroadCast(eventObj) {
return isValidEventObj(eventObj);
}
var zAppBroadcastEvent = exports.zAppBroadcastEvent = function zAppBroadcastEvent(eventObj) {
var getState = eventObj.getState,
dispatch = eventObj.dispatch,
action = eventObj.action,
event = eventObj.event;
var responseHandler = event.responseHandler,
eventName = event.eventName;
responseHandler(action, getState, dispatch).then(function (response) {
if (typeof ZApp !== 'undefined') {
clearNonRuntimeWidgetInstances();
isObject(response) ? ZApp.BroadcastEvent(eventName, response) : null;
}
isObject(response) && typeof PlatformInstance != 'undefined' ? PlatformInstance.BroadcastEvent({ name: eventName, data: response }) : null;
});
};
var zAppHookEvent = exports.zAppHookEvent = function zAppHookEvent(eventObj) {
return new Promise(function (resolve, reject) {
var getState = eventObj.getState,
dispatch = eventObj.dispatch,
action = eventObj.action,
hook = eventObj.hook;
var responseHandler = hook.responseHandler,
eventName = hook.eventName;
responseHandler(action, getState, dispatch).then(function (hookData) {
if (typeof ZApp !== 'undefined') {
clearNonRuntimeWidgetInstances();
var isTimeOutCalled = false,
failedWidgets = [],
eventListeners = ZApp.GetWidgetsByEvent(eventName);
if (eventListeners.length > 0) {
var eventTimeout = setTimeout(function () {
isTimeOutCalled = true;
resolve(eventObj.action);
}, 30000);
//Third argument true is set because of Hook Event
Promise.all(ZApp.BroadcastEvent(eventName, hookData, true)).then(function (response) {
if (!isTimeOutCalled) {
clearTimeout(eventTimeout);
response.map(function (widgetsResponse) {
if (!widgetsResponse.response[0].isSuccess) {
if (widgetsResponse.response[0].msg) {
content = msg.trim();
} else {
content = 'This widget has stopped the ' + eventName + ' operation';
}
failedWidgets.push({
title: ZApp.GetWidgetInstance(widgetsResponse.widgetID).getProp('name'),
content: content
});
} else {
widgetsResponse.response[0].response == false ? failedWidgets.push({
title: ZApp.GetWidgetInstance(widgetsResponse.widgetID).getProp('name'),
content: 'This widget has stopped the ' + eventName + ' operation'
}) : null;
}
});
if (failedWidgets.length) {
failedWidgets.forEach(function (widget) {
eventObj.notifyHandler({
title: widget.title,
content: widget.content,
dispatch: eventObj.dispatch,
getState: eventObj.getState
});
});
} else {
resolve(eventObj.action);
}
}
}).catch(function (err) {
if (!isTimeOutCalled) {
clearTimeout(eventTimeout);
eventObj.notifyHandler({
title: 'Hook Event Failed',
content: 'Some widget has stopped the ' + eventName + ' hook event',
dispatch: eventObj.dispatch,
getState: eventObj.getState
});
}
});
} else {
resolve(eventObj.action);
}
}
});
});
};
function constructEventAndResponseObject(eventObj) {
var info = {};
if (eventObj.event.EVENT_FROM == 'PRODUCT') {
info = {
type: eventObj.event.type,
value: eventObj.event.payload,
property: eventObj.event.property
};
} else {
info = {
type: eventObj.event.data.type,
value: eventObj.event.data.value,
property: eventObj.event.data.property || null,
iframe: eventObj.event.iframe
};
}
return {
info: info,
sendResponse: function sendResponse(eventResponseObj) {
var data = eventResponseObj.data;
if (eventResponseObj.hasOwnProperty('status')) {
if (eventResponseObj.type && eventResponseObj.type.toLowerCase() === 'request') {
eventResponseObj.status ? eventObj.event.promise.resolve(data) : eventObj.event.promise.reject({ errMsg: data });
} else {
eventResponseObj.status ? eventObj.event.promise.resolve(data) : eventObj.event.promise.reject({ errMsg: data });
}
}
}
};
}
function constructWidgetObject(widgetId, extension_id) {
var widgetInstance = ZApp.GetWidgetInstance(widgetId);
return {
id: widgetInstance.getProp('widgetId'),
clientId: widgetId,
title: widgetInstance.getProp('title') || widgetInstance.getProp('name'),
extensionId: extension_id,
location: widgetInstance.getLocation()
};
}
function handleEvent(eventObj) {
var _eventObj$event = eventObj.event,
widgetID = _eventObj$event.widgetID,
extension_id = _eventObj$event.extension_id;
var constructedEventObject = {
store: {
getState: eventObj.getState,
dispatch: eventObj.dispatch
},
patchString: patchString
};
if (widgetID && extension_id) {
constructedEventObject.widget = constructWidgetObject(widgetID, extension_id);
}
constructedEventObject.event = constructEventAndResponseObject(eventObj);
return constructedEventObject;
}
function validateConfig(config) {
var errorMsg = null;
if (!config.hasOwnProperty('marketplace')) {
errorMsg = 'marketplace object is missing';
} else {
if (!(config.marketplace.hasOwnProperty('renderHandler') && typeof config.marketplace.renderHandler === 'function')) {
errorMsg = 'marketplace object should have renderHandler key with function as value';
}
if (!(config.marketplace.hasOwnProperty('postAssestsFetch') && typeof config.marketplace.postAssestsFetch === 'function')) {
errorMsg = 'marketplace object should have postAssestsFetch key with function as value';
}
if (!(config.marketplace.hasOwnProperty('isDevMode') && typeof config.marketplace.isDevMode === 'function')) {
errorMsg = 'marketplace object should have isDevMode key with function as value';
}
if (!(config.marketplace.hasOwnProperty('requestHandler') && typeof config.marketplace.requestHandler === 'function')) {
errorMsg = 'marketplace object should have requestHandler key with function as value';
}
if (!(config.marketplace.hasOwnProperty('notifyHandler') && typeof config.marketplace.notifyHandler === 'function')) {
errorMsg = 'marketplace object should have notifyHandler key with function as value';
}
}
if (!(config.hasOwnProperty('globalNameSpace') && typeof config.globalNameSpace === 'string')) {
errorMsg = 'globalNameSpace key with string as value is missing';
}
if (!(config.hasOwnProperty('locale') && typeof config.locale === 'string')) {
errorMsg = 'locale key with string as value is missing';
}
if (!config.hasOwnProperty('eventListeners')) {
errorMsg = 'eventListeners object is missing';
} else {
Object.keys(config.eventListeners).forEach(function (key) {
if (!(typeof config.eventListeners[key] === 'function')) {
errorMsg = 'every keys in eventListeners object should have function as value';
return;
}
});
}
return { isConfigValid: errorMsg ? false : true, errorMsg: errorMsg };
}
function constructWidgetData(widgets, location, uID) {
var uniqueKey = uID ? location + '_' + uID : location;
return widgets[uniqueKey].reduce(function (array, widgetId) {
// array.push(Object.assign({}, widgets.widgets[widgetId], { widgetId: widgetId, isCollapsed: false, url: 'https://4801041b-3e8c-4f44-8434-065a657e0978.localzappscontents.com/appfiles/v2/4801041b-3e8c-4f44-8434-065a657e0978/4.0/0e8ab29c58ff6b2a32eacf31657cae4546ad6cdc18918216ba0a7e2087207f1f/app/widget.html' }));
array.push(Object.assign({}, widgets.widgets[widgetId], { widgetId: widgetId }));
return array;
}, []);
}