@embrace-io/react-navigation
Version:
This is used to track React Native screens with the Embrace SDK
85 lines (84 loc) • 4.01 kB
JavaScript
;
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;