React Native Item Select

Sometimes selecting items from dropdowns or checkboxes just don't cut it. You may need a fancy grid item picker. May be this highly customizable List Grid item(s) picker for React Native is what you're looking for.

Installation

npm install --save react-native-item-select

Features :tada:

  • List or Grid. If Grid, customizable no of items per row.
  • Multiselect supported.
  • Validation for minimum & maximum no of items to be selected.
  • Fine-grained style control.
  • Preselect items.
  • Provision to implement search.

Demo

You can see the code for the GIF files given above at this repo.

Example

import React, {Component} from 'react';
import { Text, View } from 'react-native';
import ReactNativeItemSelect from 'react-native-item-select';

class LanguageSelectionScreen extends Component {
  render() {
    const textStyle = { textAlign: 'center', color: '#696969', fontWeight: 'bold' };
    const data = [
      { firstLetter: 'அ', displayName: 'தமிழ்', name: 'Tamil' },
      { firstLetter: 'A', displayName: 'English', name: 'English' },
      ...
    ];

    return (
      <ReactNativeItemSelect
        data={data}
        itemComponent={
          item => (
            <View>
                <Text style={{ ...textStyle, fontSize: 35 }}>{item.firstLetter}</Text>
                <Text style={textStyle}>{item.displayName}</Text>
            </View>
          )
        }
        onSubmit={item => navigate('Result')}
      />
    );
  }
}

Props

We can divide props into two types. One is mandatory other one is optional. Without optional props, this library will work properly with its default values. However, you've to pass all required props.

Required Props

Name Type Description
data Array Array of items you pass to itemComponent callback.
itemComponent Function Takes 2 parameters and returns a React element. Two paramerts, (item, selected). item: data prop item, selected: boolean that suggests whether the item is selected. selected boolean is useful when you want to alter the content if it is selected.
onSubmit Function Callback function that consumes selected item(s).

Optional Props

Name Type Default Description
multiselect Boolean false Pass this to enable multiselect
countPerRow Number 2 No of items to display per row, pass 1 for list view
floatSubmitBtn Boolean false When the number of items increase, you may want to float the submit button at the botton of the screen. Pass this prop to do so.
lastRowMargin Number 50 This only takes effect when you float submit button. Most often floating button will hinder the view of last row. This is to avoid it.
submitBtnTitle String Submit Change submit button title
minSelectCount Number 1 Valid only when multiselect is enabled. Minimum number of items to be selected to enable submit button.
maxSelectCount Number null Valid only when multiselect is enabled. To set max limit on the number of items selected. Displays an alert when user tries to select more items.
maxSelectAlertTxt String Check description To change the alert text. Default: You can't select more than N items.
tickStyle String Check description Valid params: check, overlayCheck. For single select check is default. overlayCheck is default for multiselect
tickPosition String Check description Default values: single select - topRight, multiselect - middle. However, you can override the default by passing custom value. Valid params: topLeft, topRight, topMiddle, bottomLeft, bottomRight, bottomMiddle, middle, leftMiddle, rightMiddle
submitBtnWidth Number 100 This number represents percentage width. So, to set the width to 50% just pass 50.
tickTxt String Pass some string to change the tick string rendered.
extraItemHighlighProps Object {} This is to alter existing prop value or to add new values to the TouchableHighlight component that encloses your itemComponent.
extraBtnOpacityProps Object {} Use this to pass props to TouchableOpacity that encloses the submit button.
styles Object {} For custom styling you can use this prop. Refer styling section.
searchKey String null If you want to implement search, you've to pass this prop. Check search implementation section.

Preselect Items

In some cases, you may want to preselect items when ReactNativeItemSelect renders. That can be achieved by setting selected property of the items in data array. In the following example, Apple & Orange are preselected.

Example

<ReactNativeItemSelect
    data={[
      { name: 'Apple', selected: true},
      { name: 'Banana' },
      { name: 'Orange', selected: true}
    ]}
    itemComponent={this.itemComponent}
    onSubmit={this.onSubmit}
/>

Styling

You can alter the styles of any component of this library by passing appropriate prop. For now you can use 11 keys in styles prop to customize the look. They are, btn, btnOpacity, btnTxt, disabledBtnOpacity, disabledBtn, disabledBtnTxt, itemBoxHighlight, activeItemBoxHighlight, tickTxt, itemComponentWrapper, rowWrapper

Example

In the following component, styles prop will change the color of submit button, tick background and selected items border color to material blue.

<ReactNativeItemSelect
    data={data}
    itemComponent={this.itemComponent}
    onSubmit={this.onSubmit}
    styles={
        {
            btn: { backgroundColor: '#2196F3' },
            disabledBtn: { backgroundColor: '#2196F3' },
            tickTxt: { backgroundColor: '#2196F3' },
            activeItemBoxHighlight: { borderColor: '#2196F3' },
        }
    }
/>

btn, disabledBtn

For the Button View. You can use any of the View style props. Use disabledBtn key to style the button when it is in disabled state and use btn for enabled button.

btnOpacity, disabledBtnOpacity

For the TouchableOpacity that encloses the button view. You can use any View style props.

btnTxt, disabledBtnTxt

Use this to style the text inside submit button. Refer Text style props.

itemBoxHighlight, activeItemBoxHighlight

You can use this to style the TouchableHighlight which wraps your item component. All border styling must go here. You can use any View style props here.

itemComponentWrapper

This is a View that wraps your item component. Wrapping order is like this TouchableHighlight > View > itemComponent. You can use this to get rid of the padding inside box. Refer View style props.

tickTxt

You can use this to alter the View the encloses your tick character. Tick color is changed here. Refer Text style props.

rowWrapper

Used to alter the style of the View that wraps the items in a row. Refer View style props.

Search Implementation

To make ReactNativeItemSelect more customizable, styling & implementation of text box for search has to be implemented by the user. You can easily implement search by making use of the state of the parent component. You need to pass searchKey prop to make search work. Just make sure the value of the searchKey is unique for all items. For your better understanding, search has already been implemented in the customized example of demo app - source code.

NOTE: Search implementation is not part of the GIF shown above. Search feature was added after the creation of demo GIF.

GitHub