updates on the address autocomplete
This commit is contained in:
@@ -34,6 +34,171 @@ export const isWithinKanyakumariDistrict = (lat, lon) => {
|
||||
|
||||
// Curated Nagercoil & Kanyakumari local areas dictionary for instant 0ms sublocality match
|
||||
const NAGERCOIL_LOCALITIES = [
|
||||
{
|
||||
name: 'Joshua Street',
|
||||
aliases: ['Joshua St', 'Joshua Street Nagercoil', 'Joshua St Nagercoil', 'Puthukudierupu Joshua Street', 'Gopala Krishna Complex Joshua Street'],
|
||||
display_name: 'Joshua Street, Puthukudierupu, off WCC Road, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1877',
|
||||
lon: '77.4242',
|
||||
suburb: 'Puthukudierupu',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Mount View',
|
||||
aliases: ['Mount View Nagercoil', 'Mount View Street', 'Mount View Street Nagercoil', 'Mount View Putheri', 'Mountview', 'Mount View Colony'],
|
||||
display_name: 'Mount View, near CBH Road, Putheri, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.2040',
|
||||
lon: '77.4300',
|
||||
suburb: 'Putheri',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Mela Theru Karai',
|
||||
aliases: ['Melatherukarai', 'Mela Therukarai', 'Mela Theru Karai Nagercoil', 'Melatherukarai Nagercoil', 'Krishnankovil Mela Theru Karai', 'Mela Theru'],
|
||||
display_name: 'Mela Theru Karai, Krishnankovil, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1955',
|
||||
lon: '77.4254',
|
||||
suburb: 'Krishnankovil',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Rahmanth Garden',
|
||||
aliases: ['Rahmath Garden', 'Rahmanth Garden Nagercoil', 'Rahmath Garden Nagercoil', 'Sarakkalvilai Rahmath Garden', 'Rahmath Garden Jumaa Masjid', 'Rahmanth Garden Sarakkalvilai'],
|
||||
display_name: 'Rahmanth Garden (Rahmath Garden), Sarakkalvilai, Nagercoil, Tamil Nadu 629002, India',
|
||||
lat: '8.1750',
|
||||
lon: '77.4380',
|
||||
suburb: 'Sarakkalvilai',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'CBH Road',
|
||||
aliases: ['CBH Hospital Area', 'CBH Hospital', 'CBH Road Nagercoil'],
|
||||
display_name: 'CBH Road, near CBH Hospital, Putheri, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1994',
|
||||
lon: '77.4315',
|
||||
suburb: 'Putheri',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Arunachalam Colony',
|
||||
aliases: ['Arunachalam Colony Nagercoil'],
|
||||
display_name: 'Arunachalam Colony, near CBH Road, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1994',
|
||||
lon: '77.4315',
|
||||
suburb: 'King Nagar',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Simon Nagar',
|
||||
aliases: ['Simon Nagar Nagercoil'],
|
||||
display_name: 'Simon Nagar, Weavers Colony Area, Nagercoil, Tamil Nadu 629004, India',
|
||||
lat: '8.1630',
|
||||
lon: '77.4190',
|
||||
suburb: 'Weavers Colony',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629004'
|
||||
},
|
||||
{
|
||||
name: 'Water Tank Road',
|
||||
aliases: ['Water Tank Road Nagercoil', 'Prayera Colony'],
|
||||
display_name: 'Water Tank Road, Prayera Colony, Ramavarmapuram, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1845',
|
||||
lon: '77.4275',
|
||||
suburb: 'Ramavarmapuram',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Ramavarmapuram',
|
||||
aliases: ['ராமவர்மபுரம்', 'Ramavarmapuram Nagercoil'],
|
||||
display_name: 'Ramavarmapuram, Nagercoil, Kanyakumari District, Tamil Nadu 629001, India',
|
||||
lat: '8.1840',
|
||||
lon: '77.4280',
|
||||
suburb: 'Ramavarmapuram',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Puthukudierupu',
|
||||
aliases: ['Puthukudierupu Nagercoil', 'Puthukudiyiruppu'],
|
||||
display_name: 'Puthukudierupu, off WCC Road, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1877',
|
||||
lon: '77.4242',
|
||||
suburb: 'Puthukudierupu',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Krishnankovil',
|
||||
aliases: ['Krishnancoil', 'Krishnankoil', 'Krishnankovil Nagercoil'],
|
||||
display_name: 'Krishnankovil, Vadasery Area, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1955',
|
||||
lon: '77.4254',
|
||||
suburb: 'Krishnankovil',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Sarakkalvilai',
|
||||
aliases: ['Sarakkalvilai Nagercoil'],
|
||||
display_name: 'Sarakkalvilai, Nagercoil, Kanyakumari District, Tamil Nadu 629002, India',
|
||||
lat: '8.1750',
|
||||
lon: '77.4380',
|
||||
suburb: 'Sarakkalvilai',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'WCC Road',
|
||||
aliases: ['WCC Road Nagercoil', 'Womens Christian College Road'],
|
||||
display_name: 'WCC Road, Meenakshipuram / Vetturnimadam, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1874',
|
||||
lon: '77.4233',
|
||||
suburb: 'Vetturnimadam',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Beach Road',
|
||||
aliases: ['Beach Road Nagercoil', 'Erulapappuram Beach Road'],
|
||||
display_name: 'Beach Road, Erulapappuram, Nagercoil, Tamil Nadu 629002, India',
|
||||
lat: '8.1580',
|
||||
lon: '77.4380',
|
||||
suburb: 'Erulapappuram',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'Perumal Nagar',
|
||||
aliases: ['Mela Putheri', 'Perumal Nagar Nagercoil'],
|
||||
display_name: 'Perumal Nagar, Mela Putheri, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.2060',
|
||||
lon: '77.4300',
|
||||
suburb: 'Putheri',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Kurusady',
|
||||
display_name: 'Kurusady, Ramanputhoor Road, Nagercoil, Tamil Nadu 629004, India',
|
||||
@@ -194,6 +359,226 @@ const NAGERCOIL_LOCALITIES = [
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'Nagercoil Town',
|
||||
aliases: ['Nagercoil', 'Nagercoil City', 'Nagercoil Central', 'Nagercoil Town Area'],
|
||||
display_name: 'Nagercoil, Kanyakumari District, Tamil Nadu 629001, India',
|
||||
lat: '8.1833',
|
||||
lon: '77.4119',
|
||||
suburb: 'Nagercoil Town',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'KP Road',
|
||||
aliases: ['Kottar Parvathipuram Road', 'KP Road Nagercoil'],
|
||||
display_name: 'KP Road (Kottar-Parvathipuram Road), Nagercoil, Tamil Nadu 629003, India',
|
||||
lat: '8.1880',
|
||||
lon: '77.4150',
|
||||
suburb: 'Vetturnimadam',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629003'
|
||||
},
|
||||
{
|
||||
name: 'South Car Street',
|
||||
aliases: ['South Car St', 'South Car Street Nagercoil', 'Thekku Ratha Veethi'],
|
||||
display_name: 'South Car Street, Kottar / Nagaraja Temple Area, Nagercoil, Tamil Nadu 629002, India',
|
||||
lat: '8.1710',
|
||||
lon: '77.4350',
|
||||
suburb: 'Kottar',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'North Car Street',
|
||||
aliases: ['North Car St', 'North Car Street Nagercoil', 'Vadakku Ratha Veethi'],
|
||||
display_name: 'North Car Street, Nagaraja Temple Area, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1750',
|
||||
lon: '77.4340',
|
||||
suburb: 'Nagercoil Town',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'East Car Street',
|
||||
aliases: ['East Car St', 'East Car Street Nagercoil', 'Kizhakku Ratha Veethi'],
|
||||
display_name: 'East Car Street, Kottar, Nagercoil, Tamil Nadu 629002, India',
|
||||
lat: '8.1725',
|
||||
lon: '77.4370',
|
||||
suburb: 'Kottar',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'West Car Street',
|
||||
aliases: ['West Car St', 'West Car Street Nagercoil', 'Merkku Ratha Veethi'],
|
||||
display_name: 'West Car Street, Nagaraja Temple Area, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1735',
|
||||
lon: '77.4330',
|
||||
suburb: 'Nagercoil Town',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Cape Road',
|
||||
aliases: ['Cape Road Nagercoil', 'Kanyakumari Cape Road'],
|
||||
display_name: 'Cape Road, Kottar, Nagercoil, Tamil Nadu 629002, India',
|
||||
lat: '8.1740',
|
||||
lon: '77.4340',
|
||||
suburb: 'Kottar',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'Court Road',
|
||||
aliases: ['Court Road Nagercoil', 'District Court Area'],
|
||||
display_name: 'Court Road, District Court Area, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1820',
|
||||
lon: '77.4280',
|
||||
suburb: 'Collectorate',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'College Road',
|
||||
aliases: ['College Road Nagercoil'],
|
||||
display_name: 'College Road, near Scott Christian College, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1860',
|
||||
lon: '77.4260',
|
||||
suburb: 'Meenakshipuram',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Dasan Street',
|
||||
aliases: ['Dhasan Street', 'Dasan St', 'Dasan Street Nagercoil'],
|
||||
display_name: 'Dasan Street, Clock Tower Area, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1830',
|
||||
lon: '77.4300',
|
||||
suburb: 'Nagercoil Town',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Kattayanvilai',
|
||||
aliases: ['Kattayanvilai Nagercoil'],
|
||||
display_name: 'Kattayanvilai, Vadasery, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1930',
|
||||
lon: '77.4280',
|
||||
suburb: 'Vadasery',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Konam',
|
||||
aliases: ['Konam Nagercoil', 'Polytechnic Area Konam'],
|
||||
display_name: 'Konam, Government Polytechnic Area, Nagercoil, Tamil Nadu 629004, India',
|
||||
lat: '8.1620',
|
||||
lon: '77.4200',
|
||||
suburb: 'Konam',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629004'
|
||||
},
|
||||
{
|
||||
name: 'NGO Colony',
|
||||
aliases: ['NGO Colony Nagercoil'],
|
||||
display_name: 'NGO Colony, Kottar Area, Nagercoil, Tamil Nadu 629002, India',
|
||||
lat: '8.1700',
|
||||
lon: '77.4400',
|
||||
suburb: 'Kottar',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629002'
|
||||
},
|
||||
{
|
||||
name: 'Anna Nagar',
|
||||
aliases: ['Anna Nagar Nagercoil'],
|
||||
display_name: 'Anna Nagar, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1860',
|
||||
lon: '77.4200',
|
||||
suburb: 'Vetturnimadam',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Gandhi Nagar',
|
||||
aliases: ['Gandhi Nagar Nagercoil'],
|
||||
display_name: 'Gandhi Nagar, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1890',
|
||||
lon: '77.4180',
|
||||
suburb: 'Vetturnimadam',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Christopher Bus Stand',
|
||||
aliases: ['Vadasery Bus Stand', 'Christopher Bus Stand Nagercoil'],
|
||||
display_name: 'Christopher Bus Stand (Vadasery), Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1910',
|
||||
lon: '77.4320',
|
||||
suburb: 'Vadasery',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Anna Bus Stand',
|
||||
aliases: ['Meenakshipuram Bus Stand', 'Anna Bus Stand Nagercoil'],
|
||||
display_name: 'Anna Bus Stand, Meenakshipuram, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1830',
|
||||
lon: '77.4310',
|
||||
suburb: 'Meenakshipuram',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Nagaraja Temple',
|
||||
aliases: ['Nagaraja Kovil', 'Nagaraja Temple Nagercoil'],
|
||||
display_name: 'Nagaraja Temple, Temple Road, Nagercoil, Tamil Nadu 629001, India',
|
||||
lat: '8.1735',
|
||||
lon: '77.4345',
|
||||
suburb: 'Nagercoil Town',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629001'
|
||||
},
|
||||
{
|
||||
name: 'Scott Christian College',
|
||||
aliases: ['Scott College', 'Scott Christian College Nagercoil'],
|
||||
display_name: 'Scott Christian College, WCC Road, Nagercoil, Tamil Nadu 629003, India',
|
||||
lat: '8.1880',
|
||||
lon: '77.4220',
|
||||
suburb: 'Vetturnimadam',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629003'
|
||||
},
|
||||
{
|
||||
name: 'Holy Cross College',
|
||||
aliases: ['Holy Cross College Nagercoil', 'Roch Nagar'],
|
||||
display_name: 'Holy Cross College, Roch Nagar, Nagercoil, Tamil Nadu 629004, India',
|
||||
lat: '8.1570',
|
||||
lon: '77.4120',
|
||||
suburb: 'Roch Nagar',
|
||||
city: 'Nagercoil',
|
||||
state: 'Tamil Nadu',
|
||||
postcode: '629004'
|
||||
},
|
||||
{
|
||||
name: 'Tower Junction',
|
||||
display_name: 'Tower Junction, Clock Tower Area, Nagercoil, Tamil Nadu 629001, India',
|
||||
@@ -403,11 +788,13 @@ export const toPlace = (result) => {
|
||||
const lat = parseFloat(result.lat || result.latitude || 0);
|
||||
const lng = parseFloat(result.lon || result.lng || result.longitude || 0);
|
||||
const name = result.name || result.display_name?.split(',')[0] || '';
|
||||
const addr = result.address || {
|
||||
suburb: result.suburb || '',
|
||||
city: result.city || 'Nagercoil',
|
||||
state: result.state || 'Tamil Nadu',
|
||||
postcode: result.postcode || ''
|
||||
const addr = {
|
||||
house_number: result.address?.house_number || '',
|
||||
road: result.address?.road || result.address?.street || name,
|
||||
suburb: result.address?.suburb || result.suburb || '',
|
||||
city: result.address?.city || result.city || 'Nagercoil',
|
||||
state: result.address?.state || result.state || 'Tamil Nadu',
|
||||
postcode: result.address?.postcode || result.postcode || ''
|
||||
};
|
||||
|
||||
let formatted = result.display_name || name;
|
||||
@@ -582,7 +969,24 @@ const searchNominatim = async (query, bias) => {
|
||||
|
||||
const res = await fetchWithTimeout(`${NOMINATIM_SEARCH_URL}?${params.toString()}`, { headers: { Accept: 'application/json' } });
|
||||
if (!res.ok) return [];
|
||||
const results = await res.json();
|
||||
let results = await res.json();
|
||||
if (!Array.isArray(results) || results.length === 0) {
|
||||
const fallbackParams = new URLSearchParams({
|
||||
q: enrichedQuery,
|
||||
format: 'json',
|
||||
addressdetails: '1',
|
||||
limit: '8',
|
||||
countrycodes: 'in',
|
||||
viewbox: KANYAKUMARI_VIEWBOX_NOMINATIM
|
||||
});
|
||||
const fallbackRes = await fetchWithTimeout(`${NOMINATIM_SEARCH_URL}?${fallbackParams.toString()}`, { headers: { Accept: 'application/json' } });
|
||||
if (fallbackRes.ok) {
|
||||
const fallbackData = await fallbackRes.json();
|
||||
if (Array.isArray(fallbackData)) {
|
||||
results = fallbackData;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!Array.isArray(results)) return [];
|
||||
|
||||
return results
|
||||
@@ -603,51 +1007,100 @@ const searchNominatim = async (query, bias) => {
|
||||
}
|
||||
};
|
||||
|
||||
const GENERIC_TOKENS = new Set([
|
||||
'nagercoil', 'kanyakumari', 'kanniyakumari', 'tamil', 'nadu', 'india', 'tamilnadu',
|
||||
'district', 'street', 'st', 'road', 'rd', 'lane', 'colony', 'nagar', 'garden',
|
||||
'cross', 'main', 'junction', 'junc', 'area', 'town'
|
||||
]);
|
||||
|
||||
const normalizeStr = (s) => (s || '').toLowerCase().replace(/[^a-z0-9\s]/g, ' ').replace(/\s+/g, ' ').trim();
|
||||
const compactStr = (s) => (s || '').toLowerCase().replace(/[^a-z0-9]/g, '');
|
||||
|
||||
// Filter local Nagercoil / Kanyakumari knowledge base with door number and tokenized matching
|
||||
const matchLocalNagercoil = (query) => {
|
||||
if (!query || query.trim().length < 2) return [];
|
||||
const raw = query.trim();
|
||||
const rawLower = raw.toLowerCase();
|
||||
const { doorNo, cleanQuery } = extractDoorPrefix(raw);
|
||||
const cleanLower = cleanQuery.toLowerCase();
|
||||
const tokens = cleanLower.split(/[\s,]+/).filter((t) => t.length >= 2);
|
||||
const targetQuery = cleanQuery || raw;
|
||||
const clean = normalizeStr(targetQuery);
|
||||
const cleanComp = compactStr(targetQuery);
|
||||
const tokens = clean.split(' ').filter((t) => t.length >= 2);
|
||||
const distinctiveTokens = tokens.filter((t) => !GENERIC_TOKENS.has(t));
|
||||
const tokensToCheck = distinctiveTokens.length > 0 ? distinctiveTokens : tokens;
|
||||
|
||||
return NAGERCOIL_LOCALITIES.filter((loc) => {
|
||||
const nameLower = loc.name.toLowerCase();
|
||||
const displayLower = loc.display_name.toLowerCase();
|
||||
const suburbLower = loc.suburb.toLowerCase();
|
||||
const scored = [];
|
||||
|
||||
// 1. Direct query inside locality name or display name (e.g. query='kuru')
|
||||
if (nameLower.includes(rawLower) || displayLower.includes(rawLower) || suburbLower.includes(rawLower)) {
|
||||
return true;
|
||||
for (let idx = 0; idx < NAGERCOIL_LOCALITIES.length; idx++) {
|
||||
const loc = NAGERCOIL_LOCALITIES[idx];
|
||||
const nameNorm = normalizeStr(loc.name);
|
||||
const nameComp = compactStr(loc.name);
|
||||
const dispNorm = normalizeStr(loc.display_name);
|
||||
const dispComp = compactStr(loc.display_name);
|
||||
const subNorm = normalizeStr(loc.suburb);
|
||||
const aliasNorms = (loc.aliases || []).map(normalizeStr);
|
||||
const aliasComps = (loc.aliases || []).map(compactStr);
|
||||
|
||||
let score = 0;
|
||||
|
||||
// 1. Exact or phrase match on name or aliases
|
||||
if (nameNorm === clean || aliasNorms.includes(clean)) {
|
||||
score = 100;
|
||||
} else if (nameNorm.startsWith(clean) || aliasNorms.some((a) => a.startsWith(clean))) {
|
||||
score = 90;
|
||||
} else if (clean.includes(nameNorm) || aliasNorms.some((a) => clean.includes(a))) {
|
||||
score = 85;
|
||||
} else if (nameNorm.includes(clean) || aliasNorms.some((a) => a.includes(clean))) {
|
||||
score = 80;
|
||||
} else if (nameComp === cleanComp || aliasComps.includes(cleanComp)) {
|
||||
score = 75;
|
||||
} else if (
|
||||
nameComp.includes(cleanComp) ||
|
||||
cleanComp.includes(nameComp) ||
|
||||
aliasComps.some((a) => a.includes(cleanComp) || cleanComp.includes(a))
|
||||
) {
|
||||
score = 70;
|
||||
} else if (dispNorm.includes(clean)) {
|
||||
score = 65;
|
||||
} else if (dispComp.includes(cleanComp)) {
|
||||
score = 60;
|
||||
} else if (
|
||||
tokensToCheck.length > 0 &&
|
||||
tokensToCheck.every((t) => nameNorm.includes(t) || subNorm.includes(t) || dispNorm.includes(t) || aliasNorms.some((a) => a.includes(t)))
|
||||
) {
|
||||
score = 50;
|
||||
} else if (
|
||||
tokensToCheck.length > 0 &&
|
||||
tokensToCheck.some((t) => nameNorm.includes(t) || aliasNorms.some((a) => a.includes(t)))
|
||||
) {
|
||||
score = 30;
|
||||
}
|
||||
// 2. Query contains locality name (e.g. query='262, kurusady, nagercoil')
|
||||
if (rawLower.includes(nameLower) || cleanLower.includes(nameLower)) {
|
||||
return true;
|
||||
|
||||
if (score > 0) {
|
||||
const formatted = doorNo ? `${doorNo}, ${loc.display_name}` : loc.display_name;
|
||||
scored.push({
|
||||
score,
|
||||
item: {
|
||||
place_id: `nagercoil-local-${idx}-${doorNo ? `${doorNo}-` : ''}${loc.name}`,
|
||||
name: doorNo ? `${doorNo}, ${loc.name}` : loc.name,
|
||||
display_name: formatted,
|
||||
lat: loc.lat,
|
||||
lon: loc.lon,
|
||||
address: {
|
||||
house_number: doorNo || '',
|
||||
road: loc.name,
|
||||
suburb: loc.suburb,
|
||||
city: loc.city,
|
||||
state: loc.state,
|
||||
postcode: loc.postcode,
|
||||
country: 'India'
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// 3. Any token in query matches locality name
|
||||
if (tokens.some((t) => nameLower.includes(t) || suburbLower.includes(t))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}).map((loc, idx) => {
|
||||
const formatted = doorNo ? `${doorNo}, ${loc.display_name}` : loc.display_name;
|
||||
return {
|
||||
place_id: `nagercoil-local-${idx}-${doorNo ? `${doorNo}-` : ''}${loc.name}`,
|
||||
name: doorNo ? `${doorNo}, ${loc.name}` : loc.name,
|
||||
display_name: formatted,
|
||||
lat: loc.lat,
|
||||
lon: loc.lon,
|
||||
address: {
|
||||
house_number: doorNo || '',
|
||||
suburb: loc.suburb,
|
||||
city: loc.city,
|
||||
state: loc.state,
|
||||
postcode: loc.postcode,
|
||||
country: 'India'
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
scored.sort((a, b) => b.score - a.score);
|
||||
return scored.map((s) => s.item);
|
||||
};
|
||||
|
||||
export async function geocodeAddress(address, { bias } = {}) {
|
||||
|
||||
@@ -571,6 +571,11 @@ const Createorder1 = () => {
|
||||
// =============================================== || createsubmitobj1 (create orders) || ===============================================
|
||||
|
||||
const createsubmitobj2 = async () => {
|
||||
const pickLat = pickCust.latitude || startPoint.latitude || 0;
|
||||
const pickLng = pickCust.longitude || startPoint.longitude || 0;
|
||||
const dropLat = dropCust.latitude || endPoint.latitude || 0;
|
||||
const dropLng = dropCust.longitude || endPoint.longitude || 0;
|
||||
|
||||
let arr = {};
|
||||
arr = {
|
||||
orders: {
|
||||
@@ -586,11 +591,11 @@ const Createorder1 = () => {
|
||||
deliverycustomer: dropCust.firstname || '',
|
||||
deliveryid: isNumChange2 == 0 ? +dropCust.customerid || 0 : 0,
|
||||
deliverylandmark: dropCust.landmark || '',
|
||||
deliverylat: (dropCust.latitude || 0).toString(),
|
||||
deliverylat: (dropLat || 0).toString(),
|
||||
deliverylocation: dropCust.suburb || '',
|
||||
deliverylocationid: dropCust.deliverylocationid || 0,
|
||||
deliverylong: (dropCust.longitude || 0).toString(),
|
||||
deliverytime: `${dayjs(startdate).format('YYYY-MM-DD')} ${dayjs(selectedtime.$d).format('HH:mm:ss')}`,
|
||||
deliverylong: (dropLng || 0).toString(),
|
||||
deliverytime: `${dayjs(startdate).format('YYYY-MM-DD')} ${dayjs(selectedtime?.$d || selectedtime).format('HH:mm:ss')}`,
|
||||
deliverytype: pickCust.customerid !== 0 || dropCust.customerid !== 0 ? 'B' : 'C',
|
||||
delivered: '',
|
||||
itemcount: 1,
|
||||
@@ -614,10 +619,10 @@ const Createorder1 = () => {
|
||||
pickupcontactno: pickCust.contactno || '',
|
||||
pickupcustomer: pickCust.firstname || '',
|
||||
pickuplandmark: pickCust.landmark || '',
|
||||
pickuplat: (pickCust.latitude || 0).toString(),
|
||||
pickuplat: (pickLat || 0).toString(),
|
||||
pickuplocation: pickCust.suburb || '',
|
||||
pickuplocationid: pickCust.deliverylocationid || 0,
|
||||
pickuplong: (pickCust.longitude || 0).toString(),
|
||||
pickuplong: (pickLng || 0).toString(),
|
||||
processing: '',
|
||||
ready: '',
|
||||
remarks: '',
|
||||
@@ -645,8 +650,8 @@ const Createorder1 = () => {
|
||||
email: pickCust.email || '',
|
||||
firstname: pickCust.firstname || '',
|
||||
landmark: pickCust.landmark || '',
|
||||
latitude: (pickCust.latitude || 0).toString(),
|
||||
longitude: (pickCust.longitude || 0).toString(),
|
||||
latitude: (pickLat || 0).toString(),
|
||||
longitude: (pickLng || 0).toString(),
|
||||
locationid: pickCust.deliverylocationid || 0,
|
||||
postcode: pickCust.postcode || '',
|
||||
primaryaddress: 1,
|
||||
@@ -671,8 +676,8 @@ const Createorder1 = () => {
|
||||
email: dropCust.email || '',
|
||||
firstname: dropCust.firstname || '',
|
||||
landmark: dropCust.landmark || '',
|
||||
latitude: (dropCust.latitude || 0).toString(),
|
||||
longitude: (dropCust.longitude || 0).toString(),
|
||||
latitude: (dropLat || 0).toString(),
|
||||
longitude: (dropLng || 0).toString(),
|
||||
locationid: dropCust.deliverylocationid || 0,
|
||||
postcode: dropCust.postcode || '',
|
||||
primaryaddress: 1,
|
||||
@@ -697,7 +702,7 @@ const Createorder1 = () => {
|
||||
opentoast('Enter Pickup Postcode ', 'warning', 2000);
|
||||
} else if (!pickCust.landmark) {
|
||||
opentoast('Enter Pickup Landmark ', 'warning', 2000);
|
||||
} else if (!pickCust.latitude || !pickCust.longitude) {
|
||||
} else if (!Number(pickLat) || !Number(pickLng)) {
|
||||
opentoast('Could not locate Pickup address on map, please recheck the address', 'error', 3000);
|
||||
} else if (!dropCust.firstname) {
|
||||
opentoast('Enter Drop Contact Name ', 'warning', 2000);
|
||||
@@ -713,17 +718,18 @@ const Createorder1 = () => {
|
||||
opentoast('Enter Drop postcode ', 'warning', 2000);
|
||||
} else if (!dropCust.landmark) {
|
||||
opentoast('Enter Drop Landmark ', 'warning', 2000);
|
||||
} else if (!dropCust.latitude || !dropCust.longitude) {
|
||||
} else if (!Number(dropLat) || !Number(dropLng)) {
|
||||
opentoast('Could not locate Drop address on map, please recheck the address', 'error', 3000);
|
||||
} else if (!selectedtime) {
|
||||
opentoast('Choose deliverytime ', 'warning', 2000);
|
||||
} else if (!setSubCatId) {
|
||||
} else if (!subCatId) {
|
||||
opentoast('Choose SubCategory ', 'warning', 2000);
|
||||
} else {
|
||||
try {
|
||||
const createRes = await axios.post(`${process.env.REACT_APP_URL2}/orders/createorder`, arr);
|
||||
// const createRes = await axios.post(`${process.env.REACT_APP_URL}/orders/createorder`, arr);
|
||||
if (createRes.data.status) {
|
||||
const isSuccess = Boolean(createRes?.data?.status || createRes?.data?.code === 200 || createRes?.status === 200);
|
||||
if (isSuccess) {
|
||||
console.log('createRes', createRes);
|
||||
enqueueSnackbar('Order Created Successfully', {
|
||||
variant: 'success',
|
||||
@@ -731,18 +737,30 @@ const Createorder1 = () => {
|
||||
autoHideDuration: 1000
|
||||
});
|
||||
if (admintoken) {
|
||||
notifyadmin(admintoken);
|
||||
// sendnotifications();
|
||||
try {
|
||||
sendnotifications(admintoken);
|
||||
} catch (notifyErr) {
|
||||
console.warn('Notification send error (non-blocking):', notifyErr);
|
||||
}
|
||||
}
|
||||
|
||||
setLoading(false);
|
||||
navigate('/nearle/orders');
|
||||
return;
|
||||
} else {
|
||||
opentoast('Something went wrong, Cannot create order', 'warning');
|
||||
opentoast(createRes?.data?.message || 'Something went wrong, Cannot create order', 'warning');
|
||||
}
|
||||
setLoading(false);
|
||||
console.log(createRes);
|
||||
} catch (error) {
|
||||
console.log('createResErr', error);
|
||||
opentoast(
|
||||
error?.response?.data?.message ||
|
||||
error?.message ||
|
||||
'Something went wrong, Cannot create order',
|
||||
'error'
|
||||
);
|
||||
setLoading(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -846,42 +864,35 @@ const Createorder1 = () => {
|
||||
};
|
||||
|
||||
// ================================================== || sendnotifications || ==================================================
|
||||
const sendnotifications = async () => {
|
||||
setLoading(true);
|
||||
await axios
|
||||
.post(`${process.env.REACT_APP_URL}/utils/sendnotifications`, {
|
||||
const sendnotifications = async (tokens) => {
|
||||
const targetTokens = tokens || admintoken;
|
||||
if (!targetTokens || (Array.isArray(targetTokens) && targetTokens.length === 0)) return;
|
||||
try {
|
||||
const res = await axios.post(`${process.env.REACT_APP_URL}/utils/sendnotifications`, {
|
||||
priority: 'high',
|
||||
registration_ids: admintoken,
|
||||
registration_ids: targetTokens,
|
||||
data: {
|
||||
accessid: process.env.REACT_APP_RIDER_ACCESS_ID
|
||||
},
|
||||
notification: {
|
||||
title: 'Nearle Merchant',
|
||||
body: 'An Order has been placed successfully,kindly process the same',
|
||||
body: 'An Order has been placed successfully, kindly process the same',
|
||||
sound: 'ring'
|
||||
}
|
||||
})
|
||||
.then((res) => {
|
||||
console.log(res);
|
||||
if (res.data.message == 'Success') {
|
||||
enqueueSnackbar('Notification sent Successfully', {
|
||||
variant: 'success',
|
||||
anchorOrigin: { vertical: 'top', horizontal: 'right' },
|
||||
autoHideDuration: 1000
|
||||
});
|
||||
}
|
||||
setLoading(false);
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
enqueueSnackbar(err.message, {
|
||||
variant: 'error',
|
||||
});
|
||||
console.log('sendnotifications res:', res);
|
||||
if (res?.data?.message === 'Success') {
|
||||
enqueueSnackbar('Notification sent Successfully', {
|
||||
variant: 'success',
|
||||
anchorOrigin: { vertical: 'top', horizontal: 'right' },
|
||||
autoHideDuration: 1000
|
||||
});
|
||||
setLoading(false);
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn('sendnotifications error (non-fatal):', err);
|
||||
}
|
||||
};
|
||||
const notifyadmin = sendnotifications;
|
||||
// ============================================= || Address Autocomplete (pick) || =============================================
|
||||
// `overwriteFields: false` is used by the manual-typing fallback below — it only
|
||||
// sets the map pin (lat/lng) and leaves the Address box / Door No / Area / City /
|
||||
@@ -2257,14 +2268,15 @@ const Createorder1 = () => {
|
||||
disabled={!showDistance}
|
||||
variant="contained"
|
||||
startIcon={btnLoading ? null : <MdCheckCircle size={16} />}
|
||||
onClick={() => {
|
||||
onClick={async () => {
|
||||
setLoading(true);
|
||||
setBtnLoading(true);
|
||||
createsubmitobj2();
|
||||
setTimeout(() => {
|
||||
try {
|
||||
await createsubmitobj2();
|
||||
} finally {
|
||||
setLoading(false);
|
||||
setBtnLoading(false);
|
||||
}, 1000);
|
||||
}
|
||||
}}
|
||||
sx={{
|
||||
borderRadius: 999,
|
||||
|
||||
Reference in New Issue
Block a user