- Removed NotificationPanel component and related files - Removed notifications API endpoint and utils - Fixed data refresh functionality with cache-busting - Added refreshing state with better UI feedback - Added no-cache headers to API endpoint - Improved refresh button with loading state
90 lines
3.9 KiB
TypeScript
90 lines
3.9 KiB
TypeScript
// 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<string, { lat: number; lng: number }> = {
|
|
'92101': { lat: 32.7157, lng: -117.1611 }, // Downtown
|
|
'92102': { lat: 32.7030, lng: -117.1289 }, // Logan Heights
|
|
'92103': { lat: 32.7328, lng: -117.1461 }, // Core-Columbia
|
|
'92104': { lat: 32.7482, lng: -117.0704 }, // College-Rolando
|
|
'92105': { lat: 32.7089, lng: -117.1242 }, // Southeastern San Diego
|
|
'92106': { lat: 32.7330, lng: -117.1430 }, // Point Loma
|
|
'92107': { lat: 32.7469, lng: -117.1978 }, // Ocean Beach
|
|
'92108': { lat: 32.7469, lng: -117.1978 }, // Mission Valley
|
|
'92109': { lat: 32.7714, lng: -117.1789 }, // Pacific Beach
|
|
'92110': { lat: 32.7714, lng: -117.1789 }, // Mission Bay
|
|
'92111': { lat: 32.8328, lng: -117.2050 }, // Clairemont
|
|
'92113': { lat: 32.6747, lng: -117.0742 }, // Southeastern San Diego
|
|
'92114': { lat: 32.7030, lng: -117.1289 }, // Southeastern San Diego
|
|
'92115': { lat: 32.7411, lng: -117.1045 }, // City Heights
|
|
'92116': { lat: 32.7644, lng: -117.1164 }, // Kensington
|
|
'92117': { lat: 32.8328, lng: -117.2050 }, // Clairemont
|
|
'92118': { lat: 32.6144, lng: -117.0845 }, // Coronado
|
|
'92119': { lat: 32.7482, lng: -117.0704 }, // College Area
|
|
'92120': { lat: 32.7482, lng: -117.0704 }, // College Area
|
|
'92121': { lat: 32.9340, lng: -117.2340 }, // Sorrento Valley
|
|
'92122': { lat: 32.8344, lng: -117.2544 }, // La Jolla
|
|
'92123': { lat: 32.7714, lng: -117.1789 }, // Serra Mesa
|
|
'92124': { lat: 32.7714, lng: -117.1789 }, // Serra Mesa
|
|
'92126': { lat: 32.9286, lng: -117.1311 }, // Carmel Mountain
|
|
'92127': { lat: 33.0200, lng: -117.1156 }, // Rancho Bernardo
|
|
'92128': { lat: 32.958034, lng: -117.121975 }, // Rancho Penasquitos
|
|
'92129': { lat: 32.958034, lng: -117.121975 }, // Rancho Penasquitos
|
|
'92130': { lat: 32.9340, lng: -117.2340 }, // Carmel Valley
|
|
'92131': { lat: 32.9286, lng: -117.1311 }, // Carmel Mountain
|
|
'92132': { lat: 32.8344, lng: -117.2544 }, // La Jolla
|
|
'92133': { lat: 32.7157, lng: -117.1611 }, // Naval Base
|
|
'92134': { lat: 32.7157, lng: -117.1611 }, // Naval Base
|
|
'92135': { lat: 32.7157, lng: -117.1611 }, // Naval Base
|
|
'92136': { lat: 32.7330, lng: -117.1430 }, // Point Loma
|
|
'92137': { lat: 32.7330, lng: -117.1430 }, // Point Loma
|
|
'92138': { lat: 32.6144, lng: -117.0845 }, // Naval Air Station
|
|
'92139': { lat: 32.6747, lng: -117.0742 }, // Paradise Hills
|
|
'92140': { lat: 32.6144, lng: -117.0845 }, // Coronado
|
|
'92145': { lat: 32.7157, lng: -117.1611 }, // Naval Medical Center
|
|
'92147': { lat: 32.7330, lng: -117.1430 }, // Point Loma
|
|
'92154': { lat: 32.5592, lng: -117.0431 }, // San Ysidro
|
|
'92155': { lat: 32.5592, lng: -117.0431 }, // San Ysidro
|
|
'92173': { lat: 32.6781, lng: -117.0200 }, // Skyline Hills
|
|
};
|
|
|
|
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;
|
|
}
|