// Geolocation utilities export function calculateDistance(lat1: number, lng1: number, lat2: number, lng2: number): number { const R = 3959; // Earth's radius in miles const dLat = (lat2 - lat1) * Math.PI / 180; const dLng = (lng2 - lng1) * Math.PI / 180; const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLng / 2) * Math.sin(dLng / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; } export async function getCurrentLocation(): Promise<{ lat: number; lng: number } | null> { return new Promise((resolve) => { if (!navigator.geolocation) { resolve(null); return; } navigator.geolocation.getCurrentPosition( (position) => { resolve({ lat: position.coords.latitude, lng: position.coords.longitude, }); }, () => { resolve(null); }, { timeout: 10000 } ); }); } // San Diego ZIP code validation and coordinates const SAN_DIEGO_ZIP_COORDINATES: Record = { '92101': { lat: 32.7150, lng: -117.1600 }, // Downtown (unique) '92102': { lat: 32.7040, lng: -117.1290 }, // Logan Heights (unique) '92103': { lat: 32.7338, lng: -117.1471 }, // Core-Columbia (unique) '92104': { lat: 32.7492, lng: -117.0714 }, // College-Rolando (unique) '92105': { lat: 32.7099, lng: -117.1252 }, // Southeastern San Diego (unique) '92106': { lat: 32.7340, lng: -117.1440 }, // Point Loma (unique) '92107': { lat: 32.7479, lng: -117.1988 }, // Ocean Beach (unique) '92108': { lat: 32.7480, lng: -117.1990 }, // Mission Valley (unique) '92109': { lat: 32.7724, lng: -117.1799 }, // Pacific Beach (unique) '92110': { lat: 32.7734, lng: -117.1799 }, // Mission Bay (unique) '92111': { lat: 32.8338, lng: -117.2060 }, // Clairemont (unique) '92113': { lat: 32.6757, lng: -117.0752 }, // Southeastern San Diego (unique) '92114': { lat: 32.7040, lng: -117.1299 }, // Southeastern San Diego (unique) '92115': { lat: 32.7421, lng: -117.1055 }, // City Heights (unique) '92116': { lat: 32.7654, lng: -117.1174 }, // Kensington (unique) '92117': { lat: 32.8348, lng: -117.2060 }, // Clairemont (unique) '92118': { lat: 32.6154, lng: -117.0855 }, // Coronado (unique) '92119': { lat: 32.7492, lng: -117.0724 }, // College Area (unique) '92120': { lat: 32.7502, lng: -117.0734 }, // College Area (unique) '92121': { lat: 32.9350, lng: -117.2350 }, // Sorrento Valley (unique) '92122': { lat: 32.8354, lng: -117.2554 }, // La Jolla (unique) '92123': { lat: 32.7724, lng: -117.1790 }, // Serra Mesa (unique) '92124': { lat: 32.7734, lng: -117.1809 }, // Serra Mesa (unique) '92126': { lat: 32.9296, lng: -117.1321 }, // Carmel Mountain (unique) '92127': { lat: 33.0210, lng: -117.1166 }, // Rancho Bernardo (unique) '92128': { lat: 32.9590, lng: -117.1230 }, // Rancho Penasquitos (unique) '92129': { lat: 32.9584, lng: -117.1253 }, // Rancho Penasquitos (manual) '92130': { lat: 32.9350, lng: -117.2350 }, // Carmel Valley (unique) '92131': { lat: 32.9306, lng: -117.1331 }, // Carmel Mountain (unique) '92132': { lat: 32.8364, lng: -117.2564 }, // La Jolla (unique) '92133': { lat: 32.7167, lng: -117.1621 }, // Naval Base (unique) '92134': { lat: 32.7177, lng: -117.1631 }, // Naval Base (unique) '92135': { lat: 32.7187, lng: -117.1641 }, // Naval Base (unique) '92136': { lat: 32.7345, lng: -117.1450 }, // Point Loma (unique) '92137': { lat: 32.7355, lng: -117.1460 }, // Point Loma (unique) '92138': { lat: 32.6164, lng: -117.0865 }, // Naval Air Station (unique) '92139': { lat: 32.6757, lng: -117.0762 }, // Paradise Hills (unique) '92140': { lat: 32.6174, lng: -117.0875 }, // Coronado (unique) '92145': { lat: 32.7197, lng: -117.1651 }, // Naval Medical Center (unique) '92147': { lat: 32.7365, lng: -117.1470 }, // Point Loma (unique) '92154': { lat: 32.5602, lng: -117.0441 }, // San Ysidro (unique) '92155': { lat: 32.5612, lng: -117.0451 }, // San Ysidro (unique) '92173': { lat: 32.6791, lng: -117.0210 }, // Skyline Hills (unique) }; export function isValidSanDiegoZip(zip: string): boolean { return zip in SAN_DIEGO_ZIP_COORDINATES; } export function getCoordinatesFromZip(zip: string): { lat: number; lng: number } | null { return SAN_DIEGO_ZIP_COORDINATES[zip] || null; }