diff --git a/trackers/react-native-tracker/src/plugins/session/index.ts b/trackers/react-native-tracker/src/plugins/session/index.ts index 41dfdd5e6..83d615cc5 100644 --- a/trackers/react-native-tracker/src/plugins/session/index.ts +++ b/trackers/react-native-tracker/src/plugins/session/index.ts @@ -57,6 +57,7 @@ export async function newSessionPlugin({ sessionContext = true, foregroundSessionTimeout, backgroundSessionTimeout, + onSessionUpdateCallback, }: TrackerConfiguration & SessionConfiguration & { asyncStorage: AsyncStorage }): Promise { let sessionState = await resumeStoredSession(namespace, asyncStorage); await storeSessionState(namespace, sessionState, asyncStorage); @@ -82,7 +83,8 @@ export async function newSessionPlugin({ // check if session has timed out and start a new one if necessary const now = new Date(); const timeDiff = now.getTime() - lastUpdateTs; - if (timeDiff > getTimeoutMs()) { + const didPreviousSessionTimeout = timeDiff > getTimeoutMs(); + if (didPreviousSessionTimeout) { startNewSession(); storeSessionState(namespace, sessionState, asyncStorage); } @@ -90,7 +92,8 @@ export async function newSessionPlugin({ // update event properties sessionState.eventIndex = (sessionState.eventIndex ?? 0) + 1; - if (sessionState.eventIndex === 1) { + const isFirstEvent = sessionState.eventIndex === 1; + if (isFirstEvent) { sessionState.firstEventId = payloadBuilder.getPayload().eid as string; sessionState.firstEventTimestamp = now.toISOString(); } @@ -112,6 +115,10 @@ export async function newSessionPlugin({ data: { ...sessionState }, }); } + + if (didPreviousSessionTimeout || isFirstEvent) { + onSessionUpdateCallback?.(sessionState); + } }; return { diff --git a/trackers/react-native-tracker/src/types.ts b/trackers/react-native-tracker/src/types.ts index 34f74bf6a..e92e228ef 100755 --- a/trackers/react-native-tracker/src/types.ts +++ b/trackers/react-native-tracker/src/types.ts @@ -59,6 +59,10 @@ export interface SessionConfiguration { * @defaultValue true */ sessionContext?: boolean; + /** + * A callback function that is called when the session changes + */ + onSessionUpdateCallback?: (session: SessionState) => void; } /**