1.0.0 • Published 4 years ago

react-native-google-places-autocomplete-builderpod v1.0.0

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

react-native-google-places-autocomplete

Customizable Google Places autocomplete component for iOS and Android React-Native apps

Preview

npm.io

Installation

  1. npm install react-native-google-places-autocomplete --save
  2. Get your Google Places API keys and enable "Google Places API Web Service" (NOT Android or iOS) in the console.
  3. Enable "Google Maps Geocoding API" if you want to use GoogleReverseGeocoding for Current Location

Basic Example

Basic Address Search

import React from 'react';
import { Image, Text } from 'react-native';
import { GooglePlacesAutocomplete } from 'react-native-google-places-autocomplete';

const GooglePlacesInput = () => {
  return (
    <GooglePlacesAutocomplete
      placeholder='Search'
      onPress={(data, details = null) => {
        // 'details' is provided when fetchDetails = true
        console.log(data, details);
      }}
      query={{
        key: 'YOUR API KEY',
        language: 'en',
      }}
    />
  );
};

export default GooglePlacesInput;

You can also try the basic example in a snack here

More Examples

Get Current Location

Extra step required!

If you are targeting React Native 0.60.0+ you must install either @react-native-community/geolocation (link) or react-native-geolocation-service(link).

Please make sure you follow the installation instructions there and add navigator.geolocation = require(GEOLOCATION_PACKAGE) somewhere in you application before <GooglePlacesAutocomplete />.

import React from 'react';
import { Image, Text } from 'react-native';
import { GooglePlacesAutocomplete } from 'react-native-google-places-autocomplete';

// navigator.geolocation = require('@react-native-community/geolocation');
// navigator.geolocation = require('react-native-geolocation-service');

const GooglePlacesInput = () => {
  return (
    <GooglePlacesAutocomplete
      placeholder='Search'
      onPress={(data, details = null) => {
        // 'details' is provided when fetchDetails = true
        console.log(data, details);
      }}
      query={{
        key: 'YOUR API KEY',
        language: 'en',
      }}
      currentLocation={true}
      currentLocationLabel='Current location'
    />
  );
};

export default GooglePlacesInput;

Search with predefined option

import React from 'react';
import { Image, Text } from 'react-native';
import { GooglePlacesAutocomplete } from 'react-native-google-places-autocomplete';

const homePlace = {
  description: 'Home',
  geometry: { location: { lat: 48.8152937, lng: 2.4597668 } },
};
const workPlace = {
  description: 'Work',
  geometry: { location: { lat: 48.8496818, lng: 2.2940881 } },
};

const GooglePlacesInput = () => {
  return (
    <GooglePlacesAutocomplete
      placeholder='Search'
      onPress={(data, details = null) => {
        // 'details' is provided when fetchDetails = true
        console.log(data, details);
      }}
      query={{
        key: 'YOUR API KEY',
        language: 'en',
      }}
      predefinedPlaces={[homePlace, workPlace]}
    />
  );
};

export default GooglePlacesInput;

Limit results to one country

import React from 'react';
import { Image, Text } from 'react-native';
import { GooglePlacesAutocomplete } from 'react-native-google-places-autocomplete';

const GooglePlacesInput = () => {
  return (
    <GooglePlacesAutocomplete
      placeholder='Search'
      onPress={(data, details = null) => {
        // 'details' is provided when fetchDetails = true
        console.log(data, details);
      }}
      query={{
        key: 'YOUR API KEY',
        language: 'en',
        components: 'country:us',
      }}
    />
  );
};

export default GooglePlacesInput;

Props

This list is a work in progress. PRs welcome!

Prop Nametypedescriptiondefault valueOptions
autoFillOnNotFoundbooleandisplays the result from autocomplete if the place details api return not foundfalsetrue | false
autoFocusbooleanautoFocus the Text Input https://reactnative.dev/docs/textinput#autofocusnotrue | false
currentLocationbooleanWill add a 'Current location' button at the top of the predefined places listfalsetrue | false
currentLocationLabelstringchange the display label for the current location buttonCurrent LocationAny string
debouncenumberdebounce the requests (in ms)0
disableScrolldisable scroll on the results list
editablebooleaneditable from text input https://reactnative.dev/docs/textinput#editabletruetrue | false
enableHighAccuracyLocationbooleanuse GPS or not. If set to true, a GPS position will be requested. If set to false, a WIFI location will be requested. use GPS or not. If set to true, a GPS position will be requested. If set to false, a WIFI location will be requested.true
enablePoweredByContainerbooleanshow "powered by Google" at the bottom of the search results listtrue
fetchDetailsbooleanget more place details about the selected option from the Place Details APIfalse
filterReverseGeocodingByTypesarrayfilter the reverse geocoding results by types - 'locality', 'administrative_area_level_3' if you want to display only cities
getDefaultValuefunctionProvides an initial value that will change when the user starts typing
GooglePlacesDetailsQueryobject"query" object for the Google Place Details API (when you press on a suggestion)
GooglePlacesSearchQueryobject"query" object for the Google Places Nearby API (when you use current location to find nearby places){ rankby: 'distance', type: 'restaurant' }
GoogleReverseGeocodingQueryobject"query" object for the Google Geocode API (when you use current location to get the current address)
isRowScrollablebooleanenable/disable horizontal scrolling of a list result https://reactnative.dev/docs/scrollview#scrollenabledtrue
keyboardAppearanceenumkeyboard appearance (iOS) https://reactnative.dev/docs/textinput#keyboardappearance'default''default' | 'light' | 'dark'
keyboardShouldPersistTapsstringDetermines when the keyboard should stay visible after a tap https://reactnative.dev/docs/scrollview#keyboardshouldpersisttaps'always''never' | 'always' | 'handled'
listUnderlayColorstringunderlay color of the list result when pressed https://reactnative.dev/docs/touchablehighlight#underlaycolor'#c8c7cc'
listViewDisplayedstringoverride the default behavior of showing the list (results) view'auto''auto' | true | false
minLengthnumberminimum length of text to trigger a search0
nearbyPlacesAPIstringwhich API to use for current location'GooglePlacesSearch''none' | 'GooglePlacesSearch' | 'GoogleReverseGeocoding'
numberOfLinesnumbernumber of lines (android - multiline must be set to true) https://reactnative.dev/docs/textinput#numberoflines1
onFailfunctionreturns if an unspecified error comes back from the API
onNotFoundfunctionreturns if the Google Places Details API returns a 'not found' code (when you press a suggestion).
onPressfunctionreturns when after a suggestion is selected
onSubmitEditingfunctionCallback that is called when the text input's submit button is pressed with the argument https://reactnative.dev/docs/textinput#onsubmitediting
onTimeoutfunctioncallback when a request timeout()=>console.warn('google places autocomplete: request timeout')
placeholderstringplaceholder text https://reactnative.dev/docs/textinput#placeholder'Search'
placeholderTextColorstringplaceholder text color https://reactnative.dev/docs/textinput#placeholdertextcolor'#A8A8A8'https://reactnative.dev/docs/colors
predefinedPlacesarrayAllows you to show pre-defined places (e.g. home, work)
predefinedPlacesAlwaysVisiblebooleanShows predefined places at the top of the search resultsfalse
preProcessfunctiondo something to the text of the search input before a search request is sent
queryobject"query" object for the Google Places Autocomplete API (link){ key: 'missing api key', language: 'en', types: 'geocode' }
renderDescriptionfunctiondetermines the data passed to each renderRow (search result)
renderHeaderComponent
renderLeftButtonfunctionadd a component to the left side of the Text Input
renderRightButtonfunctionadd a component to the right side of the Text Input
renderRowfunctioncustom component to render each result row (use this to show an icon beside each result)
requestUrlobjectused to set the request url for the library
returnKeyTypestringthe return key text https://reactnative.dev/docs/textinput#returnkeytype'search'
stylesobjectSee styles section below
suppressDefaultStylesbooleanremoves all default styling from the libraryfalsetrue | false
textInputHidebooleanHide the Search inputfalsetrue | false
textInputPropsobjectdefine props for the textInput, or provide a custom input component
timeoutnumberhow many ms until the request will timeout20000
underlineColorAndroidstringText Input underline color (android) https://reactnative.dev/docs/textinput#underlinecolorandroid'transparent'

Styling

GooglePlacesAutocomplete can be easily customized to meet styles of your app. Pass styles props to GooglePlacesAutocomplete with style object for different elements (keys for style object are listed below)

keytype
containerobject (View)
descriptionobject (Text style)
textInputContainerobject (View style)
textInputobject (style)
loaderobject (View style)
listViewobject (ListView style)
predefinedPlacesDescriptionobject (Text style)
poweredContainerobject (View style)
poweredobject (Image style)
separatorobject (View style)
rowobject (View style)

Example

<GooglePlacesAutocomplete
  placeholder='Enter Location'
  minLength={2}
  autoFocus={false}
  returnKeyType={'default'}
  fetchDetails={true}
  styles={{
    textInputContainer: {
      backgroundColor: 'rgba(0,0,0,0)',
      borderTopWidth: 0,
      borderBottomWidth: 0,
    },
    textInput: {
      marginLeft: 0,
      marginRight: 0,
      height: 38,
      color: '#5d5d5d',
      fontSize: 16,
    },
    predefinedPlacesDescription: {
      color: '#1faadb',
    },
  }}
/>

Web Support

Web support can be enabled via the requestUrl prop, by passing in a URL that you can use to proxy your requests. CORS implemented by the Google Places API prevent using this library directly on the web. You can use a proxy server like CORS Anywhere or roll your own. Please be mindful of this limitation when opening an issue.

Note: The library expects the same response that the Google Maps API would return.

Features

  • Places autocompletion
  • iOS and Android compatibility
  • Places details fetching + ActivityIndicatorIOS/ProgressBarAndroid loaders
  • Customizable using the styles parameter
  • XHR cancellations when typing fast
  • Google Places terms compliant
  • Predefined places
  • typescript types
  • Current location

Compatibility

This library does not use the iOS, Android or JS SDKs from Google. This comes with some Pros and Cons.

Pros:

  • smaller app size
  • better privacy for your users (although Google still tracks server calls)
  • no need to keep up with sdk updates

Cons:

  • the library is not compatible with a Application key restrictions
  • doesn't work directly on the web without a proxy server
  • any Google API change can be a breaking change for the library.

Changelog

Please see the releases tab for the changelog information.

License

MIT

Authors