Spaces:
Sleeping
Sleeping
| export function haversineMiles(a: [number, number], b: [number, number]) { | |
| const toRad = (x: number) => (x * Math.PI) / 180; | |
| const R = 3958.7613; // Earth radius in miles | |
| const dLat = toRad(b[0] - a[0]); | |
| const dLon = toRad(b[1] - a[1]); | |
| const lat1 = toRad(a[0]); | |
| const lat2 = toRad(b[0]); | |
| const sinDLat = Math.sin(dLat / 2); | |
| const sinDLon = Math.sin(dLon / 2); | |
| const h = | |
| sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon; | |
| const c = 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h)); | |
| return R * c; | |
| } | |
| export function timeAgo(iso: string, now: Date = new Date()) { | |
| const t = new Date(iso); | |
| const s = Math.max(0, Math.floor((now.getTime() - t.getTime()) / 1000)); | |
| if (s < 60) return `${s}s ago`; | |
| const m = Math.floor(s / 60); | |
| if (m < 60) return `${m}m ago`; | |
| const h = Math.floor(m / 60); | |
| if (h < 24) return `${h}h ago`; | |
| const d = Math.floor(h / 24); | |
| return `${d}d ago`; | |
| } | |