UNPKG

@react-hook/click

Version:

```jsx harmony import useClick from '@react-hook/click'

1 lines 3.83 kB
{"version":3,"file":"index.mjs","sources":["../../src/index.tsx"],"sourcesContent":["import * as React from 'react'\nimport useLatest from '@react-hook/latest'\n\nfunction useClick<T extends HTMLElement = HTMLElement>(\n conditions: string | string[],\n callback: (...args: any[]) => any\n) {\n const storedConditions = useLatest(conditions)\n const storedCallback = useLatest(callback)\n\n return React.useCallback(\n (e: React.MouseEvent<T>) => {\n if (\n isClickOfType<T>(\n e,\n Array.isArray(storedConditions.current)\n ? storedConditions.current\n : [storedConditions.current]\n ) === true\n ) {\n const {left, top} = (e.target as HTMLElement).getBoundingClientRect()\n storedCallback.current(e, {\n x: e.clientX - Math.floor(left),\n y: e.clientY - Math.floor(top),\n count: e.detail,\n })\n }\n },\n [storedCallback, storedConditions]\n )\n}\n\nfunction isClickOfType<T extends HTMLElement>(\n e: React.MouseEvent<T>,\n types: string[]\n) {\n let i = 0\n let j\n\n for (; i < types.length; i++) {\n const type = types[i]\n\n if (type.indexOf('|') > -1) {\n const ors = type.split('|').map((o) => o.trim())\n let orSatisfied = true\n\n for (j = 0; j < ors.length; j++) {\n orSatisfied = isClickOfType(e, [ors[j]])\n if (orSatisfied) break\n }\n\n if (!orSatisfied) return false\n } else {\n const props = type.split('+')\n\n for (j = 0; j < props.length; j++) {\n const prop =\n props[j] in CLICK_TYPES\n ? CLICK_TYPES[props[j] as keyof typeof CLICK_TYPES]\n : props[j]\n const [propName, propValue] = prop.split('=')\n\n if (propValue !== void 0) {\n if (String(e[propName as keyof typeof e]) !== String(propValue)) {\n return false\n }\n } else if (e[propName as keyof typeof e] === false) {\n return false\n }\n }\n }\n }\n\n return true\n}\n\nexport const CLICK_TYPES = {\n single: 'detail=1',\n double: 'detail=2',\n triple: 'detail=3',\n left: 'button=0',\n middle: 'button=1',\n right: 'button=2',\n shift: 'shiftKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n alt: 'altKey',\n} as const\n\nexport default useClick\n"],"names":["o","trim","CLICK_TYPES","single","double","triple","left","middle","right","shift","control","meta","alt","conditions","callback","storedConditions","useLatest","storedCallback","React","e","isClickOfType","types","j","i","length","type","indexOf","ors","split","map","orSatisfied","props","prop","propName","propValue","String","Array","isArray","current","top","target","getBoundingClientRect","x","clientX","Math","floor","y","clientY","count","detail"],"mappings":"AA2CsC,WAACA,UAAMA,EAAEC,iFAiClCC,EAAc,CACzBC,OAAQ,WACRC,OAAQ,WACRC,OAAQ,WACRC,KAAM,WACNC,OAAQ,WACRC,MAAO,WACPC,MAAO,WACPC,QAAS,UACTC,KAAM,UACNC,IAAK,yBAnFP,SACEC,EACAC,OAEMC,EAAmBC,EAAUH,GAC7BI,EAAiBD,EAAUF,UAE1BI,EACJC,OAOS,GAcd,SAASC,EACPD,EACAE,WAGIC,EADAC,EAAI,EAGDA,EAAIF,EAAMG,OAAQD,IAAK,KACtBE,EAAOJ,EAAME,MAEfE,EAAKC,QAAQ,MAAQ,EAAG,KACpBC,EAAMF,EAAKG,MAAM,KAAKC,OACxBC,EAAc,MAEbR,EAAI,EAAGA,EAAIK,EAAIH,UAClBM,EAAcV,EAAcD,EAAG,CAACQ,EAAIL,MADVA,SAKvBQ,EAAa,OAAO,MACpB,KACCC,EAAQN,EAAKG,MAAM,SAEpBN,EAAI,EAAGA,EAAIS,EAAMP,OAAQF,IAAK,KAC3BU,EACJD,EAAMT,KAAMpB,EACRA,EAAY6B,EAAMT,IAClBS,EAAMT,IACLW,EAAUC,GAAaF,EAAKJ,MAAM,aAEvB,IAAdM,MACEC,OAAOhB,EAAEc,MAAiCE,OAAOD,UAC5C,OAEJ,GAAsC,GAAlCf,EAAEc,UACJ,WAMR,EA5DDb,CACED,EACAiB,MAAMC,QAAQtB,EAAiBuB,SAC3BvB,EAAiBuB,QACjB,CAACvB,EAAiBuB,UAExB,KACMhC,KAACA,EAADiC,IAAOA,GAAQpB,EAAEqB,OAAuBC,wBAC9CxB,EAAeqB,QAAQnB,EAAG,CACxBuB,EAAGvB,EAAEwB,QAAUC,KAAKC,MAAMvC,GAC1BwC,EAAG3B,EAAE4B,QAAUH,KAAKC,MAAMN,GAC1BS,MAAO7B,EAAE8B,WAIf,CAAChC,EAAgBF"}