1+ /**
2+ * @license
3+ * Copyright 2024 Google LLC. All Rights Reserved.
4+ * SPDX-License-Identifier: Apache-2.0
5+ */
6+
7+ // [START maps_place_autocomplete_data_session]
8+ let title ;
9+ let results ;
10+ let input ;
11+ let token ;
12+
13+ // Add an initial request body.
14+ let request = {
15+ input : "" ,
16+ locationRestriction : { west : - 122.44 , north : 37.8 , east : - 122.39 , south : 37.78 } ,
17+ origin : { lat : 37.7893 , lng : - 122.4039 } ,
18+ includedPrimaryTypes : [ "restaurant" ] ,
19+ language : "en-US" ,
20+ region : "us" ,
21+ sessionToken : null ,
22+ } ;
23+
24+ async function init ( ) {
25+ title = document . getElementById ( 'title' ) ;
26+ results = document . getElementById ( 'results' ) ;
27+ input = document . querySelector ( "input" ) ;
28+ input . addEventListener ( "input" , makeAcRequest ) ;
29+ await refreshToken ( ) ; // Await the refreshToken call here.
30+ }
31+
32+ async function makeAcRequest ( input ) {
33+ // Reset elements and exit if an empty string is received.
34+ if ( input . target . value == '' ) {
35+ title . innerText = '' ;
36+ results . replaceChildren ( ) ;
37+ return ;
38+ }
39+
40+ // Add the latest char sequence to the request.
41+ request . input = input . target . value ;
42+ await refreshToken ( ) ; //refresh the token before each request.
43+
44+ // Fetch autocomplete suggestions and show them in a list.
45+ // @ts -ignore
46+ const { suggestions } = await google . maps . places . AutocompleteSuggestion . fetchAutocompleteSuggestions ( request ) ;
47+
48+ title . innerText = 'Query predictions for "' + request . input + '"' ;
49+
50+ // Clear the list first.
51+ results . replaceChildren ( ) ;
52+
53+ for ( const suggestion of suggestions ) {
54+ const placePrediction = suggestion . placePrediction ;
55+
56+ // Create a link for the place, add an event handler to fetch the place.
57+ const a = document . createElement ( 'a' ) ;
58+ a . addEventListener ( 'click' , ( ) => {
59+ onPlaceSelected ( placePrediction ! . toPlace ( ) ) ;
60+ } ) ;
61+ a . innerText = placePrediction ! . text . toString ( ) ;
62+
63+ // Create a new list element.
64+ const li = document . createElement ( 'li' ) ;
65+ li . appendChild ( a ) ;
66+ results . appendChild ( li ) ;
67+ }
68+ }
69+
70+ // Event handler for clicking on a suggested place.
71+ async function onPlaceSelected ( place ) {
72+ await place . fetchFields ( {
73+ fields : [ 'displayName' , 'formattedAddress' ] ,
74+ } ) ;
75+ let placeText = document . createTextNode ( place . displayName + ': ' + place . formattedAddress ) ;
76+ results . replaceChildren ( placeText ) ;
77+ title . innerText = 'Selected Place:' ;
78+ input . value = '' ;
79+ await refreshToken ( ) ;
80+ }
81+
82+ // Helper function to refresh the session token.
83+ async function refreshToken ( ) {
84+ // Create a new session token and add it to the request.
85+ token = new google . maps . places . AutocompleteSessionToken ( ) ;
86+ request . sessionToken = token ;
87+ }
88+
89+ declare global {
90+ interface Window {
91+ init : ( ) => void ;
92+ }
93+ }
94+ window . init = init ;
95+ // [END maps_place_autocomplete_data_session]
96+ export { } ;
0 commit comments