File size: 1,322 Bytes
0d08431 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import { useCallback, useState } from "react";
export interface GeoState {
lat: number | null;
lon: number | null;
error: string | null;
loading: boolean;
}
// Pune city centre — fallback so the map is never empty during a demo.
export const DEFAULT_CENTER: [number, number] = [18.5204, 73.8567];
export function useGeolocation() {
const [state, setState] = useState<GeoState>({
lat: null,
lon: null,
error: null,
loading: false,
});
const request = useCallback((): Promise<{ lat: number; lon: number } | null> => {
return new Promise((resolve) => {
if (!("geolocation" in navigator)) {
setState((s) => ({ ...s, error: "Geolocation not supported" }));
resolve(null);
return;
}
setState((s) => ({ ...s, loading: true, error: null }));
navigator.geolocation.getCurrentPosition(
(pos) => {
const lat = pos.coords.latitude;
const lon = pos.coords.longitude;
setState({ lat, lon, error: null, loading: false });
resolve({ lat, lon });
},
(err) => {
setState((s) => ({ ...s, loading: false, error: err.message }));
resolve(null);
},
{ enableHighAccuracy: true, timeout: 8000 },
);
});
}, []);
return { ...state, request };
}
|