migu/common/modules/click.js
2023-11-12 14:43:06 +01:00

38 lines
1 KiB
JavaScript

let lastTapElement = null
const noop = _ => {}
document.addEventListener('pointerup', () => {
lastTapElement?.dispatchEvent(new Event('custom-pointerleave'))
lastTapElement = null
})
export function click (node, cb = noop) {
node.tabIndex = 0
node.role = 'button'
node.addEventListener('pointerup', e => {
e.stopPropagation()
cb(e)
})
node.addEventListener('keydown', e => { if (e.key === 'Enter') cb(e) })
}
export function hoverClick (node, cb = noop) {
node.tabIndex = 0
node.role = 'button'
node.addEventListener('pointerup', e => {
if (e.pointerType === 'mouse') return cb(e)
e.stopPropagation()
lastTapElement?.dispatchEvent(new Event('custom-pointerleave'))
if (lastTapElement === node) {
lastTapElement = null
cb(e)
} else {
lastTapElement = node
}
})
node.addEventListener('keydown', e => { if (e.key === 'Enter') cb(e) })
node.addEventListener('pointerleave', ({ pointerType }) => {
if (pointerType === 'mouse') node.dispatchEvent(new Event('custom-pointerleave'))
})
}