import { useState, useEffect } from "react"; type GeolocationOptions = PositionOptions; type GeolocationHookReturn = { loading: boolean; error: GeolocationPositionError | null; data: GeolocationCoordinates; }; export default function useGeolocation( options?: GeolocationOptions ): GeolocationHookReturn { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [data, setData] = useState( {} as GeolocationCoordinates ); useEffect(() => { const successHandler = (e: GeolocationPosition) => { setLoading(false); setError(null); setData(e.coords); }; const errorHandler = (e: GeolocationPositionError) => { setError(e); setLoading(false); }; navigator.geolocation.getCurrentPosition( successHandler, errorHandler, options ); const id = navigator.geolocation.watchPosition( successHandler, errorHandler, options ); return () => navigator.geolocation.clearWatch(id); }, [options]); return { loading, error, data }; }