PageSourceSearch

https://www.paxlovid.com/lib/blocks/find-a-doctor/find-a-doctor.js

js paxlovid.com collected 2026-09-25 20:09:22 UTC 2,321 bytes, 62 lines download raw bytes

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.