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+ } ;
22+
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 ;
31+ }
32+
33+ async function makeAcRequest ( input ) {
34+ // Reset elements and exit if an empty string is received.
35+ if ( input . target . value == '' ) {
36+ title . innerText = '' ;
37+ results . replaceChildren ( ) ;
38+ return ;
39+ }
40+
41+ // Add the latest char sequence to the request.
42+ request . input = input . target . value ;
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+ refreshToken ( request ) ;
80+ }
81+
82+ // Helper function to refresh the session token.
83+ async function refreshToken ( request ) {
84+ // 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 ;
88+ }
89+
90+ declare global {
91+ interface Window {
92+ init : ( ) => void ;
93+ }
94+ }
95+ window . init = init ;
96+ // [END maps_place_autocomplete_data_session]
97+ export { } ;
0 commit comments