11import _ from 'lodash' ;
2- import React , { useCallback } from 'react' ;
2+ import React , { useCallback , useState , useRef } from 'react' ;
33import { StyleSheet } from 'react-native' ;
4- import { SortableList , View , TouchableOpacity , Text , Icon , Assets , Colors } from 'react-native-ui-lib' ;
4+ import { SortableList , View , TouchableOpacity , Text , Icon , Assets , Colors , Button } from 'react-native-ui-lib' ;
55import { renderHeader } from '../ExampleScreenPresenter' ;
66
77interface Item {
88 originalIndex : number ;
9+ id : string ;
910}
1011
1112const data = _ . times ( 30 , index => {
1213 return {
13- originalIndex : index
14+ originalIndex : index ,
15+ id : `${ index } `
1416 } ;
1517} ) ;
1618
1719const SortableListScreen = ( ) => {
20+ const [ items , setItems ] = useState < Item [ ] > ( data ) ;
21+ const [ selectedItems , setSelectedItems ] = useState < Item [ ] > ( [ ] ) ;
22+ const [ removedItems , setRemovedItems ] = useState < Item [ ] > ( [ ] ) ;
23+ const orderedItems = useRef < Item [ ] > ( data ) ;
24+
25+ const toggleItemSelection = useCallback ( ( item : Item ) => {
26+ if ( selectedItems . includes ( item ) ) {
27+ setSelectedItems ( selectedItems . filter ( selectedItem => ! [ item . id ] . includes ( selectedItem . id ) ) ) ;
28+ } else {
29+ setSelectedItems ( selectedItems . concat ( item ) ) ;
30+ }
31+ } , [ selectedItems , setSelectedItems ] ) ;
32+
33+ const addItem = useCallback ( ( ) => {
34+ if ( removedItems . length > 0 ) {
35+ orderedItems . current = orderedItems . current . concat ( removedItems [ 0 ] ) ;
36+ setItems ( orderedItems . current ) ;
37+ setRemovedItems ( removedItems . slice ( 1 ) ) ;
38+ }
39+ } , [ removedItems , setItems , setRemovedItems ] ) ;
40+
41+ const removeSelectedItems = useCallback ( ( ) => {
42+ setRemovedItems ( removedItems . concat ( selectedItems ) ) ;
43+ setSelectedItems ( [ ] ) ;
44+ orderedItems . current = orderedItems . current . filter ( item => ! selectedItems . includes ( item ) ) ;
45+ setItems ( orderedItems . current ) ;
46+ } , [ setRemovedItems , removedItems , selectedItems , setItems , setSelectedItems ] ) ;
47+
1848 const keyExtractor = useCallback ( ( item : Item ) => {
19- return `${ item . originalIndex } ` ;
49+ return `${ item . id } ` ;
2050 } , [ ] ) ;
2151
2252 const onOrderChange = useCallback ( ( newData : Item [ ] ) => {
2353 console . log ( 'New order:' , newData ) ;
54+ orderedItems . current = newData ;
2455 } , [ ] ) ;
2556
2657 const renderItem = useCallback ( ( { item, index : _index } : { item : Item ; index : number } ) => {
58+ const isSelected = selectedItems . includes ( item ) ;
2759 return (
2860 < TouchableOpacity
29- style = { styles . itemContainer }
30- onPress = { ( ) => console . log ( 'Original index is' , item . originalIndex ) }
61+ style = { [ styles . itemContainer , isSelected && styles . selectedItemContainer ] }
62+ onPress = { ( ) => toggleItemSelection ( item ) }
3163 // overriding the BG color to anything other than white will cause Android's elevation to fail
3264 // backgroundColor={Colors.red30}
3365 centerV
34- marginH -page
66+ paddingH -page
3567 >
3668 < View flex row spread centerV >
3769 < Icon source = { Assets . icons . demo . drag } tintColor = { Colors . $iconDisabled } />
@@ -42,13 +74,17 @@ const SortableListScreen = () => {
4274 </ View >
4375 </ TouchableOpacity >
4476 ) ;
45- } , [ ] ) ;
77+ } , [ selectedItems , toggleItemSelection ] ) ;
4678
4779 return (
4880 < View flex bg-$backgroundDefault >
4981 { renderHeader ( 'Sortable List' , { 'margin-10' : true } ) }
82+ < View row center marginB-s2 >
83+ < Button label = "Add Item" size = { Button . sizes . xSmall } disabled = { removedItems . length === 0 } onPress = { addItem } />
84+ < Button label = "Remove Items" size = { Button . sizes . xSmall } disabled = { selectedItems . length === 0 } marginL-s3 onPress = { removeSelectedItems } />
85+ </ View >
5086 < View flex useSafeArea >
51- < SortableList data = { data } renderItem = { renderItem } keyExtractor = { keyExtractor } onOrderChange = { onOrderChange } />
87+ < SortableList data = { items } renderItem = { renderItem } keyExtractor = { keyExtractor } onOrderChange = { onOrderChange } />
5288 </ View >
5389 </ View >
5490 ) ;
@@ -60,5 +96,9 @@ const styles = StyleSheet.create({
6096 height : 52 ,
6197 borderColor : Colors . $outlineDefault ,
6298 borderBottomWidth : 1
99+ } ,
100+ selectedItemContainer : {
101+ borderLeftColor : Colors . $outlinePrimary ,
102+ borderLeftWidth : 5
63103 }
64104} ) ;
0 commit comments