import React from 'react'; import { View, Text, StyleSheet, Image, TouchableOpacity, ScrollView, Animated, TextInput, } from 'react-native'; import { SelectListProps } from '..'; type L1Keys = { key?: any; value?: any; disabled?: boolean | undefined } const SelectList: React.FC = ({ setSelected, placeholder, boxStyles, inputStyles, dropdownStyles, dropdownItemStyles, dropdownTextStyles, maxHeight, data, defaultOption, searchicon = false, arrowicon = false, closeicon = false, search = true, searchPlaceholder = "search", notFoundText = "No data found", disabledItemStyles, disabledTextStyles, onSelect = () => {}, save = 'key', dropdownShown = false, fontFamily }) => { const oldOption = React.useRef(null) const [_firstRender,_setFirstRender] = React.useState(true); const [dropdown, setDropdown] = React.useState(dropdownShown); const [selectedval, setSelectedVal] = React.useState(""); const [height,setHeight] = React.useState(200) const animatedvalue = React.useRef(new Animated.Value(0)).current; const [filtereddata,setFilteredData] = React.useState(data) const slidedown = () => { setDropdown(true) Animated.timing(animatedvalue,{ toValue:height, duration:500, useNativeDriver:false, }).start() } const slideup = () => { Animated.timing(animatedvalue,{ toValue:0, duration:500, useNativeDriver:false, }).start(() => setDropdown(false)) } React.useEffect( () => { if(maxHeight) setHeight(maxHeight) },[maxHeight]) React.useEffect(() => { setFilteredData(data); },[data]) React.useEffect(() => { if(_firstRender){ _setFirstRender(false); return; } onSelect() },[selectedval]) React.useEffect(() => { if(!_firstRender && defaultOption && oldOption.current != defaultOption.key ){ // oldOption.current != null oldOption.current = defaultOption.key setSelected(defaultOption.key); setSelectedVal(defaultOption.value); } if(defaultOption && _firstRender && defaultOption.key != undefined){ oldOption.current = defaultOption.key setSelected(defaultOption.key); setSelectedVal(defaultOption.value); } },[defaultOption]) React.useEffect(() => { if(!_firstRender){ if(dropdownShown) slidedown(); else slideup(); } },[dropdownShown]) return( { (dropdown && search) ? { (!searchicon) ? : searchicon } { let result = data.filter((item: L1Keys) => { val.toLowerCase(); let row = item.value.toLowerCase() return row.search(val.toLowerCase()) > -1; }); setFilteredData(result) }} style={[{padding:0,height:20,flex:1,fontFamily},inputStyles]} /> slideup()} > { (!closeicon) ? : closeicon } : { if(!dropdown){ slidedown() }else{ slideup() } }}> { (selectedval == "") ? (placeholder) ? placeholder : 'Select option' : selectedval } { (!arrowicon) ? : arrowicon } } { (dropdown) ? { (filtereddata.length >= 1) ? filtereddata.map((item: L1Keys,index: number) => { let key = item.key ?? item.value ?? item; let value = item.value ?? item; let disabled = item.disabled ?? false; if(disabled){ return( {}}> {value} ) }else{ return( { if(save === 'value'){ setSelected(value); }else{ setSelected(key) } setSelectedVal(value) slideup() setTimeout(() => {setFilteredData(data)}, 800) }}> {value} ) } }) : { setSelected(undefined) setSelectedVal("") slideup() setTimeout(() => setFilteredData(data), 800) }}> {notFoundText} } : null } ) } export default SelectList; const styles = StyleSheet.create({ wrapper:{ borderWidth:1,borderRadius:10,borderColor:'gray',paddingHorizontal:20,paddingVertical:12,flexDirection:'row',justifyContent:'space-between' }, dropdown:{ borderWidth:1,borderRadius:10,borderColor:'gray',marginTop:10,overflow:'hidden'}, option:{ paddingHorizontal:20,paddingVertical:8,overflow:'hidden' }, disabledoption:{ paddingHorizontal:20,paddingVertical:8,flexDirection:'row',alignItems:'center', backgroundColor:'whitesmoke',opacity:0.9} })