Skip to content

Commit 358a8e0

Browse files
committed
chore: add menu option for pruning a well
1 parent 54104d3 commit 358a8e0

File tree

4 files changed

+94
-27
lines changed

4 files changed

+94
-27
lines changed

examples/SampleApp/App.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import AsyncStore from './src/utils/AsyncStore.ts';
6262
import {
6363
MessageListImplementationConfigItem,
6464
MessageListModeConfigItem,
65+
MessageListPruningConfigItem,
6566
} from './src/components/SecretMenu.tsx';
6667

6768
init({ data });
@@ -101,6 +102,9 @@ const App = () => {
101102
const [messageListMode, setMessageListMode] = useState<
102103
MessageListModeConfigItem['mode'] | undefined
103104
>(undefined);
105+
const [messageListPruning, setMessageListPruning] = useState<
106+
MessageListPruningConfigItem['value'] | undefined
107+
>(undefined);
104108
const colorScheme = useColorScheme();
105109
const streamChatTheme = useStreamChatTheme();
106110

@@ -151,10 +155,15 @@ const App = () => {
151155
'@stream-rn-sampleapp-messagelist-mode',
152156
{ mode: 'default' },
153157
);
158+
const messageListPruningStoredValue = await AsyncStore.getItem(
159+
'@stream-rn-sampleapp-messagelist-pruning',
160+
{ value: undefined },
161+
);
154162
setMessageListImplementation(
155163
messageListImplementationStoredValue?.id as MessageListImplementationConfigItem['id'],
156164
);
157165
setMessageListMode(messageListModeStoredValue?.mode as MessageListModeConfigItem['mode']);
166+
setMessageListPruning(messageListPruningStoredValue?.value as MessageListPruningConfigItem['value']);
158167
};
159168
getMessageListConfig();
160169
return () => {
@@ -218,6 +227,7 @@ const App = () => {
218227
switchUser,
219228
messageListImplementation,
220229
messageListMode,
230+
messageListPruning,
221231
}}
222232
>
223233
{isConnecting && !chatClient ? (

examples/SampleApp/src/components/SecretMenu.tsx

Lines changed: 75 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,36 @@ import {
1414
StyleSheet,
1515
ScrollView,
1616
} from 'react-native';
17-
import { Close, Edit, Notification, Delete, Folder, useTheme } from 'stream-chat-react-native';
17+
import { Close, Edit, Notification, Delete, Folder, ZIP, useTheme } from 'stream-chat-react-native';
1818
import { styles as menuDrawerStyles } from './MenuDrawer.tsx';
1919
import AsyncStore from '../utils/AsyncStore.ts';
2020
import { StreamChat } from 'stream-chat';
2121
import { LabeledTextInput } from '../screens/AdvancedUserSelectorScreen.tsx';
2222

23+
const isAndroid = Platform.OS === 'android';
24+
25+
export type NotificationConfigItem = { label: string; name: string; id: string };
26+
export type MessageListImplementationConfigItem = { label: string; id: 'flatlist' | 'flashlist' };
27+
export type MessageListModeConfigItem = { label: string; mode: 'default' | 'livestream' };
28+
export type MessageListPruningConfigItem = { label: string; value: 100 | 500 | 1000 | undefined };
29+
30+
const messageListImplementationConfigItems: MessageListImplementationConfigItem[] = [
31+
{ label: 'FlatList', id: 'flatlist' },
32+
{ label: 'FlashList', id: 'flashlist' },
33+
];
34+
35+
const messageListModeConfigItems: MessageListModeConfigItem[] = [
36+
{ label: 'Default', mode: 'default' },
37+
{ label: 'Livestreaming', mode: 'livestream' },
38+
];
39+
40+
const messageListPruningConfigItems: MessageListPruningConfigItem[] = [
41+
{ label: 'None', value: undefined },
42+
{ label: '100 Messages', value: 100 },
43+
{ label: '500 Messages', value: 500 },
44+
{ label: '1000 Messages', value: 1000 },
45+
];
46+
2347
export const SlideInView = ({
2448
visible,
2549
children,
@@ -56,12 +80,6 @@ export const SlideInView = ({
5680
);
5781
};
5882

59-
const isAndroid = Platform.OS === 'android';
60-
61-
export type NotificationConfigItem = { label: string; name: string; id: string };
62-
export type MessageListImplementationConfigItem = { label: string; id: 'flatlist' | 'flashlist' };
63-
export type MessageListModeConfigItem = { label: string; mode: 'default' | 'livestream' };
64-
6583
const SecretMenuNotificationConfigItem = ({
6684
notificationConfigItem,
6785
storeProvider,
@@ -160,6 +178,23 @@ const SecretMenuMessageListModeConfigItem = ({
160178
</TouchableOpacity>
161179
);
162180

181+
const SecretMenuMessageListPruningConfigItem = ({
182+
messageListPruningConfigItem,
183+
storeMessageListPruning,
184+
isSelected,
185+
}: {
186+
messageListPruningConfigItem: MessageListPruningConfigItem;
187+
storeMessageListPruning: (item: MessageListPruningConfigItem) => void;
188+
isSelected: boolean;
189+
}) => (
190+
<TouchableOpacity
191+
style={[styles.notificationItemContainer, { borderColor: isSelected ? 'green' : 'gray' }]}
192+
onPress={() => storeMessageListPruning(messageListPruningConfigItem)}
193+
>
194+
<Text style={styles.notificationItem}>{messageListPruningConfigItem.label}</Text>
195+
</TouchableOpacity>
196+
);
197+
163198
/*
164199
* TODO: Please rewrite this entire component.
165200
*/
@@ -177,7 +212,12 @@ export const SecretMenu = ({
177212
const [selectedMessageListImplementation, setSelectedMessageListImplementation] = useState<
178213
MessageListImplementationConfigItem['id'] | null
179214
>(null);
180-
const [selectedMessageListMode, setSelectedMessageListMode] = useState<string | null>(null);
215+
const [selectedMessageListMode, setSelectedMessageListMode] = useState<
216+
MessageListModeConfigItem['mode'] | null
217+
>(null);
218+
const [selectedMessageListPruning, setSelectedMessageListPruning] = useState<
219+
MessageListPruningConfigItem['value'] | null
220+
>(null);
181221
const {
182222
theme: {
183223
colors: { black, grey },
@@ -192,22 +232,6 @@ export const SecretMenu = ({
192232
[],
193233
);
194234

195-
const messageListImplementationConfigItems = useMemo<MessageListImplementationConfigItem[]>(
196-
() => [
197-
{ label: 'FlatList', id: 'flatlist' },
198-
{ label: 'FlashList', id: 'flashlist' },
199-
],
200-
[],
201-
);
202-
203-
const messageListModeConfigItems = useMemo<MessageListModeConfigItem[]>(
204-
() => [
205-
{ label: 'Default', mode: 'default' },
206-
{ label: 'Livestreaming', mode: 'livestream' },
207-
],
208-
[],
209-
);
210-
211235
useEffect(() => {
212236
const getSelectedConfig = async () => {
213237
const notificationProvider = await AsyncStore.getItem(
@@ -222,14 +246,19 @@ export const SecretMenu = ({
222246
'@stream-rn-sampleapp-messagelist-mode',
223247
messageListModeConfigItems[0],
224248
);
249+
const messageListPruning = await AsyncStore.getItem(
250+
'@stream-rn-sampleapp-messagelist-pruning',
251+
messageListPruningConfigItems[0],
252+
);
225253
setSelectedProvider(notificationProvider?.id ?? notificationConfigItems[0].id);
226254
setSelectedMessageListImplementation(
227255
messageListImplementation?.id ?? messageListImplementationConfigItems[0].id,
228256
);
229257
setSelectedMessageListMode(messageListMode?.mode ?? messageListModeConfigItems[0].mode);
258+
setSelectedMessageListPruning(messageListPruning?.value);
230259
};
231260
getSelectedConfig();
232-
}, [messageListModeConfigItems, notificationConfigItems, messageListImplementationConfigItems]);
261+
}, [notificationConfigItems]);
233262

234263
const storeProvider = useCallback(async (item: NotificationConfigItem) => {
235264
await AsyncStore.setItem('@stream-rn-sampleapp-push-provider', item);
@@ -249,6 +278,11 @@ export const SecretMenu = ({
249278
setSelectedMessageListMode(item.mode);
250279
}, []);
251280

281+
const storeMessageListPruning = useCallback(async (item: MessageListPruningConfigItem) => {
282+
await AsyncStore.setItem('@stream-rn-sampleapp-messagelist-pruning', item);
283+
setSelectedMessageListPruning(item.value);
284+
}, []);
285+
252286
const removeAllDevices = useCallback(async () => {
253287
const { devices } = await chatClient.getDevices(chatClient.userID);
254288
for (const device of devices ?? []) {
@@ -317,6 +351,22 @@ export const SecretMenu = ({
317351
</View>
318352
</View>
319353
</View>
354+
<View style={[menuDrawerStyles.menuItem, { alignItems: 'flex-start' }]}>
355+
<ZIP height={20} pathFill={grey} width={20} />
356+
<View>
357+
<Text style={[menuDrawerStyles.menuTitle]}>Message List pruning</Text>
358+
<View style={{ marginLeft: 16 }}>
359+
{messageListPruningConfigItems.map((item) => (
360+
<SecretMenuMessageListPruningConfigItem
361+
key={item.value ?? 0}
362+
messageListPruningConfigItem={item}
363+
storeMessageListPruning={storeMessageListPruning}
364+
isSelected={item.value === selectedMessageListPruning}
365+
/>
366+
))}
367+
</View>
368+
</View>
369+
</View>
320370
<TouchableOpacity onPress={removeAllDevices} style={menuDrawerStyles.menuItem}>
321371
<Delete height={24} size={24} pathFill={grey} width={24} />
322372
<Text

examples/SampleApp/src/context/AppContext.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ import React from 'react';
33
import type { StreamChat } from 'stream-chat';
44

55
import type { LoginConfig } from '../types';
6-
import { MessageListImplementationConfigItem, MessageListModeConfigItem } from '../components/SecretMenu.tsx';
6+
import {
7+
MessageListImplementationConfigItem,
8+
MessageListModeConfigItem,
9+
MessageListPruningConfigItem,
10+
} from '../components/SecretMenu.tsx';
711

812
type AppContextType = {
913
chatClient: StreamChat | null;
@@ -12,6 +16,7 @@ type AppContextType = {
1216
switchUser: (userId?: string) => void;
1317
messageListImplementation: MessageListImplementationConfigItem['id'];
1418
messageListMode: MessageListModeConfigItem['mode'];
19+
messageListPruning: MessageListPruningConfigItem['value'];
1520
};
1621

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

examples/SampleApp/src/screens/ChannelScreen.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ export const ChannelScreen: React.FC<ChannelScreenProps> = ({
119119
params: { channel: channelFromProp, channelId, messageId },
120120
},
121121
}) => {
122-
const { chatClient, messageListImplementation, messageListMode } = useAppContext();
122+
const { chatClient, messageListImplementation, messageListMode, messageListPruning } =
123+
useAppContext();
123124
const navigation = useNavigation();
124125
const { bottom } = useSafeAreaInsets();
125126
const {
@@ -215,6 +216,7 @@ export const ChannelScreen: React.FC<ChannelScreenProps> = ({
215216
messageId={messageId}
216217
NetworkDownIndicator={() => null}
217218
thread={selectedThread}
219+
maximumMessageLimit={messageListPruning}
218220
>
219221
<ChannelHeader channel={channel} />
220222
{messageListImplementation === 'flashlist' ? (

0 commit comments

Comments
 (0)