UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

1 lines 6.17 kB
{"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"}