Skip to content

Commit 7e5b736

Browse files
willum070yuethomas
andauthored
fix: autocomplete session token management (#253)
* fix: autocomplete session token management This fix enables the autocomplete session sample to properly use a session token for its first session. * additional QOL fixes for the sample * better global variable names * better comment --------- Co-authored-by: Tom Yue <[email protected]>
1 parent 96ff4bb commit 7e5b736

File tree

1 file changed

+38
-35
lines changed
  • samples/place-autocomplete-data-session

1 file changed

+38
-35
lines changed

samples/place-autocomplete-data-session/index.ts

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,55 @@
55
*/
66

77
// [START maps_place_autocomplete_data_session]
8-
let title;
9-
let results;
10-
let input;
11-
let token;
8+
let titleElement;
9+
let resultsContainerElement;
10+
let inputElement;
11+
12+
let newestRequestId = 0;
1213

1314
// Add an initial request body.
14-
let request = {
15-
input: "",
15+
const request = {
16+
input: '',
1617
locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78 },
1718
origin: { lat: 37.7893, lng: -122.4039 },
18-
includedPrimaryTypes: ["restaurant"],
19-
language: "en-US",
20-
region: "us",
19+
includedPrimaryTypes: ['restaurant'],
20+
language: 'en-US',
21+
region: 'us',
2122
};
2223

23-
async function init() {
24-
token = new google.maps.places.AutocompleteSessionToken();
25-
26-
title = document.getElementById('title');
27-
results = document.getElementById('results');
28-
input = document.querySelector("input");
29-
input.addEventListener("input", makeAcRequest);
30-
request = refreshToken(request) as any;
24+
function init() {
25+
titleElement = document.getElementById('title');
26+
resultsContainerElement = document.getElementById('results');
27+
inputElement = document.querySelector('input');
28+
inputElement.addEventListener('input', makeAutocompleteRequest);
29+
refreshToken(request);
3130
}
3231

33-
async function makeAcRequest(input) {
32+
async function makeAutocompleteRequest(inputEvent) {
3433
// Reset elements and exit if an empty string is received.
35-
if (input.target.value == '') {
36-
title.innerText = '';
37-
results.replaceChildren();
34+
if (inputEvent.target.value == '') {
35+
titleElement.innerText = '';
36+
resultsContainerElement.replaceChildren();
3837
return;
3938
}
4039

4140
// Add the latest char sequence to the request.
42-
request.input = input.target.value;
41+
request.input = inputEvent.target.value;
42+
43+
// To avoid race conditions, store the request ID and compare after the request.
44+
const requestId = ++newestRequestId;
4345

4446
// Fetch autocomplete suggestions and show them in a list.
4547
// @ts-ignore
4648
const { suggestions } = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(request);
4749

48-
title.innerText = 'Query predictions for "' + request.input + '"';
50+
// If the request has been superseded by a newer request, do not render the output.
51+
if (requestId !== newestRequestId) return;
52+
53+
titleElement.innerText = `Query predictions for "${request.input}"`;
4954

5055
// Clear the list first.
51-
results.replaceChildren();
56+
resultsContainerElement.replaceChildren();
5257

5358
for (const suggestion of suggestions) {
5459
const placePrediction = suggestion.placePrediction;
@@ -60,10 +65,10 @@ async function makeAcRequest(input) {
6065
});
6166
a.innerText = placePrediction!.text.toString();
6267

63-
// Create a new list element.
68+
// Create a new list item element.
6469
const li = document.createElement('li');
6570
li.appendChild(a);
66-
results.appendChild(li);
71+
resultsContainerElement.appendChild(li);
6772
}
6873
}
6974

@@ -72,19 +77,17 @@ async function onPlaceSelected(place) {
7277
await place.fetchFields({
7378
fields: ['displayName', 'formattedAddress'],
7479
});
75-
let placeText = document.createTextNode(place.displayName + ': ' + place.formattedAddress);
76-
results.replaceChildren(placeText);
77-
title.innerText = 'Selected Place:';
78-
input.value = '';
80+
const placeText = document.createTextNode(`${place.displayName}: ${place.formattedAddress}`);
81+
resultsContainerElement.replaceChildren(placeText);
82+
titleElement.innerText = 'Selected Place:';
83+
inputElement.value = '';
7984
refreshToken(request);
8085
}
8186

8287
// Helper function to refresh the session token.
83-
async function refreshToken(request) {
88+
function refreshToken(request) {
8489
// Create a new session token and add it to the request.
85-
token = new google.maps.places.AutocompleteSessionToken();
86-
request.sessionToken = token;
87-
return request;
90+
request.sessionToken = new google.maps.places.AutocompleteSessionToken();
8891
}
8992

9093
declare global {
@@ -94,4 +97,4 @@ declare global {
9497
}
9598
window.init = init;
9699
// [END maps_place_autocomplete_data_session]
97-
export { };
100+
export { };

0 commit comments

Comments
 (0)