Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 7878 | Rev 7899 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect, useRef } from "react";
import { useState } from "react";

function SearchLocationInput({ googleApiKey, setValue, value }) {

    const autoCompleteRef = useRef(null);
    const [data, setData] = useState({})

    let autoComplete;

    const loadScript = (url, callback) => {
        let script = document.createElement("script");
        script.type = "text/javascript";

        if (script.readyState) {
            script.onreadystatechange = function () {
                if (script.readyState === "loaded" || script.readyState === "complete") {
                    script.onreadystatechange = null;
                    callback();
                }
            };
        } else {
            script.onload = () => callback();
        }

        script.src = url;
        document.getElementsByTagName("head")[0].appendChild(script);
    };

    function handleScriptLoad(updateQuery, autoCompleteRef, setData) {
        autoComplete = new window.google.maps.places.Autocomplete(
            autoCompleteRef.current,
            { types: ["(cities)"] }
        );
        autoComplete.setFields(["address_components", "formatted_address"]);
        autoComplete.addListener("place_changed", () =>
            handlePlaceSelect(updateQuery, setData)
        );
    }

    async function handlePlaceSelect(updateQuery, setData) {

        let locationObject = {
            formatted_address: '',
            address1: '',
            address2: '',
            country: '',
            state: '',
            city1: '',
            city2: '',
            postal_code: '',
            latitude: 0,
            longitude: 0,
            location_search: ''
        }
        const place = await autoComplete.getPlace();
        locationObject.formatted_address = place.formatted_address;

        if (place.geometry) {
            const arrAddress = place.address_components;

            locationObject.latitude = place.geometry.location.lat();
            locationObject.longitude = place.geometry.location.lng();

            arrAddress.forEach((address_component) => {
                if (address_component.types[0] == "route") {
                    locationObject.address1 = address_component.long_name;
                }
                if (address_component.types[0] == "sublocality") {
                    locationObject.address2 = address_component.long_name;
                }
                if (address_component.types[0] == "locality") {
                    locationObject.city1 = address_component.long_name;
                }
                if (address_component.types[0] == "administrative_area_level_2") {
                    locationObject.city2 = address_component.long_name;
                }
                if (address_component.types[0] == "administrative_area_level_1") {
                    locationObject.state = address_component.long_name;
                }
                if (address_component.types[0] == "country") {
                    locationObject.country = address_component.long_name;
                }
                if (address_component.types[0] == "postal_code") {
                    locationObject.postal_code = address_component.long_name;
                }
            })

            updateQuery(locationObject.formatted_address);
            setData(addressObject);
        }

    }


    useEffect(() => {
        loadScript(
            `https://maps.googleapis.com/maps/api/js?key=${googleApiKey}&libraries=places`,
            () => handleScriptLoad(setValue, autoCompleteRef, setData)
        );
    }, []);

    return (
        <div className="form-group">
            <input
                ref={autoCompleteRef}
                onChange={event => setValue(event.target.value)}
                placeholder="Enter a City"
                value={value}
                className="form-control"
            />
        </div>
    );
}

export default SearchLocationInput;