Source: src/js/models/geocoder/GoogleMapsAutocompleter.js

'use strict';

define(
  ['backbone', 'gmaps', 'models/geocoder/Prediction'],
  (Backbone, gmaps, Prediction) => {
    /**
     * Integrate with the Google Maps Places Autocomplete API using the
     * Google Maps AutocompleteService JS library.
     * @classcategory Models/Geocoder
     * @since 2.28.0
     */
    class GoogleMapsAutocompleter {
      /**
       * Google Maps service for interacting with the Places Autocomplete API.
       */
      autocompleter = new gmaps.places.AutocompleteService();

      /**
       * Use the Google Maps Places API to get place predictions based off of a
       * user input string as the user types.
       * @param {string} input - User input to search for Google Maps places.
       * @returns {Prediction[]} An array of places that could be the result the
       * user is looking for. Most often this comes in five or less results.
       */
      async autocomplete(input) {
        if (!input) return [];
        const response = await this.autocompleter.getPlacePredictions({
          input,
        });
        return this.getPredictionsFromResults(response.predictions);
      }

      /**
       * Helper function that converts a Google Maps Autocomplete API result
       * into a useable Prediction model.
       * @param {Object[]} List of Google Maps Autocomplete API results.
       * @returns {Prediction[]} List of corresponding predictions.
       */
      getPredictionsFromResults(results) {
        return results.map(result => new Prediction({
          description: result.description,
          googleMapsPlaceId: result.place_id,
        }));
      }
    }

    return GoogleMapsAutocompleter;
  });