UNPKG

rn-pendo-sdk

Version:

Pendo Mobile React Native SDK

1 lines 6.65 kB
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.PendoRNN=void 0;var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _reactNative=require("react-native");var _common=require("./common");var _debouncer=require("./debouncer");var _pendoLogger=require("./pendoLogger");var _pendoTypes=require("./pendoTypes");var _traverseOptions=require("./traverseOptions");var _treeAnalyzer=require("./treeAnalyzer");var ReactNativePendo=_reactNative.NativeModules.ReactNativePendo;var emitter=null;if(_common.Utils.hasPendoNativeModule(false)){emitter=new _reactNative.NativeEventEmitter(ReactNativePendo);}var PendoRNN=exports.PendoRNN=function(){function PendoRNN(navigation,clickableElementsNativeIDsRegex,isComponentSetStateInvoked){(0,_classCallCheck2.default)(this,PendoRNN);if(!navigation){throw new Error('React Native Navigation requires NavigationRoot object!');}this.navigation=navigation;this.currentScreen=null;this.currentRootTag=null;this.clickableElementsNativeIDsRegex=clickableElementsNativeIDsRegex;this.isComponentSetStateInvoked=isComponentSetStateInvoked;this.subscriptions=[];this.debouncer=new _debouncer.Debouncer();this.addScanRequestListener(_common.Consts.kOnDynamicContentRequestAnalyzer,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS.analyzeScreenDefaultDebouncerTime,true);this.addScanRequestListener(_common.Consts.kOnCaptureRequestAnalyzer,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS.analyzeScreenNoDebouncerTime,true);this.addScanRequestListener(_common.Consts.kOnReturnFromAlertRequestAnalyzer,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS.analyzeScreenNoDebouncerTime,false);this.addScanRequestListener(_common.Consts.kOnDefaultRequestAnalyzer,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS.analyzeScreenNoDebouncerTime,false);this.addScanRequestListener(_common.Consts.kOnScreenContentChange,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS.analyzeContentScreenDefaultDebouncerTime,true);this.addScanRequestListener(_common.Consts.kOnModalStateVisible,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS.analyzeContentScreenDefaultDebouncerTime,false);this.addScanRequestListener(_common.Consts.kOnModalStateHidden,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS.analyzeContentScreenDefaultDebouncerTime,false);}return(0,_createClass2.default)(PendoRNN,[{key:"addScanRequestListener",value:function addScanRequestListener(event,debouncerTime,shouldSetComponentState){var _this=this;if(emitter===null||!_common.Utils.hasPendoNativeModule(false)){return;}this.subscriptions.push(emitter.addListener(event,function(){if(_this.component){if(shouldSetComponentState){_this.component.setState(null);}var analyzeEvent=event===_common.Consts.kOnScreenContentChange?event:undefined;_this.debouncer.debounce(_this.analyze.bind(_this,analyzeEvent),debouncerTime,_debouncer.RequestOrigin.Native)();}}));}},{key:"hook",value:function hook(){var _this2=this;var pendoRNNInstance=this;this.navigation.events().registerComponentDidAppearListener(function(event){if(!_common.Utils.hasPendoNativeModule(false)){return;}ReactNativePendo.shouldScanForDynamicElements(false);_pendoLogger.Logger.debug(`${_common.Consts.kRnnRegisterComponentDidAppearListener}: ${event}`);var screenName=_this2.getCurrentScreenName(event);if(screenName===_this2.currentScreen){return;}_this2.currentScreen=screenName;try{var _pendoRNNInstance$nav,_pendoRNNInstance$nav2,_pendoRNNInstance$nav3,_pendoRNNInstance$nav4,_pendoRNNInstance$nav5,_pendoRNNInstance$nav6;_this2.component=((_pendoRNNInstance$nav=pendoRNNInstance.navigation)==null?void 0:(_pendoRNNInstance$nav2=_pendoRNNInstance$nav.mock)==null?void 0:(_pendoRNNInstance$nav3=_pendoRNNInstance$nav2.store)==null?void 0:_pendoRNNInstance$nav3.getComponentInstance(event.componentId))||((_pendoRNNInstance$nav4=pendoRNNInstance.navigation)==null?void 0:(_pendoRNNInstance$nav5=_pendoRNNInstance$nav4.componentRegistry)==null?void 0:(_pendoRNNInstance$nav6=_pendoRNNInstance$nav5.store)==null?void 0:_pendoRNNInstance$nav6.getComponentInstance(event.componentId));if(_this2.component){var _this2$component,_this2$component$_rea,_this2$component$_rea2,_this2$component2,_this2$component2$_re,_this2$component2$_re2;_this2.currentRootTag=((_this2$component=_this2.component)==null?void 0:(_this2$component$_rea=_this2$component._reactInternalFiber)==null?void 0:(_this2$component$_rea2=_this2$component$_rea.memoizedProps)==null?void 0:_this2$component$_rea2.rootTag)||((_this2$component2=_this2.component)==null?void 0:(_this2$component2$_re=_this2$component2._reactInternals)==null?void 0:(_this2$component2$_re2=_this2$component2$_re.memoizedProps)==null?void 0:_this2$component2$_re2.rootTag);if(_this2.isComponentSetStateInvoked){_this2.component.setState(null);}}else{_pendoLogger.Logger.debug(`${_common.Consts.kRnnRegisterComponentDidAppearListener} - component is null`);}}catch(e){_pendoLogger.Logger.warn(`${_common.Consts.kRnnRegisterComponentDidAppearListener} error ${e}`);return;}_this2.analyze();});}},{key:"getCurrentScreenName",value:function getCurrentScreenName(event){var screenName=event.componentName;if(event.passProps&&event.passProps.modalPosition){screenName=`${screenName}_${event.passProps.modalPosition}`;}return screenName;}},{key:"analyze",value:function analyze(event){if(!_common.Utils.hasPendoNativeModule(false)){return;}if(this.currentScreen&&this.currentRootTag){var options=new _traverseOptions.TraverseOptions({reactComponent:this.component,integrationType:_pendoTypes.IntegrationType.reactNativeNavigation,collectAllClickableElements:true});if(this.clickableElementsNativeIDsRegex){options.clickableElementsNativeIDsRegex=this.clickableElementsNativeIDsRegex;}var params=(0,_treeAnalyzer.analyzeTree)(options,_traverseOptions.DEFAULT_TRAVERSE_OPTIONS);var info={reactPlugin:_pendoTypes.NavigationLibraryType.ReactNativeNavigation,apiTriggeredScan:false};var clickableElements=params==null?void 0:params.getClickableElements();if(event===_common.Consts.kOnScreenContentChange){_pendoLogger.Logger.debug('analyze: scan triggered by screenContentChanged');info.apiTriggeredScan=true;}ReactNativePendo.screenChanged(this.currentScreen,[this.currentRootTag],clickableElements,info);}else{var errorMessage=`RNN analyze (request from native to scan screen) - failed to get tree info from JS - screen: ${this.currentScreen} tag: ${this.currentRootTag}`;_pendoLogger.Logger.warn(errorMessage);var userInfo={errorMessage:errorMessage};ReactNativePendo.sendFailureInfo(userInfo,true);}}}]);}();