Skip to content

Commit 59d0dfe

Browse files
authored
Merge pull request #60 from sendbird/fix/v1/app-state
Fix/v1/support compatibility for removing AppState listener under 0.65
2 parents 99c133a + 4aaba86 commit 59d0dfe

File tree

5 files changed

+40
-22
lines changed

5 files changed

+40
-22
lines changed

packages/uikit-react-native/src/contexts/SendbirdChat.tsx

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import React, { useCallback, useEffect, useState } from 'react';
2-
import { AppState, AppStateStatus } from 'react-native';
1+
import React, { useCallback, useState } from 'react';
32

43
import { useAppFeatures } from '@sendbird/uikit-chat-hooks';
54
import type { SendbirdChatSDK, SendbirdGroupChannel, SendbirdUser } from '@sendbird/uikit-utils';
6-
import { useForceUpdate } from '@sendbird/uikit-utils';
5+
import { useAppState, useForceUpdate } from '@sendbird/uikit-utils';
76

87
import type { FileType } from '../platform/types';
98

@@ -87,16 +86,11 @@ export const SendbirdChatProvider = ({
8786
[sdkInstance, appFeatures.deliveryReceiptEnabled],
8887
);
8988

90-
useEffect(() => {
91-
const listener = (status: AppStateStatus) => {
92-
// 'active' | 'background' | 'inactive' | 'unknown' | 'extension';
93-
if (status === 'active') sdkInstance.getConnectionState() === 'CLOSED' && sdkInstance.setForegroundState();
94-
else if (status === 'background') sdkInstance.getConnectionState() === 'OPEN' && sdkInstance.setBackgroundState();
95-
};
96-
97-
const subscriber = AppState.addEventListener('change', listener);
98-
return () => subscriber.remove();
99-
}, [sdkInstance]);
89+
useAppState('change', (status) => {
90+
// 'active' | 'background' | 'inactive' | 'unknown' | 'extension';
91+
if (status === 'active') sdkInstance.getConnectionState() === 'CLOSED' && sdkInstance.setForegroundState();
92+
else if (status === 'background') sdkInstance.getConnectionState() === 'OPEN' && sdkInstance.setBackgroundState();
93+
});
10094

10195
const value: Context = {
10296
sdk: sdkInstance,

packages/uikit-react-native/src/fragments/createGroupChannelListFragment.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import React, { useEffect } from 'react';
2-
import { AppState } from 'react-native';
1+
import React from 'react';
32

43
import { useGroupChannelList } from '@sendbird/uikit-chat-hooks';
5-
import { Logger, PASS, useFreshCallback } from '@sendbird/uikit-utils';
4+
import { Logger, PASS, useAppState, useFreshCallback } from '@sendbird/uikit-utils';
65

76
import StatusComposition from '../components/StatusComposition';
87
import GroupChannelPreviewContainer from '../containers/GroupChannelPreviewContainer';
@@ -35,12 +34,9 @@ const createGroupChannelListFragment = (initModule?: Partial<GroupChannelListMod
3534
});
3635

3736
if (features.deliveryReceiptEnabled) {
38-
useEffect(() => {
39-
const listener = AppState.addEventListener('change', (status) => {
40-
if (status === 'active') groupChannels.forEach(markAsDeliveredWithChannel);
41-
});
42-
return () => listener.remove();
43-
}, []);
37+
useAppState('change', (status) => {
38+
if (status === 'active') groupChannels.forEach(markAsDeliveredWithChannel);
39+
});
4440
}
4541

4642
const _renderGroupChannelPreview: GroupChannelListProps['List']['renderGroupChannelPreview'] = useFreshCallback(

packages/uikit-utils/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
},
4444
"devDependencies": {
4545
"@types/react": "*",
46+
"@types/react-native": "*",
4647
"react": "17.0.2",
4748
"react-native": "0.66.4",
4849
"react-native-builder-bob": "^0.18.0",
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { useEffect, useRef } from 'react';
2+
import { AppState, AppStateEvent, AppStateStatus } from 'react-native';
3+
4+
type AppStateListener = (status: AppStateStatus) => void;
5+
6+
export const useAppState = (type: AppStateEvent, listener: AppStateListener) => {
7+
const callbackRef = useRef<AppStateListener>(listener);
8+
callbackRef.current = listener;
9+
10+
useEffect(() => {
11+
const eventListener = (state: AppStateStatus) => callbackRef.current(state);
12+
const subscriber = AppState.addEventListener(type, eventListener);
13+
14+
return () => {
15+
// @ts-ignore
16+
if (subscriber?.remove) {
17+
subscriber.remove();
18+
}
19+
// @ts-ignore
20+
else if (AppState.removeEventListener) {
21+
// @ts-ignore
22+
AppState.removeEventListener(type, eventListener);
23+
}
24+
};
25+
}, []);
26+
};

packages/uikit-utils/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export {
1515
} from './shared/regex';
1616

1717
export * from './hooks';
18+
export * from './hooks/react-native';
1819
export * from './ui-format/groupChannel';
1920
export * from './ui-format/common';
2021
export * from './sendbird/channel';

0 commit comments

Comments
 (0)