1// eslint-disable-next-line import/extensions 2import { fetchDoctors } from './find-doctor-api.js'; 3 4async function geocodeZip(zip) { 5 const response = await fetch(`https://api.zippopotam.us/us/${zip}`); 6 if (!response.ok) return null; 7 const data = await response.json(); 8 const place = data.places?.[0]; 9 if (!place) return null; 10 return { lat: parseFloat(place.latitude), lng: parseFloat(place.longitude) }; 11} 12 13/** 14 * Get search parameters from URL â accepts ?zip=10011 or ?lat=&lon= (legacy) 15 * @returns {Object} Search parameters object 16 */ 17export function getDoctorSearchParams() { 18 const searchParams = new URLSearchParams(window.location.search); 19 return { 20 zip: searchParams.get('zip') || null, 21 q: searchParams.get('q') || null, 22 lat: parseFloat(searchParams.get('lat')) || null, 23 lon: parseFloat(searchParams.get('lon')) || null, 24 distance: searchParams.get('distance') || '20mi', 25 }; 26} 27 28/** 29 * Run doctor search using real API 30 * Accepts zip code (geocoded via Google Maps) or lat/lon directly 31 * @param {Object} searchParams - Search parameters with zip or lat/lon, distance 32 * @param {string} [apiUrl] - Optional API endpoint override 33 * @param {Function} [geocodeFn] - Injectable geocode function (defaults to GoogleMap.getCoordinates) 34 * @returns {Object} Search results with allDoctors array 35 */ 36export async function runDoctorSearches(searchParams, apiUrl, geocodeFn, size = 10, { signal } = {}) { 37 const { zip, q, distance } = searchParams; 38 let { lat, lon } = searchParams; 39 40 const addressToGeocode = zip || q; 41 if (addressToGeocode && (lat == null || lon == null)) { 42 const coords = await (geocodeFn ? geocodeFn(addressToGeocode) : geocodeZip(addressToGeocode)); 43 if (!coords) { 44 console.error('Doctor Finder: could not geocode', addressToGeocode); 45 return { allDoctors: [], lat: null, lon: null }; 46 } 47 lat = coords.lat; 48 lon = coords.lng; 49 } 50 51 if (lat == null || lon == null || Number.isNaN(lat) || Number.isNaN(lon)) { 52 return { allDoctors: [], lat: null, lon: null }; 53 } 54 55 try { 56 const { doctors } = await fetchDoctors({ lat, lon, distance, size, apiUrl, signal }); 57 return { allDoctors: doctors, lat, lon }; 58 } catch (error) { 59 console.error('Doctor Finder API error:', error); 60 return { allDoctors: [], lat, lon }; 61 } 62}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.