diff --git a/client/src/pages/home.tsx b/client/src/pages/home.tsx index 28aff08..cec8498 100644 --- a/client/src/pages/home.tsx +++ b/client/src/pages/home.tsx @@ -211,6 +211,32 @@ function MobileMosaic({ latest, popular, focalPoints }: { latest: Article[]; pop return () => clearInterval(timer); }, [paused, totalPages]); + const touchX = useRef(null); + const resumeTimer = useRef(null); + + const goTo = useCallback((dir: number) => { + setPage((p) => (p + dir + totalPages) % totalPages); + }, [totalPages]); + + const onTouchStart = useCallback((e: React.TouchEvent) => { + touchX.current = e.touches[0].clientX; + setPaused(true); + if (resumeTimer.current) clearTimeout(resumeTimer.current); + }, []); + + const onTouchEnd = useCallback((e: React.TouchEvent) => { + const x0 = touchX.current; + touchX.current = null; + if (x0 !== null) { + const dx = e.changedTouches[0].clientX - x0; + if (Math.abs(dx) > 40) goTo(dx < 0 ? 1 : -1); + } + if (resumeTimer.current) clearTimeout(resumeTimer.current); + resumeTimer.current = setTimeout(() => setPaused(false), 6000); + }, [goTo]); + + useEffect(() => () => { if (resumeTimer.current) clearTimeout(resumeTimer.current); }, []); + const l = pool.slice(displayPage * pageSize, displayPage * pageSize + pageSize); if (l.length === 0) return null; @@ -222,7 +248,11 @@ function MobileMosaic({ latest, popular, focalPoints }: { latest: Article[]; pop return (
-
setPaused(true)}> +
Neueste Artikel {preload.length > 0 && (