{"version":3,"file":"index.mjs","sources":["../../../../../packages/directives/repeat-click/index.ts"],"sourcesContent":["import type { Directive } from 'vue'\nconst SCOPE = '_RepeatClick'\nexport interface RepeatClickEl extends HTMLElement {\n  [SCOPE]: null | {\n    start?: (evt: MouseEvent) => void\n  }\n}\nexport interface RepeatClickOptions {\n  immediate?: boolean\n  delay?: number\n  handler: (...args: unknown[]) => unknown\n}\nconst vRepeatClick: Directive<RepeatClickEl, RepeatClickOptions> & {\n  name: string\n} = {\n  name: 'repeatClick',\n  // 在绑定元素的 attribute 前\n  // 或事件监听器应用前调用\n  // created(el, binding, vnode) {\n  //   // el.style.display = 'none'\n  //   // 下面会介绍各个参数的细节\n  //   console.log('created', el, binding, vnode)\n  // },\n\n  // 在元素被插入到 DOM 前调用\n  beforeMount(el, binding) {\n    const { delay = 300, immediate } =\n      typeof binding.value === 'object' ? binding.value : {}\n    const handler =\n      typeof binding.value === 'object' ? binding.value.handler : binding.value\n    let isPending = false\n    let timer: ReturnType<typeof setTimeout>\n    const start = (e: MouseEvent) => {\n      if (e.button !== 0) return // 只处理左键点击\n      timer && clearTimeout(timer)\n      timer = setTimeout(() => {\n        if (immediate) {\n          isPending = false\n        } else {\n          handler?.(e)\n        }\n      }, delay)\n      if (immediate) {\n        if (isPending) {\n          return\n        }\n        isPending = true\n        handler?.(e)\n      }\n    }\n    el[SCOPE] = { start }\n    el.addEventListener('click', start)\n  },\n  //   // 在绑定元素的父组件\n  //   // 及他自己的所有子节点都挂载完成后调用\n  //   mounted(el, binding, vnode) {\n  //     console.log('mounted', el, binding, vnode)\n  //   },\n  //   // 绑定元素的父组件更新前调用\n  //   beforeUpdate(el, binding, vnode, prevVnode) {\n  //     console.log('beforeUpdate', el, binding, vnode, prevVnode)\n  //   },\n  //   // 在绑定元素的父组件\n  //   // 及他自己的所有子节点都更新后调用\n  //   updated(el, binding, vnode, prevVnode) {\n  //     console.log('updated', el, binding, vnode, prevVnode)\n  //   },\n  //   // 绑定元素的父组件卸载前调用\n  //   beforeUnmount(el, binding, vnode) {\n  //     console.log('beforeUnmount', el, binding, vnode)\n  //   },\n  // 绑定元素的父组件卸载后调用\n  unmounted(el) {\n    if (!el[SCOPE]) return\n    const { start } = el[SCOPE]\n\n    if (start) {\n      el.removeEventListener('mousedown', start)\n    }\n    el[SCOPE] = null\n  },\n}\nexport default vRepeatClick\n"],"names":[],"mappings":"AACA,MAAM,KAAA,GAAQ,cAAA;AAWd,MAAM,YAAA,GAEF;AAAA,EACF,IAAA,EAAM,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUN,WAAA,CAAY,IAAI,OAAA,EAAS;AACvB,IAAA,MAAM,EAAE,KAAA,GAAQ,GAAA,EAAK,SAAA,EAAU,GAC7B,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,GAAW,OAAA,CAAQ,KAAA,GAAQ,EAAC;AACvD,IAAA,MAAM,OAAA,GACJ,OAAO,OAAA,CAAQ,KAAA,KAAU,WAAW,OAAA,CAAQ,KAAA,CAAM,UAAU,OAAA,CAAQ,KAAA;AACtE,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,MAAA,KAAA,IAAS,aAAa,KAAK,CAAA;AAC3B,MAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,GAAY,KAAA;AAAA,QACd,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,CAAC,CAAA;AAAA,QACb;AAAA,MACF,GAAG,KAAK,CAAA;AACR,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAI,SAAA,EAAW;AACb,UAAA;AAAA,QACF;AACA,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AACA,IAAA,EAAA,CAAG,KAAK,CAAA,GAAI,EAAE,KAAA,EAAM;AACpB,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,KAAK,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,UAAU,EAAA,EAAI;AACZ,IAAA,IAAI,CAAC,EAAA,CAAG,KAAK,CAAA,EAAG;AAChB,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,EAAA,CAAG,KAAK,CAAA;AAE1B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,EAAA,CAAG,mBAAA,CAAoB,aAAa,KAAK,CAAA;AAAA,IAC3C;AACA,IAAA,EAAA,CAAG,KAAK,CAAA,GAAI,IAAA;AAAA,EACd;AACF;;;;"}