Up to date working Google Places Input. Calling directly API not JS SDK.
Adding loading indicator for a place details request.
New configuration props:
- query - Custom query value for a text field
New configuration props:
- contentScrollViewBottom - Custom content at the bottom of scroll view list with results
- contentScrollViewTop - Custom content at the bottom of scroll view list with results
yarn add react-native-places-input
or
npm install react-native-places-input
Fairly easy. Few required props but most of the work is already done in a component.
import PlacesInput from 'react-native-places-input';
And inside a component
<PlacesInput
googleApiKey={GOOGLE_API_KEY}
onSelect={place => console.log(place)}
/>
class InputWrapper extends React.Component {
render() {
return (
<View style={{ width: '100%' }}>
<PlacesInput
googleApiKey={GOOGLE_API_KEY}
placeHolder={"Some Place holder"}
language={"en-US"}
onSelect={place => {
this.props.goToPoint(get(place, 'result.geometry.location.lat'), get(place, 'result.geometry.location.lng'))
}}
iconResult={<Ionicons name="md-pin" size={25} style={styles.placeIcon}/>}
/>
</View>
);
}
}
List of props supported by a component
Prop | Type | Default | Description |
---|---|---|---|
googleApiKey | PropTypes.string.isRequired | Google API key | |
iconInput | any | Icon added to an input | |
iconResult | any | Icon added to results | |
language | string | en | Language for google API call |
placeHolder | string | Search places... | placeholder for an input |
query | string | Custom text field value on init | |
querySession | string | A random string which identifies an autocomplete session for billing purposes. If this parameter is omitted from an autocomplete request, the request is billed independently. See the pricing sheet for details. | |
queryTypes | string | You may restrict results from a Place Autocomplete request to be of a certain type by passing a types parameter. Google docs | |
queryFields | string | formatted_address,geometry,name | Fields requested from Google API |
queryCountries | array | Array of country codes to limit results | |
resultRender | func | place => place.description | Function to render results text |
searchLatitude | number | Lat to limit results | |
searchLongitude | number | Lng to limit results | |
searchRadius | number | radius to limit results | |
stylesContainer | object | {} | Custom styles for a container |
stylesInput | object | {} | Custom styles for an input |
stylesItem | object | {} | Custom styles for an item |
stylesItemText | object | {} | Custom styles for an item text |
stylesList | object | {} | Custom styles for a list |
stylesLoading | object, | {} | Custom styles for a loading indicator |
textInputProps | object | {} | Custom TextInput props |
requiredCharactersBeforeSearch | number | 2 | Component wont fetch places unless string length is equal this prop |
requiredTimeBeforeSearch | number | 1000 | Idle time on text input before component will fetch places |
onSelect | func | Function called when you select a place | |
onChangeText | func | Method triggered when TextInput is changed. Returning query and this. |
<PlacesInput
placeHolder={'Some placeholder'}
stylesContainer={{
position: 'relative',
alignSelf: 'stretch',
margin: 0,
top: 0,
left: 0,
right: 0,
bottom: 0,
shadowOpacity: 0,
borderColor: '#dedede',
borderWidth: 1,
marginBottom: 10
}}
stylesList={{
top: 50,
borderColor: '#dedede',
borderLeftWidth: 1,
borderRightWidth: 1,
borderBottomWidth: 1,
left: -1,
right: -1
}}
googleApiKey={GOOGLE_API_KEY}
onSelect={place => this.setState({place})}
/>
<PlacesInput
placeHolder={'Some placeholder'}
queryCountries={['pl', 'fr']}
googleApiKey={GOOGLE_API_KEY}
onSelect={place => this.setState({place})}
/>
<PlacesInput
placeHolder={'Some placeholder'}
searchRadius={500}
searchLatitude={51.905070}
searchLongitude={19.458834}
googleApiKey={GOOGLE_API_KEY}
onSelect={place => this.setState({place})}
/>
<PlacesInput
placeHolder={'Some placeholder'}
queryTypes="establishment"
googleApiKey={GOOGLE_API_KEY}
onSelect={place => this.setState({place})}
/>
If on click is not working and component is inside a ScrollView make sure to add keyboardShouldPersistTaps = always.
<ScrollView
keyboardShouldPersistTaps="always"