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

'use strict';

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

      /**
       * Use the Google Maps Geocoder API to convert a Google Maps Place ID into
       * a geocoded object that includes latitude and longitude information 
       * along with a bound box for viewing the location.
       * @param {Prediction} prediction An autocomplete prediction that includes
       * a unique identifier for geocoding.
       * @returns {GeocodedLocation[]} An array of locations with an associated
       * bounding box. According to Google Maps API this should most often be a
       * single value, but could potentially be many.
       */
      async geocode(prediction) {
        const response = await this.geocoder.geocode({
          placeId: prediction.get('googleMapsPlaceId')
        });
        return this.getGeocodedLocationsFromResults(response.results);
      }

      /**
       * Helper function that converts a Google Maps Places API result into a
       * useable GeocodedLocation model.
       * @param {Object[]} List of Google Maps Places API results.
       * @returns {GeocodedLocation[]} List of corresponding geocoded locations.
       */
      getGeocodedLocationsFromResults(results) {
        return results.map(result => {
          return new GeocodedLocation({
            box: result.geometry.viewport.toJSON(),
            displayName: result.address_components[0].long_name,
          });
        });
      }
    }

    return GoogleMapsGeocoder;
  });