import _ from 'lodash'; import React, {useCallback, useState, useRef} from 'react'; import {StyleSheet} from 'react-native'; import { SortableList, SortableListItemProps, View, TouchableOpacity, Text, Icon, Assets, Colors, Button } from 'react-native-ui-lib'; import {renderHeader} from '../ExampleScreenPresenter'; interface Item extends SortableListItemProps { text: string; } const data: Item[] = _.times(30, index => { let text = `${index}`; if (index === 3) { text = 'Locked item'; } return { text, id: `${index}`, locked: index === 3 }; }); const SortableListScreen = () => { const [items, setItems] = useState(data); const [selectedItems, setSelectedItems] = useState([]); const [removedItems, setRemovedItems] = useState([]); const orderedItems = useRef(data); const toggleItemSelection = useCallback((item: Item) => { if (selectedItems.includes(item)) { setSelectedItems(selectedItems.filter(selectedItem => ![item.id].includes(selectedItem.id))); } else { setSelectedItems(selectedItems.concat(item)); } }, [selectedItems, setSelectedItems]); const addItem = useCallback(() => { if (removedItems.length > 0) { orderedItems.current = orderedItems.current.concat(removedItems[0]); setItems(orderedItems.current); setRemovedItems(removedItems.slice(1)); } }, [removedItems, setItems, setRemovedItems]); const removeSelectedItems = useCallback(() => { setRemovedItems(removedItems.concat(selectedItems)); setSelectedItems([]); orderedItems.current = orderedItems.current.filter(item => !selectedItems.includes(item)); setItems(orderedItems.current); }, [setRemovedItems, removedItems, selectedItems, setItems, setSelectedItems]); const keyExtractor = useCallback((item: Item) => { return `${item.id}`; }, []); const onOrderChange = useCallback((newData: Item[]) => { console.log('New order:', newData); orderedItems.current = newData; }, []); const renderItem = useCallback(({item, index: _index}: {item: Item; index: number}) => { const isSelected = selectedItems.includes(item); const {locked} = item; const Container = locked ? View : TouchableOpacity; return ( toggleItemSelection(item)} // overriding the BG color to anything other than white will cause Android's elevation to fail // backgroundColor={Colors.red30} centerV centerH={locked} paddingH-page > {!locked && } {item.text} {!locked && } ); }, [selectedItems, toggleItemSelection]); return ( {renderHeader('Sortable List', {'margin-10': true})}