Skip to content

Commit 0edcacd

Browse files
committed
feat: improve attachment picker context usage
2 parents d71cb3f + 8d44cae commit 0edcacd

File tree

17 files changed

+483
-663
lines changed

17 files changed

+483
-663
lines changed

examples/SampleApp/App.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,11 @@ const isMessageAIGenerated = (message: LocalMessage) => !!message.ai_generated;
169169
const DrawerNavigatorWrapper: React.FC<{
170170
chatClient: StreamChat;
171171
}> = ({ chatClient }) => {
172-
const { bottom } = useSafeAreaInsets();
173172
const streamChatTheme = useStreamChatTheme();
174173

175174
return (
176175
<GestureHandlerRootView style={{ flex: 1 }}>
177-
<OverlayProvider bottomInset={bottom} value={{ style: streamChatTheme }}>
176+
<OverlayProvider value={{ style: streamChatTheme }}>
178177
<Chat
179178
client={chatClient}
180179
enableOfflineSupport

examples/SampleApp/src/components/ScreenHeader.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import React, { useEffect } from 'react';
1+
import React from 'react';
22
import { StyleProp, StyleSheet, Text, TouchableOpacity, View, ViewStyle } from 'react-native';
33
import { CompositeNavigationProp, useNavigation } from '@react-navigation/native';
44
import { useSafeAreaInsets } from 'react-native-safe-area-context';
5-
import { useAttachmentPickerContext, useTheme } from 'stream-chat-react-native';
5+
import { useTheme } from 'stream-chat-react-native';
66

77
import { ChannelsUnreadCountBadge } from './UnreadCountBadge';
88

@@ -122,13 +122,6 @@ export const ScreenHeader: React.FC<ScreenHeaderProps> = (props) => {
122122
},
123123
} = useTheme();
124124
const insets = useSafeAreaInsets();
125-
const { setTopInset } = useAttachmentPickerContext();
126-
127-
useEffect(() => {
128-
if (setTopInset) {
129-
setTopInset(HEADER_CONTENT_HEIGHT + insets.top);
130-
}
131-
}, [insets.top, setTopInset]);
132125

133126
return (
134127
<View

examples/SampleApp/src/screens/ThreadScreen.tsx

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
import React, { useEffect } from 'react';
1+
import React from 'react';
22
import { StyleSheet, View } from 'react-native';
33
import { SafeAreaView } from 'react-native-safe-area-context';
4-
import {
5-
Channel,
6-
Thread,
7-
ThreadType,
8-
useAttachmentPickerContext,
9-
useTheme,
10-
useTypingString,
11-
} from 'stream-chat-react-native';
4+
import { Channel, Thread, ThreadType, useTheme, useTypingString } from 'stream-chat-react-native';
125
import { useStateStore } from 'stream-chat-react-native';
136

147
import { ScreenHeader } from '../components/ScreenHeader';
@@ -65,13 +58,6 @@ export const ThreadScreen: React.FC<ThreadScreenProps> = ({
6558
colors: { white },
6659
},
6760
} = useTheme();
68-
const { setSelectedImages } = useAttachmentPickerContext();
69-
70-
useEffect(() => {
71-
setSelectedImages([]);
72-
return () => setSelectedImages([]);
73-
// eslint-disable-next-line react-hooks/exhaustive-deps
74-
}, []);
7561

7662
return (
7763
<SafeAreaView style={[styles.container, { backgroundColor: white }]}>

examples/TypeScriptMessaging/App.tsx

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { I18nManager, LogBox, Platform, SafeAreaView, useColorScheme, View } fro
33
import { DarkTheme, DefaultTheme, NavigationContainer, RouteProp } from '@react-navigation/native';
44
import { createStackNavigator, StackNavigationProp } from '@react-navigation/stack';
55
import { useHeaderHeight } from '@react-navigation/elements';
6-
import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context';
6+
import { SafeAreaProvider } from 'react-native-safe-area-context';
77
import { Channel as ChannelType, ChannelSort } from 'stream-chat';
88
import {
99
Channel,
@@ -16,7 +16,6 @@ import {
1616
Streami18n,
1717
Thread,
1818
ThreadContextValue,
19-
useAttachmentPickerContext,
2019
useCreateChatClient,
2120
useOverlayContext,
2221
} from 'stream-chat-react-native';
@@ -53,11 +52,7 @@ const filters = {
5352
type: 'messaging',
5453
};
5554

56-
const sort: ChannelSort = [
57-
{ pinned_at: -1 },
58-
{ last_message_at: -1 },
59-
{ updated_at: -1 },
60-
];
55+
const sort: ChannelSort = [{ pinned_at: -1 }, { last_message_at: -1 }, { updated_at: -1 }];
6156

6257
/**
6358
* Start playing with streami18n instance here:
@@ -100,7 +95,6 @@ const EmptyHeader = () => <></>;
10095
const ChannelScreen: React.FC<ChannelScreenProps> = ({ navigation }) => {
10196
const { channel, setThread, thread } = useContext(AppContext);
10297
const headerHeight = useHeaderHeight();
103-
const { setTopInset } = useAttachmentPickerContext();
10498
const { overlay } = useOverlayContext();
10599

106100
useEffect(() => {
@@ -109,10 +103,6 @@ const ChannelScreen: React.FC<ChannelScreenProps> = ({ navigation }) => {
109103
});
110104
}, [overlay, navigation]);
111105

112-
useEffect(() => {
113-
setTopInset(headerHeight);
114-
}, [headerHeight, setTopInset]);
115-
116106
if (channel === undefined) {
117107
return null;
118108
}
@@ -193,16 +183,13 @@ const Stack = createStackNavigator<NavigationParamsList>();
193183
type AppContextType = {
194184
channel: ChannelType | undefined;
195185
setChannel: React.Dispatch<React.SetStateAction<ChannelType | undefined>>;
196-
setThread: React.Dispatch<
197-
React.SetStateAction<ThreadContextValue['thread'] | undefined>
198-
>;
186+
setThread: React.Dispatch<React.SetStateAction<ThreadContextValue['thread'] | undefined>>;
199187
thread: ThreadContextValue['thread'] | undefined;
200188
};
201189

202190
const AppContext = React.createContext({} as AppContextType);
203191

204192
const App = () => {
205-
const { bottom } = useSafeAreaInsets();
206193
const theme = useStreamChatTheme();
207194
const { channel } = useContext(AppContext);
208195

@@ -217,11 +204,7 @@ const App = () => {
217204
}
218205

219206
return (
220-
<OverlayProvider
221-
bottomInset={bottom}
222-
i18nInstance={streami18n}
223-
value={{ style: theme }}
224-
>
207+
<OverlayProvider i18nInstance={streami18n} value={{ style: theme }}>
225208
<Chat client={chatClient} i18nInstance={streami18n} enableOfflineSupport>
226209
<Stack.Navigator
227210
initialRouteName='ChannelList'

package/src/components/AttachmentPicker/AttachmentPicker.tsx

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@ import type { AttachmentPickerErrorProps } from './components/AttachmentPickerEr
1111

1212
import { renderAttachmentPickerItem } from './components/AttachmentPickerItem';
1313

14-
import {
15-
AttachmentPickerContextValue,
16-
useAttachmentPickerContext,
17-
} from '../../contexts/attachmentPickerContext/AttachmentPickerContext';
14+
import { useAttachmentPickerContext } from '../../contexts/attachmentPickerContext/AttachmentPickerContext';
15+
import { MessageInputContextValue } from '../../contexts/messageInputContext/MessageInputContext';
1816
import { useTheme } from '../../contexts/themeContext/ThemeContext';
1917
import { useScreenDimensions } from '../../hooks/useScreenDimensions';
2018
import { NativeHandlers } from '../../native';
@@ -31,7 +29,7 @@ const styles = StyleSheet.create({
3129
});
3230

3331
export type AttachmentPickerProps = Pick<
34-
AttachmentPickerContextValue,
32+
MessageInputContextValue,
3533
| 'AttachmentPickerBottomSheetHandle'
3634
| 'attachmentPickerBottomSheetHandleHeight'
3735
| 'attachmentSelectionBarHeight'
@@ -91,17 +89,8 @@ export const AttachmentPicker = React.forwardRef(
9189
colors: { white },
9290
},
9391
} = useTheme();
94-
const {
95-
closePicker,
96-
maxNumberOfFiles,
97-
selectedFiles,
98-
selectedImages,
99-
selectedPicker,
100-
setSelectedFiles,
101-
setSelectedImages,
102-
setSelectedPicker,
103-
topInset,
104-
} = useAttachmentPickerContext();
92+
const { closePicker, selectedPicker, setSelectedPicker, topInset } =
93+
useAttachmentPickerContext();
10594
const { vh: screenVh } = useScreenDimensions();
10695

10796
const fullScreenHeight = screenVh(100);
@@ -187,8 +176,7 @@ export const AttachmentPicker = React.forwardRef(
187176
const backHandler = BackHandler.addEventListener('hardwareBackPress', backAction);
188177

189178
return () => backHandler.remove();
190-
// eslint-disable-next-line react-hooks/exhaustive-deps
191-
}, [selectedPicker, closePicker]);
179+
}, [selectedPicker, closePicker, setSelectedPicker]);
192180

193181
useEffect(() => {
194182
const onKeyboardOpenHandler = () => {
@@ -212,8 +200,7 @@ export const AttachmentPicker = React.forwardRef(
212200
Keyboard.removeListener(keyboardShowEvent, onKeyboardOpenHandler);
213201
}
214202
};
215-
// eslint-disable-next-line react-hooks/exhaustive-deps
216-
}, [closePicker, selectedPicker]);
203+
}, [closePicker, selectedPicker, setSelectedPicker]);
217204

218205
useEffect(() => {
219206
if (currentIndex < 0) {
@@ -246,16 +233,7 @@ export const AttachmentPicker = React.forwardRef(
246233
const selectedPhotos = photos.map((asset) => ({
247234
asset,
248235
ImageOverlaySelectedComponent,
249-
maxNumberOfFiles,
250236
numberOfAttachmentPickerImageColumns,
251-
numberOfUploads: selectedFiles.length + selectedImages.length,
252-
selected:
253-
selectedImages.some((image) => (image?.uri ? image.uri === asset.uri : false)) ||
254-
selectedFiles.some((file) => (file?.uri ? file.uri === asset.uri : false)),
255-
selectedFiles,
256-
selectedImages,
257-
setSelectedFiles,
258-
setSelectedImages,
259237
}));
260238

261239
const handleHeight = attachmentPickerBottomSheetHandleHeight;

0 commit comments

Comments
 (0)