UNPKG

@embrace-io/react-navigation

Version:

This is used to track React Native screens with the Embrace SDK

85 lines (84 loc) 4.01 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useEmbraceNavigationTracker = void 0; const react_native_1 = require("react-native"); const react_1 = require("react"); const Utils_1 = require("../navigation/Utils"); const useEmbraceNavigationTracker = (navigationRefParam, forceRefresh) => { const navigationRef = navigationRefParam; const [isFirstScreen, setIsFirstScreen] = (0, react_1.useState)(true); const currentScreen = (0, react_1.useRef)(); const findLastScreen = (currentRoute) => { const navigationHistory = (0, Utils_1.findNavigationHistory)(currentRoute); return navigationHistory.pop(); }; const setLastScreenStart = (name) => __awaiter(void 0, void 0, void 0, function* () { currentScreen.current = { name, }; if (react_native_1.NativeModules.EmbraceManager.startView) { currentScreen.current.spanId = yield react_native_1.NativeModules.EmbraceManager.startView(name); } else { console.warn("[Embrace] The method startView was not found, please update the native SDK"); } }); const updateLastScreen = ({ name }) => { var _a; if (!((_a = currentScreen.current) === null || _a === void 0 ? void 0 : _a.name)) { setLastScreenStart(name); } else if (currentScreen.current.name !== name) { if (react_native_1.NativeModules.EmbraceManager.endView && currentScreen.current.spanId) { react_native_1.NativeModules.EmbraceManager.endView(currentScreen.current.spanId); setLastScreenStart(name); } else { console.warn("[Embrace] The method endView was not found, please update the native SDK"); } } }; const findAndSetLastScreen = (currentRute) => { const lastScreen = findLastScreen(currentRute); if (lastScreen) { updateLastScreen(lastScreen); } }; (0, react_1.useEffect)(() => { if (!react_native_1.NativeModules.EmbraceManager) { console.warn("[Embrace] You must have the Embrace SDK to track screens, run `yarn add @embrace-io/react-native`."); return; } if (!navigationRef) { console.warn("[Embrace] Navigation reference was not provided. Navigation tracker was not applied."); return; } if (!navigationRef.current) { console.warn("[Embrace] Navigation reference current object is null. Navigation tracker was not applied."); return; } const navigationRefC = navigationRef.current; if (isFirstScreen) { const currentRute = navigationRefC.getCurrentRoute(); findAndSetLastScreen(currentRute); setIsFirstScreen(false); } console.log("[Embrace] Navigation tracker was applied."); const unsubscribe = navigationRefC.addListener("state", e => { findAndSetLastScreen(e.data.state); }); return unsubscribe; }, [navigationRef, navigationRef === null || navigationRef === void 0 ? void 0 : navigationRef.current, forceRefresh]); }; exports.useEmbraceNavigationTracker = useEmbraceNavigationTracker;