Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 481 | Rev 1727 | 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
 
593 stevensc 3
const useLocationAutocomplete = () => {
472 stevensc 4
    const [addresObject, setAddressObject] = useState({})
5
    const [error, setError] = useState(null)
593 stevensc 6
    const inputRef = useRef(null)
472 stevensc 7
    let autoComplete
8
 
480 stevensc 9
    function handleScriptLoad(autoCompleteRef) {
10
        autoComplete = new window.google.maps.places.Autocomplete(
481 stevensc 11
            autoCompleteRef.current,
480 stevensc 12
            { types: ['(cities)'] }
13
        )
472 stevensc 14
        autoComplete.setFields([
15
            'address_components',
16
            'formatted_address',
17
            'geometry',
18
        ])
480 stevensc 19
        autoComplete.addListener('place_changed', () => handlePlaceSelect())
472 stevensc 20
    }
21
 
22
    function handlePlaceSelect() {
480 stevensc 23
        setAddressObject({})
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
        ]
472 stevensc 34
        const address = {}
35
 
480 stevensc 36
        if (formattedAddress) {
472 stevensc 37
            setError(null)
480 stevensc 38
            addressComponents?.map((address_component) => {
472 stevensc 39
                const address_component_name = address_component.long_name
40
                const address_component_type = address_component.types[0]
41
 
42
                switch (address_component_type) {
473 stevensc 43
                    case 'route':
44
                        address['address1'] = address_component_name
472 stevensc 45
                        break
473 stevensc 46
                    case 'sublocality':
47
                        address['address2'] = address_component_name
472 stevensc 48
                        break
473 stevensc 49
                    case 'locality':
50
                        address['city1'] = address_component_name
472 stevensc 51
                        break
473 stevensc 52
                    case 'administrative_area_level_2':
53
                        address['city2'] = address_component_name
472 stevensc 54
                        break
473 stevensc 55
                    case 'administrative_area_level_1':
56
                        address['state'] = address_component_name
472 stevensc 57
                        break
473 stevensc 58
                    case 'country':
59
                        address['country'] = address_component_name
472 stevensc 60
                        break
473 stevensc 61
                    case 'postal_code':
62
                        address['postal_code'] = address_component_name
472 stevensc 63
                        break
473 stevensc 64
                    case 'geometry':
65
                        address['latitude'] = address_component.latitude
66
                        address['longitude'] = address_component.longitude
472 stevensc 67
                        break
68
                    default:
69
                        break
70
                }
71
            })
72
 
480 stevensc 73
            setAddressObject({ ...address, formatted_address: formattedAddress })
473 stevensc 74
        } else {
472 stevensc 75
            setError('Ha ocurrido un error')
76
        }
77
    }
78
 
79
    useEffect(() => {
481 stevensc 80
        handleScriptLoad(inputRef)
81
    }, [])
472 stevensc 82
 
593 stevensc 83
    return { address: addresObject, error, ref: inputRef }
472 stevensc 84
}
85
 
473 stevensc 86
export default useLocationAutocomplete