@@ -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' ;
1818import { styles as menuDrawerStyles } from './MenuDrawer.tsx' ;
1919import AsyncStore from '../utils/AsyncStore.ts' ;
2020import { StreamChat } from 'stream-chat' ;
2121import { 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+
2347export 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-
6583const 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
0 commit comments