Skip to content

Commit 7b5e921

Browse files
committed
Add extendableBadgeContainer prop.
1 parent 67e605e commit 7b5e921

File tree

5 files changed

+92
-23
lines changed

5 files changed

+92
-23
lines changed

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ declare module 'react-native-dropdown-picker' {
265265
testID?: string;
266266
closeOnBackPressed?: boolean;
267267
hideSelectedItemIcon?: boolean;
268+
extendableBadgeContainer?: boolean;
268269
}
269270

270271
interface DropDownPickerSingleProps<T> {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-dropdown-picker",
3-
"version": "5.3.0",
3+
"version": "5.4.0-beta.0",
44
"description": "A single / multiple, categorizable, customizable, localizable and searchable item picker (drop-down) component for react native which supports both Android & iOS.",
55
"keywords": [
66
"picker",

src/components/Picker.js

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ function Picker({
158158
theme = THEMES.DEFAULT,
159159
testID,
160160
closeOnBackPressed = false,
161+
extendableBadgeContainer = false,
161162
onSelectItem = (item) => {}
162163
}) {
163164
const [necessaryItems, setNecessaryItems] = useState([]);
@@ -1039,10 +1040,10 @@ function Picker({
10391040
), [_badgeSeparatorStyle]);
10401041

10411042
/**
1042-
* The label container.
1043+
* The label container style.
10431044
* @returns {object}
10441045
*/
1045-
const labelContainer = useMemo(() => ([
1046+
const labelContainerStyle = useMemo(() => ([
10461047
THEME.labelContainer, rtl && {
10471048
transform: [
10481049
{scaleX: -1}
@@ -1055,12 +1056,12 @@ function Picker({
10551056
* @returns {JSX.Element}
10561057
*/
10571058
const BadgeListEmptyComponent = useCallback(() => (
1058-
<View style={labelContainer}>
1059+
<View style={labelContainerStyle}>
10591060
<Text style={_labelStyle} {...labelProps}>
10601061
{_placeholder}
10611062
</Text>
10621063
</View>
1063-
), [_labelStyle, labelContainer, labelProps, _placeholder]);
1064+
), [_labelStyle, labelContainerStyle, labelProps, _placeholder]);
10641065

10651066
/**
10661067
* Set ref.
@@ -1069,26 +1070,73 @@ function Picker({
10691070
badgeFlatListRef.current = ref;
10701071
}, []);
10711072

1073+
/**
1074+
* The extendable badge container style.
1075+
* @returns {object}
1076+
*/
1077+
const extendableBadgeContainerStyle = useMemo(() => ([
1078+
RTL_DIRECTION(rtl, THEME.extendableBadgeContainer)
1079+
]), [rtl, THEME]);
1080+
1081+
/**
1082+
* The extendable badge item container style.
1083+
* @returns {object}
1084+
*/
1085+
const extendableBadgeItemContainerStyle = useMemo(() => ([
1086+
THEME.extendableBadgeItemContainer, rtl && {
1087+
marginEnd: 0,
1088+
marginStart: THEME.extendableBadgeItemContainer.marginEnd
1089+
}
1090+
]), [rtl, THEME]);
1091+
1092+
/**
1093+
* Extendable badge container.
1094+
* @returns {JSX.Element}
1095+
*/
1096+
const ExtendableBadgeContainer = useCallback(({selectedItems}) => {
1097+
if (selectedItems.length > 0) {
1098+
return (
1099+
<View style={extendableBadgeContainerStyle}>
1100+
{selectedItems.map((item, index) => (
1101+
<View key={index} style={extendableBadgeItemContainerStyle}>
1102+
<__renderBadge item={item} />
1103+
</View>
1104+
))}
1105+
</View>
1106+
);
1107+
}
1108+
1109+
return <BadgeListEmptyComponent />;
1110+
}, [__renderBadge, extendableBadgeContainerStyle, extendableBadgeItemContainerStyle]);
1111+
10721112
/**
10731113
* The badge body component.
10741114
* @returns {JSX.Element}
10751115
*/
1076-
const BadgeBodyComponent = useMemo(() => (
1077-
<FlatList
1078-
ref={setBadgeFlatListRef}
1079-
data={selectedItems}
1080-
renderItem={__renderBadge}
1081-
horizontal={true}
1082-
showsHorizontalScrollIndicator={false}
1083-
keyExtractor={keyExtractor}
1084-
ItemSeparatorComponent={BadgeSeparatorComponent}
1085-
ListEmptyComponent={BadgeListEmptyComponent}
1086-
style={THEME.listBody}
1087-
contentContainerStyle={THEME.listBodyContainer}
1088-
inverted={rtl}
1089-
/>
1090-
), [
1116+
const BadgeBodyComponent = useMemo(() => {
1117+
if (extendableBadgeContainer) {
1118+
return <ExtendableBadgeContainer selectedItems={selectedItems} />
1119+
}
1120+
1121+
return (
1122+
<FlatList
1123+
ref={setBadgeFlatListRef}
1124+
data={selectedItems}
1125+
renderItem={__renderBadge}
1126+
horizontal={true}
1127+
showsHorizontalScrollIndicator={false}
1128+
keyExtractor={keyExtractor}
1129+
ItemSeparatorComponent={BadgeSeparatorComponent}
1130+
ListEmptyComponent={BadgeListEmptyComponent}
1131+
style={THEME.listBody}
1132+
contentContainerStyle={THEME.listBodyContainer}
1133+
inverted={rtl}
1134+
/>
1135+
);
1136+
}, [
10911137
rtl,
1138+
extendableBadgeContainer,
1139+
ExtendableBadgeContainer,
10921140
selectedItems,
10931141
__renderBadge,
10941142
keyExtractor,
@@ -1765,4 +1813,4 @@ const styles = StyleSheet.create({
17651813
}
17661814
});
17671815

1768-
export default memo(Picker);
1816+
export default memo(Picker);

src/themes/dark/index.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ export default StyleSheet.create({
2020
alignItems: 'center',
2121
justifyContent: 'space-between',
2222
width: '100%',
23-
height: 50,
23+
minHeight: 50,
2424
borderRadius: 8,
2525
borderWidth: 1,
2626
borderColor: Colors.BLACK,
2727
paddingHorizontal: 10,
28+
paddingVertical: 3,
2829
backgroundColor: Colors.EBONY_CLAY,
2930
},
3031
label: {
@@ -170,5 +171,14 @@ export default StyleSheet.create({
170171
modalTitle: {
171172
fontSize: 18,
172173
color: Colors.HEATHER
174+
},
175+
extendableBadgeContainer: {
176+
flexDirection: 'row',
177+
flexWrap: 'wrap',
178+
flex: 1
179+
},
180+
extendableBadgeItemContainer: {
181+
marginVertical: 3,
182+
marginEnd: 7
173183
}
174184
});

src/themes/light/index.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ export default StyleSheet.create({
2020
alignItems: 'center',
2121
justifyContent: 'space-between',
2222
width: '100%',
23-
height: 50,
23+
minHeight: 50,
2424
borderRadius: 8,
2525
borderWidth: 1,
2626
borderColor: Colors.BLACK,
2727
paddingHorizontal: 10,
28+
paddingVertical: 3,
2829
backgroundColor: Colors.WHITE
2930
},
3031
label: {
@@ -169,5 +170,14 @@ export default StyleSheet.create({
169170
modalTitle: {
170171
fontSize: 18,
171172
color: Colors.BLACK
173+
},
174+
extendableBadgeContainer: {
175+
flexDirection: 'row',
176+
flexWrap: 'wrap',
177+
flex: 1
178+
},
179+
extendableBadgeItemContainer: {
180+
marginVertical: 3,
181+
marginEnd: 7
172182
}
173183
});

0 commit comments

Comments
 (0)