@baleada/listenable-gestures
Version:
A collection of gesture recognizers that are compatible with Baleada Logic's Listenable class.
88 lines (76 loc) • 2.25 kB
JavaScript
import { emit, toEmitted, storeStartMetadata, storeMoveMetadata, isDefined } from '../util';
/*
* drag is defined as a single click that:
* - starts at given point
* - travels a distance greater than 0px (or a minimum distance of your choice)
* - does not mouseleave or end
*/
var defaultOptions = {
minDistance: 0
};
export default function drag() {
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;
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');
recognize(handlerApi);
} else {
denied();
}
emit(onMove, toEmitted(handlerApi));
}
function recognize(_ref) {
var getMetadata = _ref.getMetadata,
recognized = _ref.recognized;
if (getMetadata().distance.fromStart >= minDistance) {
recognized();
}
}
function mouseleave(handlerApi) {
var getMetadata = handlerApi.getMetadata,
denied = handlerApi.denied,
setMetadata = handlerApi.setMetadata;
if (getMetadata().mouseStatus === 'down') {
denied();
setMetadata({
path: 'mouseStatus',
value: 'leave'
});
}
emit(onLeave, toEmitted(handlerApi));
}
function mouseup(handlerApi) {
var setMetadata = handlerApi.setMetadata,
denied = handlerApi.denied;
setMetadata({
path: 'mouseStatus',
value: 'up'
});
denied();
emit(onUp, toEmitted(handlerApi));
}
return {
mousedown: mousedown,
mousemove: mousemove,
mouseleave: mouseleave,
mouseup: mouseup
};
}