From 7f07032bf206aca278b844295dedd25c255cefa7 Mon Sep 17 00:00:00 2001 From: BOHA Date: Mon, 27 Apr 2026 08:34:01 +0200 Subject: [PATCH] fix: attendance clock-in silently aborted by broken mountedRef guard mountedRef was initialized to true but never reset on mount. The cleanup function (useEffect return) set it to false on unmount. In React 18 Strict Mode, components mount-unmount-remount during dev. After the first cleanup, mountedRef stayed false forever. Result: handlePunch set submitting=true, geolocation callbacks fired, but every callback returned early at `if (!mountedRef.current) return` before calling submitPunch. No server request, button stuck. Fix: add `mountedRef.current = true` inside the useEffect body. Co-Authored-By: Claude Opus 4.7 --- src/admin/pages/Attendance.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/admin/pages/Attendance.tsx b/src/admin/pages/Attendance.tsx index e0de6a1..6c017ad 100644 --- a/src/admin/pages/Attendance.tsx +++ b/src/admin/pages/Attendance.tsx @@ -131,6 +131,7 @@ export default function Attendance() { const latestActionRef = useRef(null); useEffect(() => { + mountedRef.current = true; return () => { mountedRef.current = false; if (geoAbortRef.current) geoAbortRef.current.abort();