updates on the address field on 7/8/2026
This commit is contained in:
@@ -143,22 +143,45 @@ const buildParams = (query, bias) => {
|
|||||||
return params;
|
return params;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Standalone forward-geocode helper — replaces `Geocode.fromAddress(address)`
|
const searchOnce = async (query, bias) => {
|
||||||
// for call sites that resolve a plain text address without a predictions
|
const params = buildParams(query, bias);
|
||||||
// dropdown (e.g. re-geocoding on submit). Returns a `toPlace`-shaped object,
|
|
||||||
// or null if nothing matched.
|
|
||||||
export async function geocodeAddress(address, { bias } = {}) {
|
|
||||||
if (!address) return null;
|
|
||||||
const plusCodeResult = await plusCodeToResult(address, bias);
|
|
||||||
if (plusCodeResult) return toPlace(plusCodeResult);
|
|
||||||
try {
|
|
||||||
const params = buildParams(address, bias);
|
|
||||||
params.set('limit', '1');
|
params.set('limit', '1');
|
||||||
const res = await fetchWithTimeout(`${NOMINATIM_SEARCH_URL}?${params.toString()}`, { headers: { Accept: 'application/json' } });
|
const res = await fetchWithTimeout(`${NOMINATIM_SEARCH_URL}?${params.toString()}`, { headers: { Accept: 'application/json' } });
|
||||||
if (!res.ok) return null;
|
if (!res.ok) return null;
|
||||||
const results = await res.json();
|
const results = await res.json();
|
||||||
if (!results?.length) return null;
|
return results?.length ? results[0] : null;
|
||||||
return toPlace(results[0]);
|
};
|
||||||
|
|
||||||
|
// Standalone forward-geocode helper — replaces `Geocode.fromAddress(address)`
|
||||||
|
// for call sites that resolve a plain text address without a predictions
|
||||||
|
// dropdown (e.g. re-geocoding on submit). Returns a `toPlace`-shaped object,
|
||||||
|
// or null if nothing matched.
|
||||||
|
//
|
||||||
|
// Unlike Google's geocoder, Nominatim only matches when every term in the
|
||||||
|
// query belongs to the same indexed record — it has no "closest approximate
|
||||||
|
// match" behaviour. A door number + unlisted micro-locality/street name (very
|
||||||
|
// common for Indian addresses, e.g. "60, Keezha Raman Puthoor, ...") makes
|
||||||
|
// the whole query match nothing, even though the city/postcode later in the
|
||||||
|
// string resolves fine on its own. So on a miss, retry with the leading
|
||||||
|
// (most specific, least likely to be indexed) comma-separated segments
|
||||||
|
// dropped one at a time until something matches — worst case this lands on
|
||||||
|
// just "<city> <postcode>", an approximate pin instead of no pin at all.
|
||||||
|
export async function geocodeAddress(address, { bias } = {}) {
|
||||||
|
if (!address) return null;
|
||||||
|
const plusCodeResult = await plusCodeToResult(address, bias);
|
||||||
|
if (plusCodeResult) return toPlace(plusCodeResult);
|
||||||
|
const segments = address
|
||||||
|
.split(',')
|
||||||
|
.map((s) => s.trim())
|
||||||
|
.filter(Boolean);
|
||||||
|
const queries = segments.length > 1 ? segments.map((_, i) => segments.slice(i).join(', ')) : [address];
|
||||||
|
try {
|
||||||
|
for (const query of queries) {
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const result = await searchOnce(query, bias);
|
||||||
|
if (result) return toPlace(result);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('geocodeAddress error:', err);
|
console.error('geocodeAddress error:', err);
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ const CreateCustomer = () => {
|
|||||||
const [inputValue2, setInputValue2] = useState('');
|
const [inputValue2, setInputValue2] = useState('');
|
||||||
const [appLocaLat, setAppLocaLat] = useState();
|
const [appLocaLat, setAppLocaLat] = useState();
|
||||||
const [appLocaLng, setAppLocaLng] = useState();
|
const [appLocaLng, setAppLocaLng] = useState();
|
||||||
|
// appLocaLat/appLocaLng load from a separate, independent API call that isn't
|
||||||
|
// guaranteed to finish before the address field becomes typable. Without them,
|
||||||
|
// the free-text geocoder's suggestions carry no geographic bias and return
|
||||||
|
// globally scattered, irrelevant matches for partial/as-you-type queries — so
|
||||||
|
// the address field stays disabled until a real bias point is available.
|
||||||
|
const isBiasReady = Number.isFinite(Number(appLocaLat)) && Number.isFinite(Number(appLocaLng)) && !(Number(appLocaLat) === 0 && Number(appLocaLng) === 0);
|
||||||
const [locaName, setLocoName] = useState('Select Location');
|
const [locaName, setLocoName] = useState('Select Location');
|
||||||
const [locations, setLocations] = useState('Select Location');
|
const [locations, setLocations] = useState('Select Location');
|
||||||
const [tenantlist, setTenantlist] = useState([]);
|
const [tenantlist, setTenantlist] = useState([]);
|
||||||
@@ -457,6 +463,8 @@ const CreateCustomer = () => {
|
|||||||
<AddressAutocomplete
|
<AddressAutocomplete
|
||||||
id="addressAuto1"
|
id="addressAuto1"
|
||||||
fullWidth
|
fullWidth
|
||||||
|
disabled={!isBiasReady}
|
||||||
|
placeholder={isBiasReady ? 'Search address' : 'Loading location…'}
|
||||||
value={inputValue2}
|
value={inputValue2}
|
||||||
onChange={setInputValue2}
|
onChange={setInputValue2}
|
||||||
onPlaceSelected={handlePickPlaceSelected}
|
onPlaceSelected={handlePickPlaceSelected}
|
||||||
|
|||||||
@@ -291,6 +291,13 @@ const Createorder1 = () => {
|
|||||||
const [appLocaLat, setAppLocaLat] = useState();
|
const [appLocaLat, setAppLocaLat] = useState();
|
||||||
const [appLocaLng, setAppLocaLng] = useState();
|
const [appLocaLng, setAppLocaLng] = useState();
|
||||||
const [appLocaRadius, setAppLocaRadius] = useState();
|
const [appLocaRadius, setAppLocaRadius] = useState();
|
||||||
|
// appLocaLat/appLocaLng load from a separate, independent API call (fetchTiming)
|
||||||
|
// that isn't guaranteed to finish before the address field becomes typable
|
||||||
|
// (isLocation, gated on tenant-location selection, resolves on its own timeline).
|
||||||
|
// Without them, the free-text geocoder's suggestions carry no geographic bias and
|
||||||
|
// return globally scattered, irrelevant matches for partial/as-you-type queries —
|
||||||
|
// so the address field stays disabled until a real bias point is available.
|
||||||
|
const isBiasReady = Number.isFinite(Number(appLocaLat)) && Number.isFinite(Number(appLocaLng)) && !(Number(appLocaLat) === 0 && Number(appLocaLng) === 0);
|
||||||
const [isNumChange1, setIsNumChange1] = useState(0);
|
const [isNumChange1, setIsNumChange1] = useState(0);
|
||||||
const [isNumChange2, setIsNumChange2] = useState(0);
|
const [isNumChange2, setIsNumChange2] = useState(0);
|
||||||
const [showCheck1, setShowCheck1] = useState(0);
|
const [showCheck1, setShowCheck1] = useState(0);
|
||||||
@@ -484,8 +491,9 @@ const Createorder1 = () => {
|
|||||||
.get(`${process.env.REACT_APP_URL}/utils/getapplocations/?applocationid=${appId}`)
|
.get(`${process.env.REACT_APP_URL}/utils/getapplocations/?applocationid=${appId}`)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
console.log('fetchTiming', res);
|
console.log('fetchTiming', res);
|
||||||
const { opentime, closetime, latitude, longitude, radius } = res.data.details[0];
|
const details = res.data?.details?.[0];
|
||||||
if (res.data.status) {
|
if (res.data.status && details) {
|
||||||
|
const { opentime, closetime, latitude, longitude, radius } = details;
|
||||||
setAppLocaLat(latitude);
|
setAppLocaLat(latitude);
|
||||||
setAppLocaLng(longitude);
|
setAppLocaLng(longitude);
|
||||||
setAppLocaRadius(radius);
|
setAppLocaRadius(radius);
|
||||||
@@ -1331,7 +1339,8 @@ const Createorder1 = () => {
|
|||||||
<div>
|
<div>
|
||||||
<AddressAutocomplete
|
<AddressAutocomplete
|
||||||
label="Address"
|
label="Address"
|
||||||
disabled={!isLocation}
|
disabled={!isLocation || !isBiasReady}
|
||||||
|
placeholder={isBiasReady ? 'Search address' : 'Loading location…'}
|
||||||
id="addressAuto1"
|
id="addressAuto1"
|
||||||
fullWidth
|
fullWidth
|
||||||
value={inputValue2}
|
value={inputValue2}
|
||||||
@@ -1747,7 +1756,8 @@ const Createorder1 = () => {
|
|||||||
<div>
|
<div>
|
||||||
<AddressAutocomplete
|
<AddressAutocomplete
|
||||||
id="addressAuto2"
|
id="addressAuto2"
|
||||||
disabled={!isLocation}
|
disabled={!isLocation || !isBiasReady}
|
||||||
|
placeholder={isBiasReady ? 'Search address' : 'Loading location…'}
|
||||||
label="Address"
|
label="Address"
|
||||||
fullWidth
|
fullWidth
|
||||||
value={inputValue3}
|
value={inputValue3}
|
||||||
|
|||||||
Reference in New Issue
Block a user