MCPcopy
hub / github.com/imbhargav5/rooks / useOnLongPress

Function useOnLongPress

packages/rooks/src/hooks/useOnLongPress.ts:18–68  ·  view source on GitHub ↗
(
  callback: () => void,
  { onClick, duration = 300 }: LongPressOptions = {}
)

Source from the content-addressed store, hash-verified

16const defaultOnClick = () => {};
17
18const useOnLongPress = (
19 callback: () => void,
20 { onClick, duration = 300 }: LongPressOptions = {}
21) => {
22 const [targetNode, setTargetNode] = useState<HTMLElementOrNull>(null);
23
24 const ref = useCallback((node: HTMLElement | null) => {
25 setTargetNode(node);
26 }, []);
27 const [isPressing, setIsPressing] = useState(false);
28 const freshCallback = useFreshCallback(callback);
29 const freshClick = useFreshCallback(onClick ?? defaultOnClick);
30 useTimeoutWhen(freshCallback, duration, isPressing);
31
32 const start = useCallback((_: MouseEvent | TouchEvent) => {
33 setIsPressing(true);
34 }, []);
35
36 const handleOnClick = useCallback(
37 (event: MouseEvent | TouchEvent) => {
38 setIsPressing(false);
39 freshClick(event);
40 },
41 [freshClick]
42 );
43
44 useEffect(() => {
45 if (targetNode) {
46 targetNode.addEventListener("mousedown", start);
47 targetNode.addEventListener("mouseup", handleOnClick);
48 targetNode.addEventListener("mouseleave", handleOnClick);
49 targetNode.addEventListener("touchstart", start);
50 targetNode.addEventListener("touchend", handleOnClick);
51 targetNode.addEventListener("touchcancel", handleOnClick);
52 }
53
54 return () => {
55 if (targetNode) {
56 targetNode.removeEventListener("mousedown", start);
57 targetNode.removeEventListener("mouseup", handleOnClick);
58 targetNode.removeEventListener("mouseleave", handleOnClick);
59 targetNode.removeEventListener("touchstart", start);
60 targetNode.removeEventListener("touchend", handleOnClick);
61 targetNode.removeEventListener("touchcancel", handleOnClick);
62 }
63 };
64 }, [start, handleOnClick, targetNode]);
65
66 // clone ref
67 return ref;
68};
69
70export { useOnLongPress };

Callers 2

TestComponentFunction · 0.90
ssr.spec.tsFile · 0.85

Calls 4

useFreshCallbackFunction · 0.90
useTimeoutWhenFunction · 0.90
addEventListenerMethod · 0.65
removeEventListenerMethod · 0.65

Tested by 1

TestComponentFunction · 0.72

Used in the wild real call sites across dependent graphs

searching dependent graphs…