1
1
import _ from 'lodash' ;
2
- import React , { useCallback } from 'react' ;
2
+ import React , { useCallback , useState , useRef } from 'react' ;
3
3
import { 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' ;
5
5
import { renderHeader } from '../ExampleScreenPresenter' ;
6
6
7
7
interface Item {
8
8
originalIndex : number ;
9
+ id : string ;
9
10
}
10
11
11
12
const data = _ . times ( 30 , index => {
12
13
return {
13
- originalIndex : index
14
+ originalIndex : index ,
15
+ id : `${ index } `
14
16
} ;
15
17
} ) ;
16
18
17
19
const 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
+
18
48
const keyExtractor = useCallback ( ( item : Item ) => {
19
- return `${ item . originalIndex } ` ;
49
+ return `${ item . id } ` ;
20
50
} , [ ] ) ;
21
51
22
52
const onOrderChange = useCallback ( ( newData : Item [ ] ) => {
23
53
console . log ( 'New order:' , newData ) ;
54
+ orderedItems . current = newData ;
24
55
} , [ ] ) ;
25
56
26
57
const renderItem = useCallback ( ( { item, index : _index } : { item : Item ; index : number } ) => {
58
+ const isSelected = selectedItems . includes ( item ) ;
27
59
return (
28
60
< 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 ) }
31
63
// overriding the BG color to anything other than white will cause Android's elevation to fail
32
64
// backgroundColor={Colors.red30}
33
65
centerV
34
- marginH -page
66
+ paddingH -page
35
67
>
36
68
< View flex row spread centerV >
37
69
< Icon source = { Assets . icons . demo . drag } tintColor = { Colors . $iconDisabled } />
@@ -42,13 +74,17 @@ const SortableListScreen = () => {
42
74
</ View >
43
75
</ TouchableOpacity >
44
76
) ;
45
- } , [ ] ) ;
77
+ } , [ selectedItems , toggleItemSelection ] ) ;
46
78
47
79
return (
48
80
< View flex bg-$backgroundDefault >
49
81
{ 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 >
50
86
< View flex useSafeArea >
51
- < SortableList data = { data } renderItem = { renderItem } keyExtractor = { keyExtractor } onOrderChange = { onOrderChange } />
87
+ < SortableList data = { items } renderItem = { renderItem } keyExtractor = { keyExtractor } onOrderChange = { onOrderChange } />
52
88
</ View >
53
89
</ View >
54
90
) ;
@@ -60,5 +96,9 @@ const styles = StyleSheet.create({
60
96
height : 52 ,
61
97
borderColor : Colors . $outlineDefault ,
62
98
borderBottomWidth : 1
99
+ } ,
100
+ selectedItemContainer : {
101
+ borderLeftColor : Colors . $outlinePrimary ,
102
+ borderLeftWidth : 5
63
103
}
64
104
} ) ;
0 commit comments