{"version":3,"file":"use-long-press.mjs","names":[],"sources":["../../src/use-long-press/use-long-press.ts"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\n\nexport interface UseLongPressOptions {\n  /** Time in milliseconds to trigger the long press, default is 400ms */\n  threshold?: number;\n\n  /** Callback triggered when the long press starts */\n  onStart?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n  /** Callback triggered when the long press finishes */\n  onFinish?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n  /** Callback triggered when the long press is canceled */\n  onCancel?: (event: React.MouseEvent | React.TouchEvent) => void;\n}\n\nexport interface UseLongPressReturnValue {\n  onMouseDown: (event: React.MouseEvent) => void;\n  onMouseUp: (event: React.MouseEvent) => void;\n  onMouseLeave: (event: React.MouseEvent) => void;\n  onTouchStart: (event: React.TouchEvent) => void;\n  onTouchEnd: (event: React.TouchEvent) => void;\n  onTouchCancel: (event: React.TouchEvent) => void;\n}\n\nexport function useLongPress(\n  onLongPress: (event: React.MouseEvent | React.TouchEvent) => void,\n  options: UseLongPressOptions = {}\n): UseLongPressReturnValue {\n  const { threshold = 400, onStart, onFinish, onCancel } = options;\n  const isLongPressActive = useRef(false);\n  const isPressed = useRef(false);\n  const timeout = useRef<number>(-1);\n\n  useEffect(() => () => window.clearTimeout(timeout.current), []);\n\n  return useMemo(() => {\n    if (typeof onLongPress !== 'function') {\n      return {} as UseLongPressReturnValue;\n    }\n\n    const start = (event: React.MouseEvent | React.TouchEvent) => {\n      if (!isMouseEvent(event) && !isTouchEvent(event)) {\n        return;\n      }\n\n      if (onStart) {\n        onStart(event);\n      }\n\n      isPressed.current = true;\n      timeout.current = window.setTimeout(() => {\n        onLongPress(event);\n        isLongPressActive.current = true;\n      }, threshold);\n    };\n\n    const cancel = (event: React.MouseEvent | React.TouchEvent) => {\n      if (!isMouseEvent(event) && !isTouchEvent(event)) {\n        return;\n      }\n\n      if (isLongPressActive.current) {\n        if (onFinish) {\n          onFinish(event);\n        }\n      } else if (isPressed.current) {\n        if (onCancel) {\n          onCancel(event);\n        }\n      }\n\n      isLongPressActive.current = false;\n      isPressed.current = false;\n\n      if (timeout.current !== -1) {\n        window.clearTimeout(timeout.current);\n        timeout.current = -1;\n      }\n    };\n\n    return {\n      onMouseDown: start,\n      onMouseUp: cancel,\n      onMouseLeave: cancel,\n      onTouchStart: start,\n      onTouchEnd: cancel,\n      onTouchCancel: cancel,\n    };\n  }, [onLongPress, threshold, onCancel, onFinish, onStart]);\n}\n\nfunction isTouchEvent(event: React.MouseEvent | React.TouchEvent): event is React.TouchEvent {\n  return window.TouchEvent\n    ? event.nativeEvent instanceof TouchEvent\n    : 'touches' in event.nativeEvent;\n}\n\nfunction isMouseEvent(event: React.MouseEvent | React.TouchEvent): event is React.MouseEvent {\n  return event.nativeEvent instanceof MouseEvent;\n}\n\nexport namespace useLongPress {\n  export type Options = UseLongPressOptions;\n  export type ReturnValue = UseLongPressReturnValue;\n}\n"],"mappings":";;;AAyBA,SAAgB,aACd,aACA,UAA+B,CAAC,GACP;CACzB,MAAM,EAAE,YAAY,KAAK,SAAS,UAAU,aAAa;CACzD,MAAM,oBAAoB,OAAO,KAAK;CACtC,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,UAAU,OAAe,EAAE;CAEjC,sBAAsB,OAAO,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC;CAE9D,OAAO,cAAc;EACnB,IAAI,OAAO,gBAAgB,YACzB,OAAO,CAAC;EAGV,MAAM,SAAS,UAA+C;GAC5D,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,KAAK,GAC7C;GAGF,IAAI,SACF,QAAQ,KAAK;GAGf,UAAU,UAAU;GACpB,QAAQ,UAAU,OAAO,iBAAiB;IACxC,YAAY,KAAK;IACjB,kBAAkB,UAAU;GAC9B,GAAG,SAAS;EACd;EAEA,MAAM,UAAU,UAA+C;GAC7D,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,KAAK,GAC7C;GAGF,IAAI,kBAAkB;QAChB,UACF,SAAS,KAAK;GAAA,OAEX,IAAI,UAAU;QACf,UACF,SAAS,KAAK;GAAA;GAIlB,kBAAkB,UAAU;GAC5B,UAAU,UAAU;GAEpB,IAAI,QAAQ,YAAY,IAAI;IAC1B,OAAO,aAAa,QAAQ,OAAO;IACnC,QAAQ,UAAU;GACpB;EACF;EAEA,OAAO;GACL,aAAa;GACb,WAAW;GACX,cAAc;GACd,cAAc;GACd,YAAY;GACZ,eAAe;EACjB;CACF,GAAG;EAAC;EAAa;EAAW;EAAU;EAAU;CAAO,CAAC;AAC1D;AAEA,SAAS,aAAa,OAAuE;CAC3F,OAAO,OAAO,aACV,MAAM,uBAAuB,aAC7B,aAAa,MAAM;AACzB;AAEA,SAAS,aAAa,OAAuE;CAC3F,OAAO,MAAM,uBAAuB;AACtC"}