Skip to content

Commit 74b2223

Browse files
authored
fix(react-native): VisibilityChangedProvider only Provider (#163)
* fix(react-native): VisibilityChangedProvider only Provider * fix: changeset
1 parent 7572713 commit 74b2223

File tree

3 files changed

+26
-20
lines changed

3 files changed

+26
-20
lines changed

.changeset/fair-cycles-brake.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@granite-js/react-native': patch
3+
'@granite-js/native': patch
4+
---
5+
6+
fix(react-native): VisibilityChangedProvider only provider

packages/react-native/src/visibility/VisibilityProvider.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { ReactElement, ReactNode } from 'react';
1+
import { ReactElement, ReactNode, useEffect, useState } from 'react';
22
import { AppStateProvider } from './useIsAppForeground';
33
import { VisibilityChangedProvider } from './useVisibilityChanged';
4+
import { nativeEventEmitter } from '../native-event-emitter/nativeEventEmitter';
45

56
interface Props {
67
isVisible: boolean;
@@ -11,8 +12,9 @@ interface Props {
1112
* @name VisibilityProvider
1213
* @description
1314
* A Provider that manages whether a ReactNative view is currently in the foreground state.
15+
* It subscribes to the app's `visibilityChanged` event to detect and manage screen visibility.
1416
* @param {boolean} isVisible - Whether the app is in the foreground state.
15-
* @param {ReactNode | undefined} children - Child components that observe `AppState`.
17+
* @param {ReactNode | undefined} children - Child components that observe `visibilityChanged` and `AppState` event.
1618
* @returns {ReactElement} - A React Provider component wrapped with `VisibilityChangedProvider`.
1719
* @example
1820
* ```typescript
@@ -28,8 +30,20 @@ interface Props {
2830
* ```
2931
*/
3032
export function VisibilityProvider({ isVisible, children }: Props): ReactElement {
33+
const [visible, setVisible] = useState(isVisible);
34+
35+
useEffect(() => {
36+
const subscription = nativeEventEmitter.addListener('visibilityChanged', (nextVisible) => {
37+
setVisible(nextVisible);
38+
});
39+
40+
return () => {
41+
subscription.remove();
42+
};
43+
}, []);
44+
3145
return (
32-
<VisibilityChangedProvider isVisible={isVisible}>
46+
<VisibilityChangedProvider isVisible={visible}>
3347
<AppStateProvider>{children}</AppStateProvider>
3448
</VisibilityChangedProvider>
3549
);

packages/react-native/src/visibility/useVisibilityChanged.tsx

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import { createContext, PropsWithChildren, ReactElement, useContext, useEffect, useState } from 'react';
2-
import { nativeEventEmitter } from '../native-event-emitter';
1+
import { createContext, PropsWithChildren, ReactElement, useContext } from 'react';
32

43
const VisibilityChangedContext = createContext<boolean | undefined>(undefined);
54

65
/**
76
* @name VisibilityChangedProvider
87
* @kind function
98
* @description
10-
* A Provider that manages whether a React Native screen is visible.
11-
* It subscribes to the app's `visibilityChanged` event to detect and manage screen visibility.
9+
* A Provider that manages whether a React Native screen is visible provider.
1210
*
1311
* @param {ReactNode | undefined} children - Child components that check screen visibility.
1412
* @param {boolean} isVisible - A boolean value indicating whether the screen is visible.
@@ -28,19 +26,7 @@ export function VisibilityChangedProvider({
2826
children,
2927
isVisible,
3028
}: PropsWithChildren<{ isVisible: boolean }>): ReactElement {
31-
const [visible, setVisible] = useState(isVisible);
32-
33-
useEffect(() => {
34-
const subscription = nativeEventEmitter.addListener('visibilityChanged', (nextVisible) => {
35-
setVisible(nextVisible);
36-
});
37-
38-
return () => {
39-
subscription.remove();
40-
};
41-
}, []);
42-
43-
return <VisibilityChangedContext.Provider value={visible}>{children}</VisibilityChangedContext.Provider>;
29+
return <VisibilityChangedContext.Provider value={isVisible}>{children}</VisibilityChangedContext.Provider>;
4430
}
4531

4632
/**

0 commit comments

Comments
 (0)