Skip to content

Commit b3ba20f

Browse files
committed
fix: rerendering issues in sample app
1 parent 16329c5 commit b3ba20f

File tree

5 files changed

+51
-50
lines changed

5 files changed

+51
-50
lines changed

examples/SampleApp/App.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ const Drawer = createDrawerNavigator();
7575
const Stack = createStackNavigator<StackNavigatorParamList>();
7676
const UserSelectorStack = createStackNavigator<UserSelectorParamList>();
7777
const App = () => {
78-
const { chatClient, isConnecting, loginUser, logout, switchUser, unreadCount } = useChatClient();
78+
const { chatClient, isConnecting, loginUser, logout, switchUser } = useChatClient();
7979
const colorScheme = useColorScheme();
8080
const streamChatTheme = useStreamChatTheme();
8181

@@ -141,7 +141,7 @@ const App = () => {
141141
dark: colorScheme === 'dark',
142142
}}
143143
>
144-
<AppContext.Provider value={{ chatClient, loginUser, logout, switchUser, unreadCount }}>
144+
<AppContext.Provider value={{ chatClient, loginUser, logout, switchUser }}>
145145
{isConnecting && !chatClient ? (
146146
<LoadingScreen />
147147
) : chatClient ? (

examples/SampleApp/src/components/UnreadCountBadge.tsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useEffect, useState } from 'react';
22
import { StyleSheet, Text, View } from 'react-native';
33
import { useStateStore, useTheme } from 'stream-chat-react-native';
44

@@ -31,7 +31,30 @@ export const ThreadsUnreadCountBadge: React.FC = () => {
3131
};
3232

3333
export const ChannelsUnreadCountBadge: React.FC = () => {
34-
const { unreadCount } = useAppContext();
34+
const { chatClient } = useAppContext();
35+
const [unreadCount, setUnreadCount] = useState<number>(0);
36+
/**
37+
* Listen to changes in unread counts and update the badge count
38+
*/
39+
useEffect(() => {
40+
const listener = chatClient?.on((e) => {
41+
if (e.total_unread_count !== undefined) {
42+
setUnreadCount(e.total_unread_count);
43+
} else {
44+
const countUnread = Object.values(chatClient.activeChannels).reduce(
45+
(count, channel) => count + channel.countUnread(),
46+
0,
47+
);
48+
setUnreadCount(countUnread);
49+
}
50+
});
51+
52+
return () => {
53+
if (listener) {
54+
listener.unsubscribe();
55+
}
56+
};
57+
}, [chatClient]);
3558

3659
return <UnreadCountBadge unreadCount={unreadCount} />;
3760
};

examples/SampleApp/src/context/AppContext.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ type AppContextType = {
99
loginUser: (config: LoginConfig) => void;
1010
logout: () => void;
1111
switchUser: (userId?: string) => void;
12-
unreadCount: number | undefined;
1312
};
1413

1514
export const AppContext = React.createContext({} as AppContextType);

examples/SampleApp/src/hooks/useChatClient.ts

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ messaging().setBackgroundMessageHandler(async (remoteMessage) => {
7070
export const useChatClient = () => {
7171
const [chatClient, setChatClient] = useState<StreamChat<StreamChatGenerics> | null>(null);
7272
const [isConnecting, setIsConnecting] = useState(true);
73-
const [unreadCount, setUnreadCount] = useState<number>();
7473

7574
const unsubscribePushListenersRef = useRef<() => void>();
7675

@@ -92,9 +91,7 @@ export const useChatClient = () => {
9291
image: config.userImage,
9392
name: config.userName,
9493
};
95-
const connectedUser = await client.connectUser(user, config.userToken);
96-
const initialUnreadCount = connectedUser?.me?.total_unread_count;
97-
setUnreadCount(initialUnreadCount);
94+
await client.connectUser(user, config.userToken);
9895
await AsyncStore.setItem('@stream-rn-sampleapp-login-config', config);
9996

10097
const permissionAuthStatus = await messaging().hasPermission();
@@ -197,35 +194,11 @@ export const useChatClient = () => {
197194
// eslint-disable-next-line react-hooks/exhaustive-deps
198195
}, []);
199196

200-
/**
201-
* Listen to changes in unread counts and update the badge count
202-
*/
203-
useEffect(() => {
204-
const listener = chatClient?.on((e) => {
205-
if (e.total_unread_count !== undefined) {
206-
setUnreadCount(e.total_unread_count);
207-
} else {
208-
const countUnread = Object.values(chatClient.activeChannels).reduce(
209-
(count, channel) => count + channel.countUnread(),
210-
0,
211-
);
212-
setUnreadCount(countUnread);
213-
}
214-
});
215-
216-
return () => {
217-
if (listener) {
218-
listener.unsubscribe();
219-
}
220-
};
221-
}, [chatClient]);
222-
223197
return {
224198
chatClient,
225199
isConnecting,
226200
loginUser,
227201
logout,
228202
switchUser,
229-
unreadCount,
230203
};
231204
};

examples/SampleApp/src/screens/ChannelListScreen.tsx

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo, useRef, useState } from 'react';
1+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
22
import { FlatList, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';
33
import { useNavigation, useScrollToTop } from '@react-navigation/native';
44
import { ChannelList, CircleClose, Search, useTheme } from 'stream-chat-react-native';
@@ -65,6 +65,8 @@ const options = {
6565
watch: true,
6666
};
6767

68+
const HeaderNetworkDownIndicator = () => null;
69+
6870
export const ChannelListScreen: React.FC = () => {
6971
const { chatClient } = useAppContext();
7072
const navigation = useNavigation();
@@ -106,9 +108,24 @@ export const ChannelListScreen: React.FC = () => {
106108
</View>
107109
);
108110

109-
const setScrollRef = (ref: FlatList<Channel<StreamChatGenerics>> | null) => {
111+
const additionalFlatListProps = useMemo(() => ({
112+
getItemLayout: (_, index) => ({
113+
index,
114+
length: 65,
115+
offset: 65 * index,
116+
}),
117+
keyboardDismissMode: 'on-drag',
118+
}), []);
119+
120+
const onSelect = useCallback((channel) => {
121+
navigation.navigate('ChannelScreen', {
122+
channel,
123+
});
124+
}, [navigation]);
125+
126+
const setScrollRef = useCallback( () => (ref: FlatList<Channel<StreamChatGenerics>> | null) => {
110127
scrollRef.current = ref;
111-
};
128+
}, []);
112129

113130
if (!chatClient) {
114131
return null;
@@ -184,22 +201,11 @@ export const ChannelListScreen: React.FC = () => {
184201
<View style={{ flex: searchQuery ? 0 : 1 }}>
185202
<View style={[styles.channelListContainer, { opacity: searchQuery ? 0 : 1 }]}>
186203
<ChannelList<StreamChatGenerics>
187-
additionalFlatListProps={{
188-
getItemLayout: (_, index) => ({
189-
index,
190-
length: 65,
191-
offset: 65 * index,
192-
}),
193-
keyboardDismissMode: 'on-drag',
194-
}}
204+
additionalFlatListProps={additionalFlatListProps}
195205
filters={filters}
196-
HeaderNetworkDownIndicator={() => null}
206+
HeaderNetworkDownIndicator={HeaderNetworkDownIndicator}
197207
maxUnreadCount={99}
198-
onSelect={(channel) => {
199-
navigation.navigate('ChannelScreen', {
200-
channel,
201-
});
202-
}}
208+
onSelect={onSelect}
203209
options={options}
204210
Preview={ChannelPreview}
205211
setFlatListRef={setScrollRef}

0 commit comments

Comments
 (0)