@@ -12,8 +12,9 @@ import {
1212import type { Client , Integration , Span } from '@sentry/types' ;
1313import { isPlainObject , logger , timestampInSeconds } from '@sentry/utils' ;
1414
15- import type { NewFrameEvent , SentryEventEmitter } from '../utils/sentryeventemitter' ;
16- import { createSentryEventEmitter , NewFrameEventName } from '../utils/sentryeventemitter' ;
15+ import type { NewFrameEvent } from '../utils/sentryeventemitter' ;
16+ import type { SentryEventEmitterFallback } from '../utils/sentryeventemitterfallback' ;
17+ import { createSentryFallbackEventEmitter } from '../utils/sentryeventemitterfallback' ;
1718import { isSentrySpan } from '../utils/span' ;
1819import { RN_GLOBAL_OBJ } from '../utils/worldwide' ;
1920import { NATIVE } from '../wrapper' ;
@@ -30,7 +31,6 @@ import {
3031} from './span' ;
3132import { manualInitialDisplaySpans , startTimeToInitialDisplaySpan } from './timetodisplay' ;
3233import { setSpanDurationAsMeasurementOnSpan } from './utils' ;
33-
3434export const INTEGRATION_NAME = 'ReactNavigation' ;
3535
3636const NAVIGATION_HISTORY_MAX_SIZE = 200 ;
@@ -81,7 +81,7 @@ export const reactNavigationIntegration = ({
8181 registerNavigationContainer : ( navigationContainerRef : unknown ) => void ;
8282} => {
8383 let navigationContainer : NavigationContainer | undefined ;
84- let newScreenFrameEventEmitter : SentryEventEmitter | undefined ;
84+ let newScreenFrameEventEmitter : SentryEventEmitterFallback | undefined ;
8585
8686 let tracing : ReactNativeTracingIntegration | undefined ;
8787 let idleSpanOptions : Parameters < typeof startGenericIdleNavigationSpan > [ 1 ] = defaultIdleOptions ;
@@ -95,8 +95,8 @@ export const reactNavigationIntegration = ({
9595 let recentRouteKeys : string [ ] = [ ] ;
9696
9797 if ( enableTimeToInitialDisplay ) {
98- newScreenFrameEventEmitter = createSentryEventEmitter ( ) ;
99- newScreenFrameEventEmitter . initAsync ( NewFrameEventName ) ;
98+ newScreenFrameEventEmitter = createSentryFallbackEventEmitter ( ) ;
99+ newScreenFrameEventEmitter . initAsync ( ) ;
100100 NATIVE . initNativeReactNavigationNewFrameTracking ( ) . catch ( ( reason : unknown ) => {
101101 logger . error ( `${ INTEGRATION_NAME } Failed to initialize native new frame tracking: ${ reason } ` ) ;
102102 } ) ;
@@ -258,9 +258,8 @@ export const reactNavigationIntegration = ({
258258 } ) ;
259259
260260 const navigationSpanWithTtid = latestNavigationSpan ;
261- ! routeHasBeenSeen &&
262- latestTtidSpan &&
263- newScreenFrameEventEmitter ?. once ( NewFrameEventName , ( { newFrameTimestampInSeconds } : NewFrameEvent ) => {
261+ if ( ! routeHasBeenSeen && latestTtidSpan ) {
262+ newScreenFrameEventEmitter ?. onceNewFrame ( ( { newFrameTimestampInSeconds } : NewFrameEvent ) => {
264263 const activeSpan = getActiveSpan ( ) ;
265264 if ( activeSpan && manualInitialDisplaySpans . has ( activeSpan ) ) {
266265 logger . warn ( '[ReactNavigationInstrumentation] Detected manual instrumentation for the current active span.' ) ;
@@ -271,6 +270,7 @@ export const reactNavigationIntegration = ({
271270 latestTtidSpan . end ( newFrameTimestampInSeconds ) ;
272271 setSpanDurationAsMeasurementOnSpan ( 'time_to_initial_display' , latestTtidSpan , navigationSpanWithTtid ) ;
273272 } ) ;
273+ }
274274
275275 navigationProcessingSpan ?. updateName ( `Processing navigation to ${ route . name } ` ) ;
276276 navigationProcessingSpan ?. setStatus ( { code : SPAN_STATUS_OK } ) ;
0 commit comments