Rev 3045 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { useState, useEffect, useRef } from 'react'
export function useLocationAutocomplete() {
const [address, setAddress] = useState({})
const [error, setError] = useState(null)
const inputRef = useRef(null)
let autoComplete
function handleScriptLoad(autoCompleteRef) {
autoComplete = new window.google.maps.places.Autocomplete(
autoCompleteRef.current,
{ types: ['(cities)'] }
)
autoComplete.setFields([
'address_components',
'formatted_address',
'geometry'
])
autoComplete.addListener('place_changed', handlePlaceSelect)
}
function handlePlaceSelect() {
setAddress({})
const addressPlace = autoComplete.getPlace()
const formattedAddress = addressPlace.formatted_address
const addressComponents = [
...addressPlace.address_components,
{
latitude: addressPlace.geometry.location.lat(),
longitude: addressPlace.geometry.location.lng(),
types: ['geometry']
}
]
const address = {}
if (formattedAddress) {
setError(null)
addressComponents?.forEach((address_component) => {
const address_component_name = address_component.long_name
const address_component_type = address_component.types[0]
switch (address_component_type) {
case 'route':
address.address1 = address_component_name
break
case 'sublocality':
address.address2 = address_component_name
break
case 'locality':
address.city1 = address_component_name
break
case 'administrative_area_level_2':
address.city2 = address_component_name
break
case 'administrative_area_level_1':
address.state = address_component_name
break
case 'country':
address.country = address_component_name
break
case 'postal_code':
address.postal_code = address_component_name
break
case 'geometry':
address.latitude = address_component.latitude
address.longitude = address_component.longitude
break
default:
break
}
})
setAddress({ ...address, formatted_address: formattedAddress })
} else {
setError('Ha ocurrido un error')
}
}
useEffect(() => {
handleScriptLoad(inputRef)
}, [])
return { address, error, ref: inputRef }
}