mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-25 08:46:22 +02:00
47 lines
1,016 B
TypeScript
47 lines
1,016 B
TypeScript
import { useCallback, useEffect, useRef } from "react";
|
|
|
|
const LONG_PRESS_DELAY = 500;
|
|
|
|
export function useLongPress(onLongPress: () => void, delay = LONG_PRESS_DELAY) {
|
|
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
const triggeredRef = useRef(false);
|
|
|
|
const start = useCallback(() => {
|
|
triggeredRef.current = false;
|
|
timerRef.current = setTimeout(() => {
|
|
triggeredRef.current = true;
|
|
onLongPress();
|
|
}, delay);
|
|
}, [onLongPress, delay]);
|
|
|
|
const cancel = useCallback(() => {
|
|
if (timerRef.current) {
|
|
clearTimeout(timerRef.current);
|
|
timerRef.current = null;
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
return () => {
|
|
if (timerRef.current) {
|
|
clearTimeout(timerRef.current);
|
|
}
|
|
};
|
|
}, []);
|
|
|
|
const handlers = {
|
|
onTouchStart: start,
|
|
onTouchEnd: cancel,
|
|
onTouchMove: cancel,
|
|
};
|
|
|
|
const wasLongPress = useCallback(() => {
|
|
if (triggeredRef.current) {
|
|
triggeredRef.current = false;
|
|
return true;
|
|
}
|
|
return false;
|
|
}, []);
|
|
|
|
return { handlers, wasLongPress };
|
|
}
|