forked from mirror/crumbs-original
fix: use timestamp guard instead of rAF for mobile backdrop click
On first page load on mobile, the synthetic mousedown from a tap can arrive ~300ms after the touch event — well after a single requestAnimationFrame (~16ms). Replace the rAF-based overlayReady guard with a 400ms timestamp check from mount time to reliably ignore stale synthetic events on slow first loads. https://claude.ai/code/session_018DYwSysqysMmaRi5XkqTpo
This commit is contained in:
@@ -179,21 +179,13 @@
|
||||
// On mobile, the tap that opens the editor produces synthetic mouse events
|
||||
// (mousedown → mouseup → click) at the original touch coordinates. If those
|
||||
// coordinates land on the overlay backdrop, the editor would close instantly.
|
||||
// Guard against this by ignoring mousedowns that arrive within the first
|
||||
// animation frame after mount.
|
||||
let overlayReady = false;
|
||||
$effect(() => {
|
||||
const id = requestAnimationFrame(() => {
|
||||
overlayReady = true;
|
||||
});
|
||||
return () => {
|
||||
overlayReady = false;
|
||||
cancelAnimationFrame(id);
|
||||
};
|
||||
});
|
||||
// On first page load, synthetic mousedown can arrive ~300ms after the tap
|
||||
// (well after a single rAF). Use a timestamp guard to ignore early events.
|
||||
const mountTime = Date.now();
|
||||
const OVERLAY_READY_DELAY = 400;
|
||||
|
||||
function handleOverlayMousedown(e: MouseEvent) {
|
||||
if (!overlayReady) return;
|
||||
if (Date.now() - mountTime < OVERLAY_READY_DELAY) return;
|
||||
mousedownOnOverlay = e.target === e.currentTarget;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user