UNPKG

@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
'use strict'; 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; }, []); }