fix office location detection radius and GPS accuracy

This commit is contained in:
2026-09-23 13:07:21 +03:30
parent 9e6407d648
commit 694f41968a
2 changed files with 141 additions and 51 deletions
+16 -9
View File
@@ -251,6 +251,8 @@ SVG;
const referenceLat = 32.6504751;
const referenceLng = 51.6936045;
const OFFICE_RADIUS_METERS = 100;
const MAX_ACCURACY_CREDIT_METERS = 80;
const submitBtn = document.getElementById("submitBtn");
const latInput = document.getElementById("latitude");
@@ -278,26 +280,31 @@ SVG;
return earthRadius * c;
}
function isInsideOffice(distanceMeters, accuracyMeters) {
const accuracyCredit = Math.min(Math.max(0, accuracyMeters || 0), MAX_ACCURACY_CREDIT_METERS);
return Math.max(0, distanceMeters - accuracyCredit) <= OFFICE_RADIUS_METERS;
}
navigator.geolocation.getCurrentPosition(
position => {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
const accuracy = position.coords.accuracy || 0;
latInput.value = lat;
lngInput.value = lng;
const dist = Math.round(getDistanceInMeters(referenceLat, referenceLng, lat, lng));
distanceInput.value = dist;
if (dist < 20) {
distanceMessage.textContent = `مکان: شرکت`;
} else {
distanceMessage.textContent = `مکان: خارج از شرکت`;
}
const inside = isInsideOffice(dist, accuracy);
distanceMessage.textContent = inside
? `مکان: شرکت (~${dist}م)`
: `مکان: خارج از شرکت (~${dist}م)`;
distanceMessage.classList.remove("bg-gray-400", "bg-blue-500", "bg-green-500", "bg-orange-500", "cursor-not-allowed");
if (dist < 10) {
distanceMessage.classList.remove("bg-gray-400", "bg-blue-500", "bg-green-500", "bg-orange-500", "cursor-not-allowed", "text-green-500", "text-blue-500", "text-orange-500", "text-gray-400");
if (inside) {
distanceMessage.classList.add("text-green-500");
} else if (dist < 50) {
} else if (dist < OFFICE_RADIUS_METERS * 2) {
distanceMessage.classList.add("text-blue-500");
} else if (dist > 2000) {
distanceMessage.classList.add("text-orange-500");
@@ -311,7 +318,7 @@ SVG;
},
error => alert("⛔ خطا در دریافت موقعیت مکانی: " + error.message), {
enableHighAccuracy: true,
timeout: 10000,
timeout: 20000,
maximumAge: 0
}
);