react-places-autocomplete-promisfied v1.0.2
react-places-autocomplete
A React component to build a customized UI for Google Maps Places Autocomplete (Demo)
Features
- Enable you to easily build a customized autocomplete dropdown powered by Google Maps Places Library
- Utility function to get latitude and longitude using Google Maps Geocoder API
- Pass through arbitrary props to the input element to integrate well with other libraries (e.g. Redux-Form)
Installation
To install the stable version
yarn add react-places-autocompleteor
npm install react-places-autocomplete --saveThe React component is exported as a default export
import PlacesAutocomplete from 'react-places-autocomplete'geocodeByAddress and geocodeByPlaceId utility functions are named exports
import { geocodeByAddress, geocodeByPlaceId } from 'react-places-autocomplete'Demo
See live demo: kenny-hibino.github.io/react-places-autocomplete/
To build the example locally, clone this repo and then run:
npm run demoGetting Started
To use this component, you are going to need to load Google Maps JavaScript API
Load the library in your project
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"></script>Declare your PlacesAutocomplete component using React component
import React from 'react'
import PlacesAutocomplete, { geocodeByAddress } from 'react-places-autocomplete'
class SimpleForm extends React.Component {
constructor(props) {
super(props)
this.state = { address: 'San Francisco, CA' }
this.onChange = (address) => this.setState({ address })
}
handleFormSubmit = (event) => {
event.preventDefault()
geocodeByAddress(this.state.address, (err, latLng) => {
if (err) { console.log('Oh no!', err) }
console.log(`Yay! Got latitude and longitude for ${address}`, latLng)
})
}
render() {
const inputProps = {
value: this.state.address,
onChange: this.onChange,
}
return (
<form onSubmit={this.handleFormSubmit}>
<PlacesAutocomplete inputProps={inputProps} />
<button type="submit">Submit</button>
</form>
)
}
}
export default SimpleFormProps for PlacesAutocomplete
Require Props:
Optional Props:
inputProps
Type: Object,
Required: true
PlacesAutocomplete is a controlled component. Therefore, you MUST pass at least value and onChange callback to the input element.
You can pass arbitrary props to the input element thorough inputProps object (NOTE: className and style props for the input element should be passed through classNames.input and styles.input respectively).
const inputProps = {
value, // `value` is required
onChange, // `onChange` is required
onBlur: () => {
console.log('blur!')
},
type: 'search',
placeholder: 'Search Places...',
autoFocus: true,
}autocompleteItem
Type: Functional React Component,
Required: false
The function takes props with suggestion, formattedSuggestion keys (see the example below).
We highly recommend that you create your own custom AutocompleteItem and pass it as a prop.
/***********************************************
Example #1
autocompleteItem example with `suggestion`
************************************************/
render() {
const AutocompleteItem = ({ suggestion }) => (<div><i className="fa fa-map-marker"/>{suggestion}</div>)
return (
<PlacesAutocomplete
inputProps={inputProps}
autocompleteItem={AutocompleteItem}
/>
)
}
/***************************************************
Example #2
autocompleteItem example with `formattedSuggestion`
****************************************************/
render() {
const AutocompleteItem = ({ formattedSuggestion }) => (
<div>
<strong>{ formattedSuggestion.mainText }</strong>{' '}
<small>{ formattedSuggestion.secondaryText }</small>
</div>
)
return (
<PlacesAutocomplete
inputProps={inputProps}
autocompleteItem={AutocompleteItem}
/>
)
}classNames
Type: Object,
Required: false
You can give a custom css classes to elements.
Accepted keys are root, input, autocompleteContainer, autocompleteItem, autocompleteItemActive.
If you pass classNames props, none of the default inline styles nor inline styles from styles prop will
be applied to the element, and you will have full control over styling via CSS.
// classNames example
render() {
const cssClasses = {
root: 'form-group',
input: 'form-control',
autocompleteContainer: 'my-autocomplete-container'
}
return (
<PlacesAutocomplete
inputProps={inputProps}
classNames={cssClasses}
/>
)
}Now you can easily apply custom CSS styles using the classNames!
styles
Type Object,
Required: false
You can provide custom inline styles to elements.
Accepted keys are root, input, autocompleteContainer, autocompleteItem, autocompleteItemActive.
const defaultStyles = {
root: {
position: 'relative',
paddingBottom: '0px',
},
input: {
display: 'inline-block',
width: '100%',
padding: '10px',
},
autocompleteContainer: {
position: 'absolute',
top: '100%',
backgroundColor: 'white',
border: '1px solid #555555',
width: '100%',
},
autocompleteItem: {
backgroundColor: '#ffffff',
padding: '10px',
color: '#555555',
cursor: 'pointer',
},
autocompleteItemActive: {
backgroundColor: '#fafafa'
}
}Object passed via styles prop will be merged in with the above defaults and applied to their respective elements.
NOTE: Passing classNames will disable any inline styling for respective elements.
// custom style examples
render() {
const myStyles = {
root: { position: 'absolute' },
input: { width: '100%' },
autocompleteContainer: { backgroundColor: 'green' },
autocompleteItem: { color: 'black' },
autocompleteItemActive: { color: 'blue' }
}
return (
<PlacesAutocomplete
inputProps={inputProps}
styles={myStyles}
/>
)
}onError
Type: Function
Required: false
You can pass onError prop to customize the behavior when google.maps.places.PlacesServiceStatus is not OK (e.g., no predictions are found)
Function takes status as a parameter
clearItemsOnError
Type: Boolean
Required: false
Default: false
You can pass clearItemsOnError prop to indicate whether the autocomplete predictions should be cleared when google.maps.places.PlacesServiceStatus is not OK
onSelect
Type: Function
Required: false,
Default: null
You can pass a function that gets called instead of onChange function when user
hits the Enter key or clicks on an autocomplete item.
The function takes two positional arguments. First argument is address, second is placeId.
const handleSelect = (address, placeId) => {
this.setState({ address, placeId })
// You can do other things with address string or placeId. For example, geocode :)
}
// Pass this function via onSelect prop.
<PlacesAutocomplete
inputProps={inputProps}
onSelect={this.handleSelect}
/>onEnterKeyDown
Type: Function
Required: false
Deafult: noop
You can pass a callback function that gets called when pressing down Enter key when no item in the dropdown is selected.
The function takes one argument, the value in the input field.
const handleEnter = (address) => {
geocodeByAddress(address, (err, { lat, lng }, results) => {
if (err) { console.error('Error'); return; }
console.log("Geocode success", { lat, lng })
})
}
// Pass this function via onEnterKeyDown prop.
<PlacesAutocomplete
inputProps={inputProps}
onEnterKeyDown={this.handleEnter}
/>options
Type: Object
Required: false
Default: {}
You can fine-tune the settings passed to the AutocompleteService class with options prop.
This prop accepts an object following the same format as google.maps.places.AutocompletionRequest
(except for input, which comes from the value of the input field).
// these options will bias the autocomplete predictions toward Sydney, Australia with a radius of 2000 meters,
// and limit the results to addresses only
const options = {
location: new google.maps.LatLng(-34, 151),
radius: 2000,
types: ['address']
}
<PlacesAutocomplete
inputProps={inputProps}
options={options}
/>geocodeByAddress API
geocodeByAddress(address)Arguments
address
Type: String
Required: true
String that gets passed to Google Maps Geocoder
Returns
Promise
- Resolves with:
latLng(Object) andresults(Object) - when geocoding is successful. - Rejects with:
err(Object) andresults(Object) - when geocoding is unsuccessful.
import { geocodeByAddress } from 'react-places-autocomplete'
geocodeByAddress('Los Angeles, CA')
.then(({ latLng, results }) => {
console.log('Geocoding success!', latLng)
console.log('Entire payload from Google API', results)
})
.catch(({ error, results }) => {
console.error(`Geocoding failed!\nStatus: ${error.status}\nResults: ${results}`);
return null;
})geocodeByPlaceId API
geocodeByPlaceId(placeId)Arguments
placeId
Type: String
Required: true
String that gets passed to Google Maps Geocoder
Returns
Promise
- Resolves with:
latLng(Object) andresults(Object) - when geocoding is successful. - Rejects with:
err(Object) andresults(Object) - when geocoding is unsuccessful.
import { geocodeByPlaceId } from 'react-places-autocomplete'
geocodeByPlaceId('ChIJE9on3F3HwoAR9AhGJW_fL-I')
.then(({ latLng, results }) => {
console.log('Geocoding success!', latLng)
console.log('Entire payload from Google API', results)
})
.catch(({ error, results }) => {
console.error(`Geocoding failed!\nStatus: ${error.status}\nResults: ${results}`);
return null;
})Discussion
Join us on Gitter if you are interested in contributing!
License
MIT