fix: responsive: long press while scroll (#17555)

This commit is contained in:
Min Idzelis 2025-04-11 18:28:36 -04:00 committed by GitHub
parent e440cbe353
commit 8309b73a02
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -24,6 +24,7 @@
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
import ImageThumbnail from './image-thumbnail.svelte'; import ImageThumbnail from './image-thumbnail.svelte';
import VideoThumbnail from './video-thumbnail.svelte'; import VideoThumbnail from './video-thumbnail.svelte';
import { onMount } from 'svelte';
interface Props { interface Props {
asset: AssetResponseDto; asset: AssetResponseDto;
@ -127,24 +128,59 @@
mouseOver = false; mouseOver = false;
}; };
let timer: ReturnType<typeof setTimeout>;
const clearLongPressTimer = () => clearTimeout(timer);
let startX: number = 0;
let startY: number = 0;
function longPress(element: HTMLElement, { onLongPress }: { onLongPress: () => void }) { function longPress(element: HTMLElement, { onLongPress }: { onLongPress: () => void }) {
let timer: ReturnType<typeof setTimeout>; let didPress = false;
const start = (event: TouchEvent) => { const start = (evt: TouchEvent) => {
startX = evt.changedTouches[0].clientX;
startY = evt.changedTouches[0].clientY;
didPress = false;
timer = setTimeout(() => { timer = setTimeout(() => {
onLongPress(); onLongPress();
event.preventDefault(); didPress = true;
}, 350); }, 350);
}; };
const end = () => clearTimeout(timer); const click = (e: MouseEvent) => {
element.addEventListener('touchstart', start); if (!didPress) {
element.addEventListener('touchend', end); return;
}
e.stopPropagation();
e.preventDefault();
};
element.addEventListener('click', click);
element.addEventListener('touchstart', start, true);
element.addEventListener('touchend', clearLongPressTimer, true);
return { return {
destroy: () => { destroy: () => {
element.removeEventListener('touchstart', start); element.removeEventListener('click', click);
element.removeEventListener('touchend', end); element.removeEventListener('touchstart', start, true);
element.removeEventListener('touchend', clearLongPressTimer, true);
}, },
}; };
} }
function moveHandler(e: PointerEvent) {
var diffX = Math.abs(startX - e.clientX);
var diffY = Math.abs(startY - e.clientY);
if (diffX >= 10 || diffY >= 10) {
clearLongPressTimer();
}
}
onMount(() => {
document.addEventListener('scroll', clearLongPressTimer, true);
document.addEventListener('wheel', clearLongPressTimer, true);
document.addEventListener('contextmenu', clearLongPressTimer, true);
document.addEventListener('pointermove', moveHandler, true);
return () => {
document.removeEventListener('scroll', clearLongPressTimer, true);
document.removeEventListener('wheel', clearLongPressTimer, true);
document.removeEventListener('contextmenu', clearLongPressTimer, true);
document.removeEventListener('pointermove', moveHandler, true);
};
});
</script> </script>
<div <div