Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2774 | Rev 3046 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
593 stevensc 1
import { useState, useEffect, useRef } from 'react'
472 stevensc 2
 
2774 stevensc 3
export function useLocationAutocomplete() {
1727 stevensc 4
  const [address, setAddress] = useState({})
5
  const [error, setError] = useState(null)
6
  const inputRef = useRef(null)
7
  let autoComplete
472 stevensc 8
 
1727 stevensc 9
  function handleScriptLoad(autoCompleteRef) {
10
    autoComplete = new window.google.maps.places.Autocomplete(
11
      autoCompleteRef.current,
12
      { types: ['(cities)'] }
13
    )
14
    autoComplete.setFields([
15
      'address_components',
16
      'formatted_address',
17
      'geometry'
18
    ])
3045 stevensc 19
    autoComplete.addListener('place_changed', handlePlaceSelect)
1727 stevensc 20
  }
472 stevensc 21
 
1727 stevensc 22
  function handlePlaceSelect() {
23
    setAddress({})
24
    const addressPlace = autoComplete.getPlace()
25
    const formattedAddress = addressPlace.formatted_address
26
    const addressComponents = [
27
      ...addressPlace.address_components,
28
      {
29
        latitude: addressPlace.geometry.location.lat(),
30
        longitude: addressPlace.geometry.location.lng(),
31
        types: ['geometry']
32
      }
33
    ]
34
    const address = {}
472 stevensc 35
 
1727 stevensc 36
    if (formattedAddress) {
37
      setError(null)
1798 stevensc 38
      addressComponents?.forEach((address_component) => {
1727 stevensc 39
        const address_component_name = address_component.long_name
40
        const address_component_type = address_component.types[0]
472 stevensc 41
 
1727 stevensc 42
        switch (address_component_type) {
43
          case 'route':
44
            address.address1 = address_component_name
45
            break
46
          case 'sublocality':
47
            address.address2 = address_component_name
48
            break
49
          case 'locality':
50
            address.city1 = address_component_name
51
            break
52
          case 'administrative_area_level_2':
53
            address.city2 = address_component_name
54
            break
55
          case 'administrative_area_level_1':
56
            address.state = address_component_name
57
            break
58
          case 'country':
59
            address.country = address_component_name
60
            break
61
          case 'postal_code':
62
            address.postal_code = address_component_name
63
            break
64
          case 'geometry':
65
            address.latitude = address_component.latitude
66
            address.longitude = address_component.longitude
67
            break
68
          default:
69
            break
70
        }
71
      })
472 stevensc 72
 
1727 stevensc 73
      setAddress({ ...address, formatted_address: formattedAddress })
74
    } else {
75
      setError('Ha ocurrido un error')
472 stevensc 76
    }
1727 stevensc 77
  }
472 stevensc 78
 
1727 stevensc 79
  useEffect(() => {
80
    handleScriptLoad(inputRef)
1824 stevensc 81
  }, [])
472 stevensc 82
 
3045 stevensc 83
  useEffect(() => {
84
    if (!inputRef.current) return
85
    handlePlaceSelect()
86
  }, [inputRef.current])
87
 
1727 stevensc 88
  return { address, error, ref: inputRef }
472 stevensc 89
}