UNPKG

@shopgate/pwa-common

Version:

Common library for the Shopgate Connect PWA.

15 lines 7.9 kB
function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import after from'lodash/after';import before from'lodash/before';import over from'lodash/over';import{isAvailable}from'@shopgate/native-modules';import{init,addBreadcrumb,configureScope,captureException,captureMessage,captureEvent,withScope,Severity as SentrySeverity}from'@sentry/browser';import{EBIGAPI,emitter,errorManager,ETIMEOUT,ENETUNREACH,EUNKNOWN,EFAVORITE}from'@shopgate/pwa-core';import{hasWebBridge}from'@shopgate/engage/core';import{SOURCE_TRACKING,SOURCE_CONSOLE,Severity}from'@shopgate/pwa-core/constants/ErrorManager';import{main$}from"../streams/main";import{// eslint-disable-next-line import/no-named-default default as appConfig,themeName,pckVersion}from"../helpers/config";import{env}from"../helpers/environment";import{transformGeneralPipelineError}from"./helpers/pipeline";import{historyPop}from"../actions/router";import showModal from"../actions/modal/showModal";import{getUserData}from"../selectors/user";import{userDidUpdate$}from"../streams/user";import{clientInformationDidUpdate$}from"../streams/client";import{appWillInit$,appWillStart$,appDidStart$}from"../streams/app";import{appError$,pipelineError$}from"../streams/error";import{getRouterStack}from"../selectors/router";import{MODAL_PIPELINE_ERROR}from"../constants/ModalTypes";import ToastProvider from"../providers/toast";/** * App errors subscriptions. * @param {Function} subscribe The subscribe function. */export default(function(subscribe){/** Set general error transformations */subscribe(appWillStart$,function(){errorManager.setMessage({code:EUNKNOWN,message:transformGeneralPipelineError}).setMessage({code:EBIGAPI,message:transformGeneralPipelineError}).setMessage({code:ETIMEOUT,message:'modal.body_error'}).setMessage({code:ENETUNREACH,message:'modal.body_error'}).setMessage({code:EFAVORITE,message:'favorites.error_general'});});/** Show a message to the user in case of pipeline error */subscribe(pipelineError$,function(_ref){var dispatch=_ref.dispatch,getState=_ref.getState,events=_ref.events,action=_ref.action;var error=action.error;var message=error.message,code=error.code,context=error.context,_error$meta=error.meta,meta=_error$meta===void 0?{}:_error$meta;var behavior=meta.behavior;if(behavior){behavior({dispatch:dispatch,getState:getState,events:events,error:error});return;}/** Show modal thunk */var showModalError=function showModalError(){dispatch(showModal({confirm:'modal.ok',dismiss:null,title:null,message:message,type:MODAL_PIPELINE_ERROR,params:{pipeline:context,request:meta.input,message:meta.message,code:code}}));};var shouldShowToast=message==='error.general';if([ETIMEOUT,ENETUNREACH].includes(code)&&message==='modal.body_error'){shouldShowToast=true;}// It was transformed general error. let it popup after 10 toast clicks if(shouldShowToast){var showToastAfter=after(9,showModalError);// Recursively show same toast message until clicked 10 times var showToast=before(10,function(){events.emit(ToastProvider.ADD,{id:'pipeline.error',message:'error.general',action:over([showToast,showToastAfter])});});showToast();return;}showModalError();});// This subscription is always active despite sentry activation subscribe(appError$,function(_ref2){var dispatch=_ref2.dispatch;// Show modal to user dispatch(showModal({confirm:null,message:'modal.body_error',title:'modal.title_error'}));dispatch(historyPop());});var _appConfig$sentry=appConfig.sentry,enabled=_appConfig$sentry.enabled,level=_appConfig$sentry.level,sampleRate=_appConfig$sentry.sampleRate;// Is not enabled if(!enabled){return;}var severityMap=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},Severity.Fatal,SentrySeverity.Fatal),Severity.Error,SentrySeverity.Error),Severity.Critical,SentrySeverity.Critical),Severity.Warning,SentrySeverity.Warning),Severity.Info,SentrySeverity.Info),Severity.Debug,SentrySeverity.Debug);var ignoredDefaultBreadcrumbs=['console','fetch','xhr','ui.click'];var trackedSeverities=Object.getOwnPropertySymbols(severityMap).map(function(s){return severityMap[s];});var minSeverityIndex=trackedSeverities.indexOf(level);if(minSeverityIndex>-1){trackedSeverities=trackedSeverities.slice(0,minSeverityIndex+1);}subscribe(appWillInit$,function(_ref3){var getState=_ref3.getState;init({dsn:'https://1a444b262ac6405594ab33fb0102b377@sentry.io/1398210',environment:appConfig.omniStage||env,debug:env==='development',release:pckVersion,attachStacktrace:true,sampleRate:sampleRate,beforeBreadcrumb:function beforeBreadcrumb(breadcrumb){if(ignoredDefaultBreadcrumbs.includes(breadcrumb.category)){return null;}return breadcrumb;},beforeSend:function beforeSend(event){if(event.level&&!trackedSeverities.includes(event.level)){return null;}// eslint-disable-next-line no-param-reassign event.extra=_extends({},event.extra||{},{routerStack:getRouterStack(getState()).slice(-5)});return event;}});configureScope(function(scope){scope.setTag('marketId',appConfig.marketId);scope.setTag('appId',appConfig.appId);scope.setTag('pwaVersion',pckVersion);scope.setTag('theme',themeName);scope.setTag('language',appConfig.language);scope.setTag('isWebsite',hasWebBridge());scope.setTag('isReactNativeApp',isAvailable());scope.setTag('merchantCode',appConfig.omniMerchantCode);});if(window){window.onerror=function(message,source,lineno,colno,error){captureException(error);};}emitter.addListener(SOURCE_TRACKING,function(error){withScope(function(scope){if(error.context){scope.setExtra('trackerName',error.context);}captureException(error);});});emitter.addListener(SOURCE_CONSOLE,function(args){withScope(function(scope){scope.setLevel(SentrySeverity.Error);scope.setExtra('error',args);captureMessage('Console error');});});});subscribe(main$,function(_ref4){var action=_ref4.action;addBreadcrumb({category:'redux',message:"[Redux] ".concat(action.type),level:SentrySeverity.Info,data:_extends({},action)});});subscribe(userDidUpdate$,function(_ref5){var getState=_ref5.getState;var _getUserData=getUserData(getState()),userId=_getUserData.id;configureScope(function(scope){scope.setTag('userId',userId);});});// Add client lib versions subscribe(clientInformationDidUpdate$,function(_ref6){var action=_ref6.action;var _action$data=action.data,appVersion=_action$data.appVersion,libVersion=_action$data.libVersion,deviceId=_action$data.deviceId;configureScope(function(scope){scope.setTag('appVersion',appVersion);scope.setTag('libVersion',libVersion);scope.setTag('deviceId',deviceId);});});// Add app start event for debugging subscribe(appDidStart$,function(){withScope(function(scope){scope.setLevel(SentrySeverity.Debug);captureMessage('App did start');});});// Add some stack trace and log to sentry subscribe(appError$,function(_ref7){var action=_ref7.action;withScope(function(scope){if(action.error.stack){scope.setExtra('stack',action.error.stack);}captureException(action.error);});});var allErrors$=pipelineError$.merge(appError$);// Log all error messages which are presented to the user subscribe(allErrors$,function(_ref8){var action=_ref8.action;var _action$error=action.error,error=_action$error===void 0?{}:_action$error;var code=error.code,message=error.message,_error$meta2=error.meta,_error$meta3=_error$meta2===void 0?{}:_error$meta2,metaMessage=_error$meta3.message;withScope(function(scope){scope.setTag('error','E_USER');scope.setTag('errorCode',code);scope.setTag('errorMessage',message);captureEvent({message:metaMessage||message,extra:error});});});});