import { useLocationStore } from "@/stores/LocationStore"; import { LatLng } from "@/types/types"; import toast from "react-hot-toast"; export function getUserLocation(): Promise { 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, } ); }); }