-
Notifications
You must be signed in to change notification settings - Fork 943
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add sessiontoken and sparse fields #867
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -36,17 +36,21 @@ const placeCountry = place => { | |
* | ||
* @param {String} placeId - ID for a place received from the | ||
* autocomplete service | ||
* @param {String} sessionToken - token to tie different autocomplete character searches together | ||
* with getPlaceDetails call | ||
* | ||
* @return {Promise<util.propTypes.place>} Promise that | ||
* resolves to the detailed place, rejects if the request failed | ||
*/ | ||
export const getPlaceDetails = placeId => | ||
export const getPlaceDetails = (placeId, sessionToken) => | ||
new Promise((resolve, reject) => { | ||
const serviceStatus = window.google.maps.places.PlacesServiceStatus; | ||
const el = document.createElement('div'); | ||
const service = new window.google.maps.places.PlacesService(el); | ||
const fields = ['address_component', 'formatted_address', 'geometry', 'place_id']; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Isn't the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, but it doesn't hurt to have that returned also (it's part of the basic fields => same pricing). Anyway, id's included to the return object makes them easier to be reused in Redux store if that kind of feature is needed. |
||
const sessionTokenMaybe = sessionToken ? { sessionToken } : {}; | ||
|
||
service.getDetails({ placeId }, (place, status) => { | ||
service.getDetails({ placeId, fields, ...sessionTokenMaybe }, (place, status) => { | ||
if (status !== serviceStatus.OK) { | ||
reject( | ||
new Error(`Could not get details for place id "${placeId}", error status was "${status}"`) | ||
|
@@ -71,16 +75,19 @@ const predictionSuccessful = status => { | |
* Get place predictions for the given search | ||
* | ||
* @param {String} search - place name or address to search | ||
* @param {String} sessionToken - token to tie different autocomplete character searches together | ||
* with getPlaceDetails call | ||
* | ||
* @return {Promise<{ search, predictions[] }>} - Promise of an object | ||
* with the original search query and an array of | ||
* `google.maps.places.AutocompletePrediction` objects | ||
*/ | ||
export const getPlacePredictions = search => | ||
export const getPlacePredictions = (search, sessionToken) => | ||
new Promise((resolve, reject) => { | ||
const service = new window.google.maps.places.AutocompleteService(); | ||
const sessionTokenMaybe = sessionToken ? { sessionToken } : {}; | ||
|
||
service.getPlacePredictions({ input: search }, (predictions, status) => { | ||
service.getPlacePredictions({ input: search, ...sessionTokenMaybe }, (predictions, status) => { | ||
if (!predictionSuccessful(status)) { | ||
reject(new Error(`Prediction service status not OK: ${status}`)); | ||
} else { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does the token need to be cleared out when user clears input when the place details have not been retrieved? E.g. input "Hel" -> delete all -> input "Espoo" -> click the item? Is this one or two sessions?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bladealslayer that's what I understood from docs, but I'm not sure. Should be asked from Google guys. Those docs just say that if the same session token is used in several sessions/occasions, all the calls are handled individually -> it cancels the price reduction of the token.
I assume that there's an undisclosed lifetime on those tokens - but since it's undisclosed, I assume that the desired behavior is that one character search "sequence" group is one session: "h", "he", "hel" -> "Helsinki".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://developers.google.com/maps/documentation/javascript/places-autocomplete#session_tokens
"Warning: Be sure to pass a unique session token for each new session. Using the same token for more than one session will result in each request being billed individually. Note that the Autocomplete Widget handles sessions automatically (you don't need to do anything additional)."