{"version":3,"file":"ngx-google-maps-places-api.mjs","sources":["../../../projects/ngx-google-maps-places-api/src/lib/ngx-google-maps-places-api.service.ts","../../../projects/ngx-google-maps-places-api/src/public-api.ts","../../../projects/ngx-google-maps-places-api/src/ngx-google-maps-places-api.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { from, map, Observable, of, share, shareReplay, switchMap, tap } from 'rxjs';\n\nimport { AddressKey, AddressModel } from './ngx-google-maps-places.types';\n\n/**\n * Service that provides functionality for interacting with new Google Maps Places API.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class NgxGoogleMapsPlacesApiService {\n  /**\n   * Lazily imports the Google Maps Places library and provides a shared observable for it.\n   * This ensures the library is only loaded once and can be shared across the application.\n   */\n  private readonly _placesLibrary$ = from(\n      google.maps.importLibrary('places') as Promise<google.maps.PlacesLibrary>\n    )\n    .pipe(\n      // tap(() => console.info('importLibrary')),\n      shareReplay(1)\n    );\n  /**\n   * Stores the current Google Maps Places autocomplete session token.\n   * This token is used to associate autocomplete suggestions with a particular session.\n   */\n  private _token: google.maps.places.AutocompleteSessionToken | undefined;\n\n  /**\n   * Refreshes the Google Maps Places autocomplete session token.\n   * The session token is used to associate autocomplete suggestions with a particular session.\n   * This method creates a new session token and stores it in the `_token` property.\n   *\n   * @returns The new session token.\n   */\n  public refreshToken(): google.maps.places.AutocompleteSessionToken {\n    this._token = new google.maps.places.AutocompleteSessionToken();\n    // console.log('refreshToken()', this._token);\n    return this._token;\n  }\n\n  /**\n   * Fetches autocomplete suggestions from the Google Maps Places API based on the provided request\n   * or input string.\n   * @param requestOrInput The autocomplete request object or an input string to fetch\n   * suggestions for.\n   * @returns An observable that emits an array of autocomplete suggestions.\n   */\n  public fetchSuggestions(\n    requestOrInput: google.maps.places.AutocompleteRequest | string\n  ): Observable<google.maps.places.AutocompleteSuggestion[]> {\n    const request = typeof requestOrInput === 'string' ? { input: requestOrInput } : requestOrInput;\n    return this._placesLibrary$\n      .pipe(\n        switchMap((placesLibrary) => placesLibrary.AutocompleteSuggestion\n          .fetchAutocompleteSuggestions({\n            ...request,\n            sessionToken: this._token || this.refreshToken()\n          })\n        ),\n        map(({ suggestions }) => suggestions),\n        share()\n      );\n  }\n\n  /**\n   * Fetches the details of a Google Maps place based on an autocomplete suggestion or\n   * place prediction.\n   * @param suggestionOrPrediction The autocomplete suggestion or place prediction to fetch\n   * details for.\n   * @param fields An optional array of fields to fetch for the place.\n   * Defaults to `[ 'addressComponents' ]`.\n   * @returns An observable that emits the fetched place details, or null if the place prediction\n   * is invalid.\n   */\n  public fetchPlaceDetails(\n    suggestionOrPrediction:\n      google.maps.places.AutocompleteSuggestion | google.maps.places.PlacePrediction,\n    fields = [ 'addressComponents' ]\n  ): Observable<google.maps.places.Place | null> {\n    const placePrediction = this._isAutocompleteSuggestion(suggestionOrPrediction)\n      ? suggestionOrPrediction.placePrediction\n      : suggestionOrPrediction;\n    const place = placePrediction?.toPlace();\n    if (!place) {\n      return of(null);\n    }\n    return from(place.fetchFields({ fields }))\n      .pipe(\n        tap(() => this.refreshToken()),\n        map(({ place }) => place),\n        share()\n      );\n  }\n\n  /**\n   * Parses the address components of a Google Maps place and returns an `AddressModel` object.\n   * @param place The Google Maps place object to parse the address components from.\n   * @returns An `AddressModel` object containing the parsed address components, or `null` if\n   * the place is null or has no address components.\n   */\n  public parseAddressComponents(place: google.maps.places.Place | null): AddressModel | null {\n    if (!place) {\n      return null;\n    }\n    const addressComponents = place.addressComponents;\n    if (!addressComponents?.length) {\n      return null;\n    }\n    const addressComponentsMap: AddressModel<string[]> = {\n      streetNumber: [ 'street_number'],\n      postalCode: [ 'postal_code' ],\n      street: [ 'street_address', 'route' ],\n      region: [\n        'administrative_area_level_1',\n        'administrative_area_level_2',\n        'administrative_area_level_3',\n        'administrative_area_level_4',\n        'administrative_area_level_5'\n      ],\n      regionCode: [\n        'administrative_area_level_1',\n        'administrative_area_level_2',\n        'administrative_area_level_3',\n        'administrative_area_level_4',\n        'administrative_area_level_5'\n      ],\n      city: [\n        'locality',\n        'sublocality',\n        'sublocality_level_1',\n        'sublocality_level_2',\n        'sublocality_level_3',\n        'sublocality_level_4'\n      ],\n      countryCode: [ 'country' ],\n      country: [ 'country' ],\n      addressLine2: [ 'subpremise' ]\n    };\n\n    const addressModel: AddressModel = {\n      streetNumber: '',\n      postalCode: '',\n      street: '',\n      region: '',\n      regionCode: '',\n      city: '',\n      countryCode: '',\n      country: '',\n      addressLine2: ''\n    };\n\n    for (const addressComponent of addressComponents) {\n      for (const mapKey in addressComponentsMap) {\n        const key = mapKey as AddressKey;\n        const addressComponentMap = addressComponentsMap[key];\n        if (addressComponentMap.some((type) => addressComponent.types.includes(type))) {\n          if (key === 'countryCode' || key === 'regionCode') {\n            addressModel[key] = String(addressComponent.shortText);\n          } else {\n            addressModel[key] = String(addressComponent.longText);\n          }\n        }\n      }\n    }\n\n    return addressModel;\n  }\n\n  /**\n   * Applies bold formatting to the matched text within the provided `FormattableText`.\n   * @param formattableText The `FormattableText` object containing the text and match information.\n   * @returns The formatted text with the matched portions wrapped in `<b>` tags.\n   */\n  public applyBoldToMatches(formattableText: google.maps.places.FormattableText | null): string {\n    if (!formattableText) {\n      return '';\n    }\n\n    const { text, matches } = formattableText;\n    const chunks: string[] = [ ];\n    let lastIndex = 0;\n\n    for (const match of matches) {\n      const { startOffset, endOffset } = match;\n      // Text before the current match\n      chunks.push(text.slice(lastIndex, startOffset));\n      // Matched text wrapped in <b> tag\n      chunks.push(`<b>${text.slice(startOffset, endOffset)}</b>`);\n      // Update lastIndex to the end of the current match\n      lastIndex = endOffset;\n    };\n\n    // Any remaining text after the last match\n    chunks.push(text.slice(lastIndex));\n\n    return chunks.join('');\n  }\n\n  /**\n   * Determines whether the provided `suggestionOrPrediction` object is an instance of\n   * `google.maps.places.AutocompleteSuggestion`.\n   * @param suggestionOrPrediction The object to check.\n   * @returns `true` if the object is an `AutocompleteSuggestion`, `false` otherwise.\n   */\n  private _isAutocompleteSuggestion(\n    suggestionOrPrediction: google.maps.places.AutocompleteSuggestion | google.maps.places.PlacePrediction\n  ): suggestionOrPrediction is google.maps.places.AutocompleteSuggestion {\n    return suggestionOrPrediction && 'placePrediction' in suggestionOrPrediction;\n  }\n}\n","/*\n * Public API Surface of ngx-google-maps-places\n */\n\nexport * from './lib/ngx-google-maps-places-api.service';\nexport * from './lib/ngx-google-maps-places.types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}