Skip to content

Commit

Permalink
fix(dragger): simplify dragger
Browse files Browse the repository at this point in the history
* remove not used extraArgs feature
* use event listener `once` option to remove dragend listener
  • Loading branch information
barmac committed Jan 9, 2019
1 parent 1886fd2 commit 2c416a5
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 51 deletions.
43 changes: 43 additions & 0 deletions client/src/util/dom/__tests__/draggerSpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import draggerFactory from '../dragger';

/* global sinon */


describe('dragger', function() {

afterEach(function() {
document.dispatchEvent(new DragEvent('dragend'));
});

it('should call provided function on drag event', function() {

// given
const callbackSpy = sinon.spy();
const dragger = draggerFactory(callbackSpy);

// when
dragger(new DragEvent('dragstart'));

document.dispatchEvent(new DragEvent('drag', { clientX: 1, clientY: 1 }));

// then
expect(callbackSpy).to.be.calledOnce;
});


it('should not call provided function for last drag event with (0, 0) values', function() {

// given
const callbackSpy = sinon.spy();
const dragger = draggerFactory(callbackSpy);

// when
dragger(new DragEvent('dragstart'));

document.dispatchEvent(new DragEvent('drag', { clientX: 0, clientY: 0 }));

// then
expect(callbackSpy).to.not.be.called;
});

});
72 changes: 24 additions & 48 deletions client/src/util/dom/dragger.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import slice from '../slice';

import {
domify
} from 'min-dom';


/**
* Add a dragger that calls back the passed function with
* { args..., event, delta } on drag.
* { event, delta } on drag.
*
* @example
*
Expand All @@ -17,51 +15,19 @@ import {
*
* domElement.addEventListener('dragstart', dragger(dragMove));
*
*
* @param {Function} fn
*
* @return {Function} drag start callback function
*/
export default function dragger(fn) {

var self;
var extraArgs;

var startPosition;

var dragging;
export default function createDragger(fn) {

function onDrag(event) {

// suppress drag end event
if (event.x === 0) {
return;
}

var currentPosition = eventPosition(event),
delta = pointDelta(currentPosition, startPosition);

var args = extraArgs.concat([ event, delta ]);

if (!dragging) {
dragging = true;

return;
}

// call provided fn with extraArgs..., event, delta
return fn.apply(self, args);
}
var self,
startPosition;

/** drag start */
var onDragStart = function onDragStart() {

// (0) extract extra arguments (extraArgs..., event)
var args = slice(arguments),
event = args.pop();
function onDragStart(event) {

self = this;
extraArgs = args;
startPosition = eventPosition(event);

// (1) prevent preview image
Expand All @@ -70,19 +36,29 @@ export default function dragger(fn) {
}

// (2) setup drag listeners
function onEnd() {
document.removeEventListener('drag', onDrag);
document.removeEventListener('dragend', onEnd);

self = extraArgs = startPosition = dragging = null;
}

// attach drag + cleanup event
document.addEventListener('drag', onDrag);
document.addEventListener('dragend', onEnd);
};
document.addEventListener('dragend', onEnd, { once: true });
}

function onDrag(event) {

// suppress drag end event
if (event.x === 0 && event.y === 0) {
return;
}

onDragStart.onDrag = onDrag;
var currentPosition = eventPosition(event),
delta = pointDelta(currentPosition, startPosition);

// call provided fn with event, delta
return fn.call(self, event, delta);
}

function onEnd() {
document.removeEventListener('drag', onDrag);
}

return onDragStart;
}
Expand Down
3 changes: 0 additions & 3 deletions client/src/util/slice.js

This file was deleted.

0 comments on commit 2c416a5

Please sign in to comment.