#49 : Validate tap event

This commit is contained in:
Vadim
2021-08-06 23:12:13 +03:00
parent b66ab30a0d
commit 094ed0894e
3 changed files with 38 additions and 4 deletions

View File

@@ -1,12 +1,16 @@
import { createDispatcher } from '../../utils/event'
import { get } from '../../utils/object'
import { getDistance } from '../../utils/math'
import {
addFocusinEventListener,
removeFocusinEventListener,
addFocusoutEventListener,
removeFocusoutEventListener,
} from './event'
import { TAP_DURATION_MS } from '../../units'
import {
TAP_DURATION_MS,
TAP_MOVEMENT_PX,
} from '../../units'
/**
* tappable events are for touchable devices only
@@ -16,15 +20,37 @@ export function tappable(node, options) {
const dispatch = get(options, 'dispatch', createDispatcher(node))
let tapStartedAt = 0
let tapStartPos = { x: 0, y: 0 }
function handleTapstart() {
function getIsValidTap({
tapEndedAt,
tapEndedPos
}) {
const tapTime = tapEndedAt - tapStartedAt
const tapDist = getDistance(tapStartPos, tapEndedPos)
return (
tapTime <= TAP_DURATION_MS &&
tapDist <= TAP_MOVEMENT_PX
)
}
function handleTapstart(event) {
tapStartedAt = Date.now()
const touch = event.touches[0]
tapStartPos = { x: touch.clientX, y: touch.clientY }
addFocusoutEventListener(node, handleTapend)
}
function handleTapend() {
function handleTapend(event) {
removeFocusoutEventListener(node, handleTapend)
if (Date.now() - tapStartedAt <= TAP_DURATION_MS) {
const touch = event.changedTouches[0]
if (getIsValidTap({
tapEndedAt: Date.now(),
tapEndedPos: { x: touch.clientX, y: touch.clientY }
})) {
dispatch('tapped')
}
}