UNPKG

@baleada/listenable-gestures

Version:

A collection of gesture recognizers that are compatible with Baleada Logic's Listenable class.

94 lines (82 loc) 2.56 kB
import { emit, toEmitted, storeStartMetadata, storeMoveMetadata, isDefined } from '../util'; /* * dragdrop is defined as a single click that: * - starts at a given point * - travels a distance greater than 0px (or a minimum distance of your choice) * - travels at a velocity of greater than 0px/ms (or a minimum velocity of your choice) * - does not mouseleave * - ends */ var defaultOptions = { minDistance: 0, minVelocity: 0 }; export default function dragdrop() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var onDown = options.onDown, onMove = options.onMove, onLeave = options.onLeave, onUp = options.onUp, minDistance = isDefined(options.minDistance) ? options.minDistance : defaultOptions.minDistance, minVelocity = isDefined(options.minVelocity) ? options.minVelocity : defaultOptions.minVelocity; function mousedown(handlerApi) { var event = handlerApi.event, setMetadata = handlerApi.setMetadata; setMetadata({ path: 'mouseStatus', value: 'down' }); storeStartMetadata(event, handlerApi, 'mouse'); emit(onDown, toEmitted(handlerApi)); } function mousemove(handlerApi) { var event = handlerApi.event, getMetadata = handlerApi.getMetadata, denied = handlerApi.denied; if (getMetadata().mouseStatus === 'down') { storeMoveMetadata(event, handlerApi, 'mouse'); } else { denied(); } emit(onMove, toEmitted(handlerApi)); } function mouseleave(handlerApi) { var getMetadata = handlerApi.getMetadata, denied = handlerApi.denied; if (getMetadata().mouseStatus === 'down') { denied(); setMetadata({ path: 'mouseStatus', value: 'leave' }); } emit(onLeave, toEmitted(handlerApi)); } function mouseup(handlerApi) { var event = handlerApi.event, setMetadata = handlerApi.setMetadata; setMetadata({ path: 'mouseStatus', value: 'up' }); storeMoveMetadata(event, handlerApi, 'mouse'); recognize(handlerApi); emit(onUp, toEmitted(handlerApi)); } function recognize(_ref) { var getMetadata = _ref.getMetadata, recognized = _ref.recognized, denied = _ref.denied; if (getMetadata().distance.fromStart >= minDistance && getMetadata().velocity >= minVelocity) { recognized(); } else { denied(); } } return { mousedown: mousedown, mousemove: mousemove, mouseleave: mouseleave, mouseup: mouseup }; }