diff --git a/src/index.js b/src/index.js
index 2b307a3f..e3830545 100644
--- a/src/index.js
+++ b/src/index.js
@@ -7,11 +7,13 @@ import {
ScrollView,
Platform,
TextInput,
- ViewPropTypes
+ FlatList,
+ ViewPropTypes,
+ LogBox
} from 'react-native';
// Icon
-import Feather from 'react-native-vector-icons/Feather';
+import { Feather } from '@expo/vector-icons';
Feather.loadFont();
class DropDownPicker extends React.Component {
@@ -21,7 +23,7 @@ class DropDownPicker extends React.Component {
let choice;
let items = [];
let defaultValueIndex; // captures index of first defaultValue for initial scrolling
- if (! props.multiple) {
+ if (!props.multiple) {
if (props.defaultValue || props.defaultValue === 0) {
choice = props.items.find(item => item.value === props.defaultValue);
} else if (props.items.filter(item => item.hasOwnProperty('selected') && item.selected === true).length > 0) {
@@ -64,11 +66,11 @@ class DropDownPicker extends React.Component {
static getDerivedStateFromProps(props, state) {
// Change default value (! multiple)
- if (! state.props.multiple && props.defaultValue !== state.props.defaultValue) {
+ if (!state.props.multiple && props.defaultValue !== state.props.defaultValue) {
const { label, value, icon } = props.defaultValue === null ? {
label: null,
value: null,
- icon: () => {}
+ icon: () => { }
} : props.items.find(item => item.value === props.defaultValue);
return {
choice: {
@@ -93,11 +95,11 @@ class DropDownPicker extends React.Component {
}
return {
- choice: items,
- props: {
- ...state.props,
- defaultValue: props.defaultValue
- }
+ choice: items,
+ props: {
+ ...state.props,
+ defaultValue: props.defaultValue
+ }
}
}
@@ -141,7 +143,7 @@ class DropDownPicker extends React.Component {
y: this.dropdownCoordinates[this.state.defaultValueIndex],
animated: true,
});
- this.setState({initialScroll: false});
+ this.setState({ initialScroll: false });
}, 200);
}
}
@@ -155,20 +157,20 @@ class DropDownPicker extends React.Component {
return {
label: null,
value: null,
- icon: () => {}
+ icon: () => { }
}
}
toggle() {
this.setState({
- isVisible: ! this.state.isVisible,
+ isVisible: !this.state.isVisible,
}, () => {
const isVisible = this.state.isVisible;
if (isVisible) {
- this.open(false);
- } else {
- this.close(false);
- }
+ this.open(false);
+ } else {
+ this.close(false);
+ }
});
}
@@ -214,7 +216,7 @@ class DropDownPicker extends React.Component {
});
}
- removeItem(value, {changeDefaultValue = true} = {}) {
+ removeItem(value, { changeDefaultValue = true } = {}) {
const items = [...this.props.items].filter(item => item.value !== value);
this.setPropState({
items
@@ -235,7 +237,7 @@ class DropDownPicker extends React.Component {
});
}
- setPropState(data, callback = () => {}) {
+ setPropState(data, callback = () => { }) {
this.props.onChangeList(data.items, callback);
}
@@ -245,13 +247,13 @@ class DropDownPicker extends React.Component {
open(setState = true) {
this.setState({
- ...(setState && {isVisible: true})
+ ...(setState && { isVisible: true })
}, () => this.props.onOpen());
}
close(setState = true) {
this.setState({
- ...(setState && {isVisible: false}),
+ ...(setState && { isVisible: false }),
searchableText: null
}, () => this.props.onClose());
}
@@ -279,7 +281,7 @@ class DropDownPicker extends React.Component {
select(item) {
const { multiple } = this.state.props;
- if (! multiple) {
+ if (!multiple) {
this.setState({
choice: {
label: item.label,
@@ -317,7 +319,7 @@ class DropDownPicker extends React.Component {
}
// onClose callback (! multiple)
- if (! multiple)
+ if (!multiple)
this.props.onClose();
}
@@ -344,7 +346,7 @@ class DropDownPicker extends React.Component {
}
isSelected(item) {
- return this.state.choice.findIndex(a => a.value === item.value) > -1;
+ return this.state.choice.findIndex(a => a.value === item.value) > -1;
}
getLabel(item, selected = false) {
@@ -360,15 +362,77 @@ class DropDownPicker extends React.Component {
} else {
return item;
}
-
+
let len2 = label.length;
return label + (len !== len2 ? '...' : '');
}
+ componentDidMount() {
+ LogBox.ignoreLogs(['VirtualizedLists should never be nested']);
+ }
+
render() {
this.props.controller(this);
+
+ // Item
+ const Item = ({ item, index }) => (
+ {
+ const layout = event.nativeEvent.layout;
+ this.dropdownCoordinates[index] = layout.y;
+ }}
+ >
+ this.select(item)}
+ style={[styles.dropDownItem, this.props.itemStyle, (
+ this.state.choice.value === item.value && this.props.activeItemStyle
+ ), {
+ opacity: item?.disabled || false === true ? 0.3 : 1,
+ alignItems: 'center',
+ ...(
+ multiple ? {
+ justifyContent: 'space-between',
+ ...(this.isSelected(item) && this.props.activeItemStyle)
+ } : {
+
+ }
+ )
+ }]}
+ disabled={item?.disabled || false === true}
+ >
+
+ {item.icon && item.icon()}
+
+ {this.getLabel(item)}
+
+
+
+ {
+ this.state.props.multiple && this.state.choice.findIndex(i => i.label === item.label && i.value === item.value) > -1 && (
+ this.props.customTickIcon()
+ )
+ }
+
+
+ )
const { multiple, disabled } = this.state.props;
- const { placeholder, scrollViewProps, searchTextInputProps, renderSeperator} = this.props;
+ const { placeholder, scrollViewProps, searchTextInputProps } = this.props;
const isPlaceholderActive = this.state.choice.label === null;
const label = isPlaceholderActive ? (placeholder) : this.getLabel(this.state.choice?.label, true);
const placeholderStyle = isPlaceholderActive && this.props.placeholderStyle;
@@ -378,9 +442,9 @@ class DropDownPicker extends React.Component {
return (
- {this.state.choice.icon && ! multiple && this.state.choice.icon()}
-
- {multiple ? (
- this.state.choice.length > 0 ? this.getNumberOfItems() : placeholder
- ) : label}
-
+ {this.state.choice.icon && !multiple && this.state.choice.icon()}
+
+ {multiple ? (
+ this.state.choice.length > 0 ? this.getNumberOfItems() : placeholder
+ ) : label}
+
{this.props.showArrow && (
-
- {
- ! this.state.isVisible ? (
- this.props.customArrowDown(this.props.arrowSize, this.props.arrowColor)
- ) : (
- this.props.customArrowUp(this.props.arrowSize, this.props.arrowColor)
- )
- }
+
+ {
+ !this.state.isVisible ? (
+ this.props.customArrowDown(this.props.arrowSize, this.props.arrowColor)
+ ) : (
+ this.props.customArrowUp(this.props.arrowSize, this.props.arrowColor)
+ )
+ }
)}
@@ -431,101 +495,53 @@ class DropDownPicker extends React.Component {
styles.dropDown,
styles.dropDownBox,
this.props.dropDownStyle,
- ! this.state.isVisible && styles.hidden, {
+ !this.state.isVisible && styles.hidden, {
top: this.state.top,
maxHeight: this.props.dropDownMaxHeight,
zIndex: this.props.zIndex
}
]}>
{
- this.props.searchable && (
-
- {
- this.setState({
- searchableText: text
- })
- if(searchTextInputProps.onChangeText) searchTextInputProps.onChangeText(text);
- }}
- />
-
- )
+ this.props.searchable && (
+
+ {
+ this.setState({
+ searchableText: text
+ })
+ if (searchTextInputProps.onChangeText) searchTextInputProps.onChangeText(text);
+ }}
+ />
+
+ )
}
- {
- this.scrollViewRef = ref;
- }}
- {...scrollViewProps}>
- {items.filter(item => typeof item.hidden === 'undefined' || item.hidden === false).length > 0 ? items.map((item, index) => (
- {
- const layout = event.nativeEvent.layout;
- this.dropdownCoordinates[index] = layout.y;
- }}
- >
- this.select(item)}
- style={[styles.dropDownItem, this.props.itemStyle, (
- this.state.choice.value === item.value && this.props.activeItemStyle
- ), {
- opacity: item?.disabled || false === true ? 0.3 : 1,
- alignItems: 'center',
- ...(
- multiple ? {
- justifyContent: 'space-between',
- ...(this.isSelected(item) && this.props.activeItemStyle)
- } : {
-
- }
- )
- }]}
- disabled={item?.disabled || false === true}
- >
-
- {item.icon && item.icon()}
-
- {this.getLabel(item)}
-
-
-
- {
- this.state.props.multiple && this.state.choice.findIndex(i => i.label === item.label && i.value === item.value) > -1 && (
- this.props.customTickIcon()
- )
- }
-
- {renderSeperator && index !== items.length - 1 && renderSeperator()}
-
- )) : (
+ {items.filter(item => typeof item.hidden === 'undefined' || item.hidden === false).length > 0
+ ?
+ item.value.toString()}
+ renderItem={({ item, index }) => (
+
+ )}
+ nestedScrollEnabled={true}
+ ref={ref => {
+ this.scrollViewRef = ref;
+ }}
+ />
+ :
+ (
{this.props.searchableError()}
- )}
-
+ )
+ }
+
);
@@ -568,11 +584,11 @@ DropDownPicker.defaultProps = {
labelLength: 1000,
scrollViewProps: {},
searchTextInputProps: {},
- controller: () => {},
- onOpen: () => {},
- onClose: () => {},
- onChangeItem: () => {},
- onChangeList: () => {},
+ controller: () => { },
+ onOpen: () => { },
+ onClose: () => { },
+ onChangeItem: () => { },
+ onChangeList: () => { },
};
// DropDownPicker.propTypes = {
@@ -656,12 +672,12 @@ const styles = StyleSheet.create({
justifyContent: 'center'
},
input: {
- flex: 1,
- borderColor: '#dfdfdf',
- borderBottomWidth: 1,
- paddingHorizontal: 0,
- paddingVertical: 8,
- marginBottom: 10,
+ flex: 1,
+ borderColor: '#dfdfdf',
+ borderBottomWidth: 1,
+ paddingHorizontal: 0,
+ paddingVertical: 8,
+ marginBottom: 10,
},
hidden: {
position: 'relative',
@@ -679,4 +695,4 @@ const styles = StyleSheet.create({
}
});
-export default DropDownPicker;
+export default DropDownPicker;
\ No newline at end of file