MCPcopy Index your code
hub / github.com/wavetermdev/waveterm / useLongClick

Function useLongClick

frontend/app/hook/useLongClick.tsx:6–59  ·  view source on GitHub ↗
(ref, onClick, onLongClick, disabled = false, ms = 300)

Source from the content-addressed store, hash-verified

4import { useCallback, useEffect, useRef, useState } from "react";
5
6export const useLongClick = (ref, onClick, onLongClick, disabled = false, ms = 300) => {
7 const timerRef = useRef(null);
8 const [longClickTriggered, setLongClickTriggered] = useState(false);
9
10 const startPress = useCallback(
11 (e: React.MouseEvent<any>) => {
12 if (onLongClick == null) {
13 return;
14 }
15 setLongClickTriggered(false);
16 timerRef.current = setTimeout(() => {
17 setLongClickTriggered(true);
18 onLongClick?.(e);
19 }, ms);
20 },
21 [onLongClick, ms]
22 );
23
24 const stopPress = useCallback(() => {
25 clearTimeout(timerRef.current);
26 }, []);
27
28 const handleClick = useCallback(
29 (e: React.MouseEvent<any>) => {
30 if (longClickTriggered) {
31 e.preventDefault();
32 e.stopPropagation();
33 return;
34 }
35 onClick?.(e);
36 },
37 [longClickTriggered, onClick]
38 );
39
40 useEffect(() => {
41 const element = ref.current;
42
43 if (!element || disabled) return;
44
45 element.addEventListener("mousedown", startPress);
46 element.addEventListener("mouseup", stopPress);
47 element.addEventListener("mouseleave", stopPress);
48 element.addEventListener("click", handleClick);
49
50 return () => {
51 element.removeEventListener("mousedown", startPress);
52 element.removeEventListener("mouseup", stopPress);
53 element.removeEventListener("mouseleave", stopPress);
54 element.removeEventListener("click", handleClick);
55 };
56 }, [ref.current, startPress, stopPress, handleClick]);
57
58 return ref;
59};

Callers 1

iconbutton.tsxFile · 0.90

Calls 1

onClickFunction · 0.50

Tested by

no test coverage detected