Skip to content

Commit eb67794

Browse files
committed
Fix issue with missing selected indicator in Picker items (#1065)
1 parent e91e9ef commit eb67794

File tree

4 files changed

+13
-5
lines changed

4 files changed

+13
-5
lines changed

demo/src/screens/componentScreens/PickerScreen.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import _ from 'lodash';
22
import React, {Component} from 'react';
33
import {ScrollView, Image} from 'react-native';
44
import {View, Colors, Dialog, Text, Picker, Avatar, Assets, PanningProvider} from 'react-native-ui-lib'; //eslint-disable-line
5-
import contacts from '../../data/conversations';
5+
import contactsData from '../../data/conversations';
66
import tagIcon from '../../assets/icons/tags.png';
77
import dropdown from '../../assets/icons/chevronDown.png';
88

9+
const contacts = _.map(contactsData, c => ({...c, value: c.name, label: c.name}));
10+
911
const options = [
1012
{label: 'JavaScript', value: 'js'},
1113
{label: 'Java', value: 'java'},
@@ -248,7 +250,7 @@ export default class PickerScreen extends Component {
248250
// useNativePicker
249251
>
250252
{_.map(options, option => (
251-
<Picker.Item key={option.value} value={option.value} label={option.label} disabled={option.disabled} />
253+
<Picker.Item key={option.value} value={option.value} label={option.label} disabled={option.disabled}/>
252254
))}
253255
</Picker>
254256
</View>

src/components/picker/PickerItem.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ const PickerItem = props => {
3131
const context = useContext(PickerContext);
3232
const {migrate} = context;
3333
const customRenderItem = context.renderItem || props.renderItem;
34-
const isSelected = isItemSelected(value, !migrate && _.isPlainObject(context.value) ? context.value.value : context.value);
34+
const itemValue = !migrate && _.isPlainObject(value) ? value?.value : value;
35+
const isSelected = isItemSelected(itemValue, context.value);
3536
const itemLabel = getItemLabel(label, value, props.getItemLabel || context.getItemLabel);
3637
const accessibilityProps = {
3738
accessibilityState: isSelected ? {selected: true} : undefined,

src/components/picker/PickerPresenter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ export function isItemSelected(childValue, selectedValue) {
44
let isSelected = false;
55

66
if (Array.isArray(selectedValue)) {
7-
isSelected = _.includes(selectedValue, childValue);
7+
isSelected = !!_.find(selectedValue, v => {
8+
return v === childValue || v?.value === childValue;
9+
});
810
} else {
911
isSelected = childValue === selectedValue;
1012
}

src/components/picker/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
// TODO: deprecate all places where we check if _.isPlainObject
2+
// TODO: deprecate getItemValue prop
3+
// TODO: deprecate getItemLabel prop
24
import _ from 'lodash';
35
import PropTypes from 'prop-types';
46
import React, {PureComponent} from 'react';
@@ -209,9 +211,10 @@ class Picker extends PureComponent {
209211
getContextValue = () => {
210212
const {value, searchValue} = this.state;
211213
const {migrate, mode, getItemValue, getItemLabel, renderItem, showSearch} = this.props;
214+
const pickerValue = !migrate && _.isPlainObject(value) ? value?.value : value;
212215
return {
213216
migrate,
214-
value,
217+
value: pickerValue,
215218
onPress: mode === Picker.modes.MULTI ? this.toggleItemSelection : this.onDoneSelecting,
216219
isMultiMode: mode === Picker.modes.MULTI,
217220
getItemValue,

0 commit comments

Comments
 (0)