import React, { useState, useCallback, useRef } from 'react'; import { GoogleMap, useJsApiLoader, Marker, Autocomplete, } from '@react-google-maps/api'; import { useMaps } from '../stores/useMaps'; import { LocateFixed, MapPinIcon } from 'lucide-react'; import { Button } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; const containerStyle = { width: '100%', height: '400px', }; const center = { lat: -6.2, // Default latitude (Jakarta) lng: 106.816666, // Default longitude (Jakarta) }; const PinpointLocation = () => { const { isLoaded } = useJsApiLoader({ googleMapsApiKey: process.env.NEXT_PUBLIC_GOOGLE_API_KEY, // Pastikan API key ada di .env.local libraries: ['places'], }); const { addressMaps, setAddressMaps, selectedPosition, setSelectedPosition, setDetailAddress, setPinedMaps } = useMaps(); const [tempAddress, setTempAddress] = useState(''); const [tempPosition, setTempPosition] = useState(center); const { setValue } = useForm(); const autocompleteRef = useRef(null); const onMapClick = useCallback((event) => { const lat = event.latLng.lat(); const lng = event.latLng.lng(); setTempPosition({ lat, lng }); getAddress(lat, lng); }, []); const handlePlaceSelect = () => { const place = autocompleteRef.current.getPlace(); if (place && place.geometry) { const lat = place.geometry.location.lat(); const lng = place.geometry.location.lng(); setTempPosition({ lat, lng }); setTempAddress(place.formatted_address); } }; const getAddressComponent = (components, type) => { const component = components.find((comp) => comp.types.includes(type)); return component ? component.long_name : ''; }; const getAddress = async (lat, lng) => { try { const response = await fetch( `https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${process.env.NEXT_PUBLIC_GOOGLE_API_KEY}` ); const data = await response.json(); if (data.results[0]) { const addressComponents = data.results[0].address_components; const details = { route : getAddressComponent(addressComponents, 'route')+' '+getAddressComponent(addressComponents, 'street_number')+' '+getAddressComponent(addressComponents, 'administrative_area_level_7')+' '+getAddressComponent(addressComponents, 'administrative_area_level_6'), province: getAddressComponent( addressComponents, 'administrative_area_level_1' ), district: getAddressComponent( addressComponents, 'administrative_area_level_2' ), subDistrict: getAddressComponent( addressComponents, 'administrative_area_level_3' ), village: getAddressComponent( addressComponents, 'administrative_area_level_4' ), postalCode: getAddressComponent(addressComponents, 'postal_code'), }; setDetailAddress(details); setTempAddress(data.results[0].formatted_address); } } catch (error) { console.error('Error fetching address:', error); } }; const handleUseCurrentLocation = () => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (position) => { const lat = position.coords.latitude; const lng = position.coords.longitude; setTempPosition({ lat, lng }); getAddress(lat, lng); }, (error) => { console.error('Error getting current location:', error); } ); } }; const handleSavePinpoint = (event) => { event.preventDefault(); if (tempAddress === '') { alert('Silahkan pilih lokasi terlebih dahulu'); return; } // console.log('tempPosition', tempPosition.lat); getAddress(tempPosition.lat, tempPosition.lng); setSelectedPosition(tempPosition); setAddressMaps(tempAddress); setPinedMaps(false) }; console.log('set selected position',selectedPosition); return (

Tentukan Pinpoint Lokasi

{isLoaded ? ( (autocompleteRef.current = ref)} onPlaceChanged={handlePlaceSelect} > ) : (

Loading autocomplete...

)}
{isLoaded ? ( onMapClick(e)} icon={{ url: 'https://maps.google.com/mapfiles/ms/icons/red-pushpin.png', scaledSize: new window.google.maps.Size(40, 40), }} /> ) : (

Loading map...

)}

PinPoint :

); }; export default PinpointLocation;