@sentry/react-native
Version:
Official Sentry SDK for react-native
92 lines • 3.82 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { debug, getClient } from '@sentry/core';
import * as React from 'react';
import { getNavigationContainerComponent } from './reactNavigationImport';
import { getReactNavigationIntegration } from './tracing/reactnavigation';
import { registerFeatureMarker } from './utils/featureMarkers';
export const NAVIGATION_CONTAINER_INTEGRATION_NAME = 'NavigationContainer';
let _warnedMissing = false;
let _warnedNoClient = false;
let _warnedNoIntegration = false;
/**
* Drop-in replacement for `NavigationContainer` from `@react-navigation/native`
* that automatically wires up Sentry's `reactNavigationIntegration`.
*
* Sentry registers the navigation container before the user-provided `onReady`
* callback fires, so navigation spans are captured from the first route.
*
* If `@react-navigation/native` is not installed, children are rendered directly
* and `onReady` is not called.
*
* @example
* ```jsx
* <Sentry.NavigationContainer>
* <Stack.Navigator>
* ...
* </Stack.Navigator>
* </Sentry.NavigationContainer>
* ```
*/
export const NavigationContainer = React.forwardRef((props, forwardedRef) => {
const { onReady: userOnReady } = props, restProps = __rest(props, ["onReady"]);
const RealNavigationContainer = getNavigationContainerComponent();
const internalRef = React.useRef(null);
const mergedRef = React.useCallback((instance) => {
internalRef.current = instance;
if (typeof forwardedRef === 'function') {
forwardedRef(instance);
}
else if (forwardedRef != null) {
forwardedRef.current = instance;
}
}, [forwardedRef]);
React.useEffect(() => {
registerFeatureMarker(NAVIGATION_CONTAINER_INTEGRATION_NAME);
}, []);
const onReady = React.useCallback(() => {
try {
const client = getClient();
if (!client) {
if (!_warnedNoClient) {
_warnedNoClient = true;
debug.warn('[Sentry] NavigationContainer: Sentry is not initialized. Call Sentry.init() before mounting NavigationContainer.');
}
}
else {
const integration = getReactNavigationIntegration(client);
if (integration) {
integration.registerNavigationContainer(internalRef);
}
else if (!_warnedNoIntegration) {
_warnedNoIntegration = true;
debug.log('[Sentry] NavigationContainer: reactNavigationIntegration is not registered. Navigation spans will not be captured.');
}
}
}
catch (_a) {
// SDK failures must never break the host app
}
if (typeof userOnReady === 'function') {
userOnReady();
}
}, [userOnReady]);
if (!RealNavigationContainer) {
if (!_warnedMissing) {
_warnedMissing = true;
debug.warn('[Sentry] NavigationContainer requires @react-navigation/native to be installed.');
}
return React.createElement(React.Fragment, null, restProps.children);
}
return React.createElement(RealNavigationContainer, Object.assign({}, restProps, { ref: mergedRef, onReady: onReady }));
});
//# sourceMappingURL=NavigationContainer.js.map