install packages
This commit is contained in:
63
src/utils/locateUser.ts
Normal file
63
src/utils/locateUser.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { useLocationStore } from "@/stores/LocationStore";
|
||||
import { LatLng } from "@/types/types";
|
||||
import toast from "react-hot-toast";
|
||||
|
||||
export function getUserLocation(): Promise<LatLng> {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!navigator.geolocation) {
|
||||
toast.error("مرورگر شما از موقعیتیابی پشتیبانی نمیکند");
|
||||
reject(new Error("Geolocation is not supported by your browser."));
|
||||
return;
|
||||
}
|
||||
|
||||
let didRespond = false;
|
||||
|
||||
const timeout = setTimeout(() => {
|
||||
if (!didRespond) {
|
||||
didRespond = true;
|
||||
toast.error("دریافت موقعیت با مشکل مواجه شد");
|
||||
reject(new Error("The request to get your location timed out."));
|
||||
return;
|
||||
}
|
||||
}, 500); // TODO: refactor to handle more gracefully
|
||||
|
||||
navigator.geolocation.getCurrentPosition(
|
||||
(position) => {
|
||||
if (didRespond) return;
|
||||
didRespond = true;
|
||||
clearTimeout(timeout);
|
||||
const { latitude, longitude } = position.coords;
|
||||
useLocationStore.setState({ userLocation: { lat: latitude, lng: longitude } });
|
||||
resolve({ lat: latitude, lng: longitude });
|
||||
},
|
||||
(error) => {
|
||||
if (didRespond) return;
|
||||
didRespond = true;
|
||||
clearTimeout(timeout);
|
||||
|
||||
switch (error.code) {
|
||||
case error.PERMISSION_DENIED:
|
||||
reject(new Error("Location access is denied. Please enable it in your browser settings."));
|
||||
toast.error("اجازه دسترسی به موقعیت رد شده است");
|
||||
break;
|
||||
case error.POSITION_UNAVAILABLE:
|
||||
reject(new Error("Location information is unavailable."));
|
||||
toast.error("موقعیت در دسترس نیست");
|
||||
break;
|
||||
case error.TIMEOUT:
|
||||
reject(new Error("The request to get your location timed out."));
|
||||
toast.error("مدت زمان برای دریافت موقعیت منقضی شد");
|
||||
break;
|
||||
default:
|
||||
toast.error("خطای ناشناخته");
|
||||
reject(new Error("An unknown error occurred while getting location."));
|
||||
break;
|
||||
}
|
||||
},
|
||||
{
|
||||
enableHighAccuracy: true,
|
||||
maximumAge: 0,
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user