Grupo-AFAL/frontend-helpers

View on GitHub
javascript/src/controllers/autocomplete-address-controller.js

Summary

Maintainability
A
1 hr
Test Coverage
A
96%
import { Controller } from '@hotwired/stimulus'
import GoogleMapsLoader from '../utils/google-maps-loader'
 
export class AutocompleteAddressController extends Controller {
static values = { apiKey: String }
static targets = [
'input',
'street',
'streetNumber',
'neighbourhood',
'city',
'state',
'country',
'postalCode',
'latitude',
'longitude'
]
 
async connect () {
try {
this.googleMaps = await GoogleMapsLoader({
libraries: ['places'],
language: 'es',
key: this.apiKeyValue || window.GOOGLE_MAPS_API_KEY
})
this.initializeAddressListener()
} catch (error) {
console.error(error)
}
}
 
initializeAddressListener () {
this.autocomplete = new this.googleMaps.places.Autocomplete(
this.inputTarget,
{}
)
 
this.autocomplete.addListener(
'place_changed',
this.fillInAddress.bind(this)
)
}
 
Function `fillInAddress` has 29 lines of code (exceeds 25 allowed). Consider refactoring.
fillInAddress () {
const place = this.autocomplete.getPlace()
 
for (const component of place.address_components) {
const componentType = component.types[0]
 
switch (componentType) {
case 'street_number':
this.streetNumberTarget.value = component.short_name
break
case 'route':
this.streetTarget.value = component.long_name
break
case 'sublocality_level_1':
this.neighbourhoodTarget.value = component.short_name
break
case 'locality':
this.cityTarget.value = component.short_name
break
case 'administrative_area_level_1':
this.stateTarget.value = component.short_name
break
case 'country':
this.countryTarget.value = component.long_name
break
case 'postal_code':
this.postalCodeTarget.value = component.short_name
break
}
 
this.latitudeTarget.value = place.geometry.location.lat()
this.longitudeTarget.value = place.geometry.location.lng()
}
}
}