{"version":3,"file":"use-context-menu-handlers.cjs","names":["createEventHandler"],"sources":["../../../src/utils/Floating/use-context-menu-handlers.ts"],"sourcesContent":["import React, { useRef } from 'react';\nimport { useLongPress } from '@mantine/hooks';\nimport { createEventHandler } from '../../core/utils/create-event-handler/create-event-handler';\n\ninterface UseContextMenuHandlersOptions {\n  /** Props of the child element that opens the dropdown */\n  childProps: Record<string, any>;\n\n  /** If set, right-click trigger is disabled and the browser's default context menu is shown */\n  disabled: boolean | undefined;\n\n  /** Current opened state, used to set `data-expanded` on the child */\n  opened: boolean;\n\n  /** Delay in ms before a touch long-press opens the dropdown, `500` by default */\n  longPressDelay?: number;\n\n  /** Sets the floating reference to a virtual element positioned at the cursor */\n  setReference: (node: object) => void;\n\n  /** Called to open the dropdown after the reference has been set */\n  open: () => void;\n}\n\nexport function useContextMenuHandlers({\n  childProps,\n  disabled,\n  opened,\n  longPressDelay = 500,\n  setReference,\n  open,\n}: UseContextMenuHandlersOptions) {\n  const touchActiveRef = useRef(false);\n  const gestureHandledRef = useRef(false);\n  const touchTargetRef = useRef<object | null>(null);\n  const disabledRef = useRef(disabled);\n  disabledRef.current = disabled;\n\n  const openAtPoint = (clientX: number, clientY: number, contextElement: object | null) => {\n    setReference({\n      getBoundingClientRect: () => ({\n        x: clientX,\n        y: clientY,\n        width: 0,\n        height: 0,\n        top: clientY,\n        left: clientX,\n        right: clientX,\n        bottom: clientY,\n        toJSON: () => undefined,\n      }),\n      contextElement,\n    });\n\n    open();\n  };\n\n  const onMouseDown = createEventHandler<any>(\n    childProps.onMouseDown,\n    (event: React.MouseEvent<HTMLElement>) => {\n      if (disabled) {\n        return;\n      }\n      if (event.button === 2) {\n        event.stopPropagation();\n      }\n    }\n  );\n\n  const onContextMenu = createEventHandler<any>(\n    childProps.onContextMenu,\n    (event: React.MouseEvent<HTMLElement>) => {\n      if (disabled || event.defaultPrevented) {\n        return;\n      }\n\n      event.preventDefault();\n\n      if (gestureHandledRef.current) {\n        return;\n      }\n\n      openAtPoint(event.clientX, event.clientY, event.currentTarget);\n\n      if (touchActiveRef.current) {\n        gestureHandledRef.current = true;\n      }\n    }\n  );\n\n  const longPressHandlers = useLongPress(\n    (event) => {\n      if (disabledRef.current || gestureHandledRef.current) {\n        return;\n      }\n\n      const touchEvent = event as React.TouchEvent<HTMLElement>;\n      const touch = touchEvent.touches[0] ?? touchEvent.changedTouches[0];\n      if (!touch) {\n        return;\n      }\n\n      openAtPoint(touch.clientX, touch.clientY, touchTargetRef.current);\n      gestureHandledRef.current = true;\n    },\n    {\n      threshold: longPressDelay,\n      events: ['touch'],\n      cancelOnMove: true,\n      onStart: (event) => {\n        touchActiveRef.current = true;\n        gestureHandledRef.current = false;\n        touchTargetRef.current = event.currentTarget;\n      },\n      onFinish: (event) => {\n        touchActiveRef.current = false;\n        gestureHandledRef.current = false;\n        if (!disabledRef.current) {\n          event.preventDefault();\n        }\n      },\n      onCancel: () => {\n        touchActiveRef.current = false;\n        gestureHandledRef.current = false;\n      },\n    }\n  );\n\n  const onTouchStart = createEventHandler<any>(\n    childProps.onTouchStart,\n    longPressHandlers.onTouchStart\n  );\n  const onTouchEnd = createEventHandler<any>(childProps.onTouchEnd, longPressHandlers.onTouchEnd);\n  const onTouchCancel = createEventHandler<any>(\n    childProps.onTouchCancel,\n    longPressHandlers.onTouchCancel\n  );\n  const onTouchMove = createEventHandler<any>(\n    childProps.onTouchMove,\n    longPressHandlers.onTouchMove\n  );\n\n  return {\n    onContextMenu,\n    onMouseDown,\n    onTouchStart,\n    onTouchEnd,\n    onTouchCancel,\n    onTouchMove,\n    style: disabled\n      ? childProps.style\n      : {\n          ...childProps.style,\n          WebkitTouchCallout: 'none',\n          WebkitUserSelect: 'none',\n          userSelect: 'none',\n        },\n    'data-expanded': opened ? true : undefined,\n  };\n}\n"],"mappings":";;;;;AAwBA,SAAgB,uBAAuB,EACrC,YACA,UACA,QACA,iBAAiB,KACjB,cACA,QACgC;CAChC,MAAM,kBAAA,GAAA,MAAA,OAAA,CAAwB,KAAK;CACnC,MAAM,qBAAA,GAAA,MAAA,OAAA,CAA2B,KAAK;CACtC,MAAM,kBAAA,GAAA,MAAA,OAAA,CAAuC,IAAI;CACjD,MAAM,eAAA,GAAA,MAAA,OAAA,CAAqB,QAAQ;CACnC,YAAY,UAAU;CAEtB,MAAM,eAAe,SAAiB,SAAiB,mBAAkC;EACvF,aAAa;GACX,8BAA8B;IAC5B,GAAG;IACH,GAAG;IACH,OAAO;IACP,QAAQ;IACR,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,cAAc,KAAA;GAChB;GACA;EACF,CAAC;EAED,KAAK;CACP;CAEA,MAAM,cAAcA,6BAAAA,mBAClB,WAAW,cACV,UAAyC;EACxC,IAAI,UACF;EAEF,IAAI,MAAM,WAAW,GACnB,MAAM,gBAAgB;CAE1B,CACF;CAEA,MAAM,gBAAgBA,6BAAAA,mBACpB,WAAW,gBACV,UAAyC;EACxC,IAAI,YAAY,MAAM,kBACpB;EAGF,MAAM,eAAe;EAErB,IAAI,kBAAkB,SACpB;EAGF,YAAY,MAAM,SAAS,MAAM,SAAS,MAAM,aAAa;EAE7D,IAAI,eAAe,SACjB,kBAAkB,UAAU;CAEhC,CACF;CAEA,MAAM,qBAAA,GAAA,eAAA,aAAA,EACH,UAAU;EACT,IAAI,YAAY,WAAW,kBAAkB,SAC3C;EAGF,MAAM,aAAa;EACnB,MAAM,QAAQ,WAAW,QAAQ,MAAM,WAAW,eAAe;EACjE,IAAI,CAAC,OACH;EAGF,YAAY,MAAM,SAAS,MAAM,SAAS,eAAe,OAAO;EAChE,kBAAkB,UAAU;CAC9B,GACA;EACE,WAAW;EACX,QAAQ,CAAC,OAAO;EAChB,cAAc;EACd,UAAU,UAAU;GAClB,eAAe,UAAU;GACzB,kBAAkB,UAAU;GAC5B,eAAe,UAAU,MAAM;EACjC;EACA,WAAW,UAAU;GACnB,eAAe,UAAU;GACzB,kBAAkB,UAAU;GAC5B,IAAI,CAAC,YAAY,SACf,MAAM,eAAe;EAEzB;EACA,gBAAgB;GACd,eAAe,UAAU;GACzB,kBAAkB,UAAU;EAC9B;CACF,CACF;CAgBA,OAAO;EACL;EACA;EACA,cAjBmBA,6BAAAA,mBACnB,WAAW,cACX,kBAAkB,YAeP;EACX,YAdiBA,6BAAAA,mBAAwB,WAAW,YAAY,kBAAkB,UAczE;EACT,eAdoBA,6BAAAA,mBACpB,WAAW,eACX,kBAAkB,aAYN;EACZ,aAXkBA,6BAAAA,mBAClB,WAAW,aACX,kBAAkB,WASR;EACV,OAAO,WACH,WAAW,QACX;GACE,GAAG,WAAW;GACd,oBAAoB;GACpB,kBAAkB;GAClB,YAAY;EACd;EACJ,iBAAiB,SAAS,OAAO,KAAA;CACnC;AACF"}