Skip to content

Commit 65c19b8

Browse files
committed
feat: enhance EmbeddedSessionManager to manage session state based on screen focus
1 parent 324b7ab commit 65c19b8

4 files changed

Lines changed: 58 additions & 4 deletions

File tree

example/src/components/Embedded/Embedded.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useIsFocused } from '@react-navigation/native';
12
import { useCallback, useState } from 'react';
23
import {
34
Alert,
@@ -25,6 +26,7 @@ const DEFAULT_CONFIG_JSON = `{
2526
}`;
2627

2728
export const Embedded = () => {
29+
const isFocused = useIsFocused();
2830
const [placementIdsInput, setPlacementIdsInput] = useState<string>('');
2931
const [embeddedMessages, setEmbeddedMessages] = useState<
3032
IterableEmbeddedMessage[]
@@ -77,7 +79,7 @@ export const Embedded = () => {
7779
}, []);
7880

7981
return (
80-
<EmbeddedSessionManager>
82+
<EmbeddedSessionManager isActive={isFocused}>
8183
<SafeAreaView style={styles.container}>
8284
<Text style={styles.title}>Embedded</Text>
8385
{!Iterable.embeddedManager.isEnabled && (

src/embedded/components/EmbeddedSessionManager.test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,44 @@ describe('EmbeddedSessionManager', () => {
5555

5656
expect(Iterable.embeddedManager.endSession).toHaveBeenCalledTimes(1);
5757
});
58+
59+
it('does not start session when isActive is false', () => {
60+
const { unmount } = render(
61+
<EmbeddedSessionManager isActive={false}>
62+
<Text>child</Text>
63+
</EmbeddedSessionManager>
64+
);
65+
66+
expect(Iterable.embeddedManager.startSession).not.toHaveBeenCalled();
67+
68+
unmount();
69+
70+
expect(Iterable.embeddedManager.endSession).not.toHaveBeenCalled();
71+
});
72+
73+
it('ends session when isActive becomes false and restarts when true again', () => {
74+
const { rerender } = render(
75+
<EmbeddedSessionManager isActive={true}>
76+
<Text>child</Text>
77+
</EmbeddedSessionManager>
78+
);
79+
80+
expect(Iterable.embeddedManager.startSession).toHaveBeenCalledTimes(1);
81+
82+
rerender(
83+
<EmbeddedSessionManager isActive={false}>
84+
<Text>child</Text>
85+
</EmbeddedSessionManager>
86+
);
87+
88+
expect(Iterable.embeddedManager.endSession).toHaveBeenCalledTimes(1);
89+
90+
rerender(
91+
<EmbeddedSessionManager isActive={true}>
92+
<Text>child</Text>
93+
</EmbeddedSessionManager>
94+
);
95+
96+
expect(Iterable.embeddedManager.startSession).toHaveBeenCalledTimes(2);
97+
});
5898
});

src/embedded/components/EmbeddedSessionManager.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,18 @@ import type { ViewProps } from 'react-native';
66
import { Iterable } from '../../core/classes/Iterable';
77
import { EmbeddedSessionContext } from '../context/EmbeddedSessionContext';
88

9-
interface EmbeddedSessionManagerProps extends ViewProps {
9+
export interface EmbeddedSessionManagerProps extends ViewProps {
1010
children?: ReactNode;
11+
/**
12+
* Is the current screen in focus?
13+
*
14+
* When `false`, this wrapper does not start an embedded session (e.g. host
15+
* screen not focused). Defaults to `true`.
16+
*
17+
* This is not necessary to use. It is only useful if you want to avoid
18+
* starting the session when the screen is hidden but still technically there.
19+
*/
20+
isActive?: boolean;
1121
}
1222

1323
/**
@@ -17,12 +27,13 @@ interface EmbeddedSessionManagerProps extends ViewProps {
1727
*/
1828
export const EmbeddedSessionManager = ({
1929
children,
30+
isActive = true,
2031
...viewProps
2132
}: EmbeddedSessionManagerProps) => {
2233
const hasActiveParentSession = useContext(EmbeddedSessionContext);
2334

2435
useEffect(() => {
25-
if (hasActiveParentSession) {
36+
if (hasActiveParentSession || !isActive) {
2637
return;
2738
}
2839

@@ -31,7 +42,7 @@ export const EmbeddedSessionManager = ({
3142
return () => {
3243
Iterable.embeddedManager.endSession();
3344
};
34-
}, [hasActiveParentSession]);
45+
}, [hasActiveParentSession, isActive]);
3546

3647
return (
3748
<EmbeddedSessionContext.Provider value={true}>

src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export {
4141
IterableEmbeddedView,
4242
IterableEmbeddedViewType,
4343
useEmbeddedView,
44+
type EmbeddedSessionManagerProps,
4445
type IterableEmbeddedComponentProps,
4546
type IterableEmbeddedMessage,
4647
type IterableEmbeddedMessageElements,

0 commit comments

Comments
 (0)