diff --git a/src/admin/pages/Attendance.tsx b/src/admin/pages/Attendance.tsx index 25b1319..55f178c 100644 --- a/src/admin/pages/Attendance.tsx +++ b/src/admin/pages/Attendance.tsx @@ -186,7 +186,18 @@ export default function Attendance() { setSubmitting(true); latestActionRef.current = action; + // Safety timeout: if geolocation hangs silently (some browsers ignore + // the timeout option), reset the button so the user isn't stuck. + const safetyTimeout = setTimeout(() => { + if (mountedRef.current) { + setSubmitting(false); + alert.error("Vypršel časový limit pro získání polohy"); + setGpsConfirm({ isOpen: true, action }); + } + }, 12000); + if (!navigator.geolocation) { + clearTimeout(safetyTimeout); alert.warning("GPS není dostupná"); submitPunch(action, {}); return; @@ -194,6 +205,7 @@ export default function Attendance() { navigator.geolocation.getCurrentPosition( (position) => { + clearTimeout(safetyTimeout); if (!mountedRef.current) return; const { latitude, longitude, accuracy } = position.coords; submitPunch(action, { latitude, longitude, accuracy, address: "" }); @@ -228,6 +240,7 @@ export default function Attendance() { .catch(() => {}); }, (geoError) => { + clearTimeout(safetyTimeout); if (!mountedRef.current) return; let errorMsg = "Nepodařilo se získat polohu"; if (geoError.code === geoError.PERMISSION_DENIED) { @@ -236,6 +249,7 @@ export default function Attendance() { errorMsg = "Vypršel časový limit"; } alert.error(errorMsg); + setSubmitting(false); setGpsConfirm({ isOpen: true, action }); }, { enableHighAccuracy: true, timeout: 10000, maximumAge: 60000 },