import { useState } from '@wordpress/element'; import { TextControl, Spinner, Button } from '@wordpress/components'; import apiFetch from '@wordpress/api-fetch'; import { useDebounce } from '@wordpress/compose'; const LocationField = ({field, value, onChange }) => { const address = value || {}; const [query, setQuery] = useState(address.address || ''); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const search = useDebounce((search) => { if (!search) return setResults([]); setLoading(true); apiFetch({path: `jvb/v1/geocode?q=${encodeURIComponent(search)}`}) .then(setResults) .finally(()=>setLoading(false)); }, 400); const onSelect = (result) => { const a = result.address || {}; const newAddress = { address: [a.house_number, a.road].filter(Boolean).join(' '), city: a.city||a.town||a.village||'', province: a.state || '', postal_code:a.postcode||'', country: a.country||'', lat: parseFloat(result.lat), lng: parseFloat(result.lng), }; onChange(newAddress); setQuery(newAddress.address); setResults([]); }; const onClear = () => { onChange({}); setQuery(''); setResults([]); } return (
{ setQuery(newQuery); search(newQuery) }} /> {loading && } {!!results.length && (
{results.map((result) => ( ))} {!!address.lat && (

{address.address}, {address.city}, {address.province}{' '} {address.postal_code}, {address.country}

)}
)}
); }; export default LocationField;