1.3.5 • Published 4 years ago

@mrizki/react-native-modal-filter-picker v1.3.5

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

react-native-modal-filter-picker

npm Join the chat at https://discord.gg/bYt4tWB Follow on Twitter

Demo

A cross-platform (iOS, Android) modal picker for React Native.

Features:

  • Cross-platform (iOS, Android)
  • Default styling works well
  • Extensively customisable styling and rendering
  • Built-in search filter for long lists
  • Uses React Native ListView for lazy-loading and high performance
  • Compatible with React Native 0.40+
  • Successfully used in production apps

Installation

Use NPM/Yarn to install package: react-native-modal-filter-picker

Usage

A basic demo:

import { Component, View, Text, TouchableOpacity } from 'react-native'

import ModalFilterPicker from 'react-native-modal-filter-picker'


export default class App extends Component {
  constructor (props, ctx) {
    super(props, ctx);

    this.state = {
      visible: false,
      picked: null,
    };
  }

  render() {
    const { visible, picked } = this.state;

    const options = [
      {
        key: 'kenya',
        label: 'Kenya',
      },
      {
        key: 'uganda',
        label: 'Uganda',
      },
      {
        key: 'libya',
        label: 'Libya',
      },
      {
        key: 'morocco',
        label: 'Morocco',
      },
      {
        key: 'estonia',
        label: 'Estonia',
      },
    ];

    return (
      <View style={styles.container}>
        <TouchableOpacity style={styles.buttonContainer} onPress={this.onShow}>
          <Text>Select country</Text>
        </TouchableOpacity>      
        <Text style={appStyles.label}>Selected:</Text>
        <Text>{picked}</Text>
        <ModalFilterPicker
          visible={visible}
          onSelect={this.onSelect}
          onCancel={this.onCancel}
          options={options}
        />
      </View>
    );
  }

  onShow = () => {
    this.setState({ visible: true });
  }

  onSelect = (picked) => {
    this.setState({
      picked: picked,
      visible: false
    })
  }

  onCancel = () => {
    this.setState({
      visible: false
    });
  }
}

Options

The following functionality props can be passed to the component:

Prop nameTypeDefaultDescription
optionsArray of { key, label }(required)The options to display in the list
onSelectfunction (key) {}(required)Callback for when an option is chosen
onCancelfunction () {}(required)Callback for when the cancel button is pressed
placeholderTextString"Filter..."Placeholder text for filter input text field
placeholderTextColorString"#ccc"Color of placeholder text for filter input text field
androidUnderlineColorString"rgba(0,0,0,0)"Android text underline color of filter input text field
cancelButtonTextString"Cancel"Cancel button text
titleStringnullTitle text which appears above options list
noResultsTextString"No matches"Text to show when there are no results for filter
visibleBooleantrueWhether to show modal or not. This allows you to control when the picker is shown and/or hidden.
showFilterBooleantrueWhether to show filter text field field or not
modalObjectnullOptions to pass to native Modal component
selectedOptionStringnullThe currently selected option, to visually differentiate it from others
listViewPropsObjectnullProperties to pass to the rendered ListView
renderOptionfunction (option, isSelected) {}nullCustom option renderer
renderListfunction () {}nullCustom option list renderer
renderCancelButtonfunction () {}nullCustom cancel button renderer
keyboardShouldPersistTapsnever/always/handleneverDetermines when the keyboard should stay visible after a tap. If never, tapping outside of the focused text input when the keyboard is up dismisses the keyboard. When this happens, children won't receive the tap. If always, the keyboard will not dismiss automatically, and the scroll view will not catch taps, but children of the scroll view can catch taps. If handled, the keyboard will not dismiss automatically when the tap was handled by a children, (or captured by an ancestor).
autoFocusBooleanfalseIf true, focuses the input on componentDidMount().

In addition, the following styling props (each of which must be an Object consisting of styles) can be passed in:

Prop nameDescription
overlayStyleStyle for the background modal overlay
listContainerStyleStyle for the View wrapping the options list
filterTextInputContainerStyleStyle for the View wrapping the filter input text field
filterTextInputStyleStyle for the filter input text field
cancelContainerStyleStyle for the View wrapping the cancel button
cancelButtonStyleStyle for the cancel button button face
cancelButtonTextStyleStyle for the cancel button text
titleTextStyleStyle for the title text
optionTextStyleStyle for the option text

Advanced filtering

By default the filter input field allows you to filter by the option label that's displayed on the screen.

But you can also attach a searchKey attribute to each option for the filtering algorithm to use. For example, we can allow the user to filter by continent as well as country name, even though we don't display the continent name:

render() {
  const { visible } = this.state;

  const options = [
    {
      key: 'kenya',
      label: 'Kenya',
      searchKey: 'Africa',
    },
    {
      key: 'uganda',
      label: 'Uganda',
      searchKey: 'Africa',
    },
    {
      key: 'libya',
      label: 'Libya',
      searchKey: 'Africa',
    },
    {
      key: 'japan',
      label: 'Japan',
      searchKey: 'Asia',
    },
    {
      key: 'estonia',
      label: 'Estonia',
      searchKey: 'Europe',
    },
  ];

  return (
    <View style={styles.container}>
      <ModalFilterPicker
        onSelect={this.onSelect}
        onCancel={this.onCancel}
        options={options}
      />
    </View>
  );
}

If you run the above example, you will be able to type africa into the filter input field to see all the countries within Africa.

Note: Filtering is case-insensitive

License

MIT