Skip to content

Commit d778985

Browse files
committed
Babel 6 / Flow compat
1 parent 61f441b commit d778985

File tree

14 files changed

+175
-90
lines changed

14 files changed

+175
-90
lines changed

.babelrc

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
{
2-
"stage": 0,
3-
"env": {
4-
"test": {
5-
"plugins": [
6-
"typecheck"
7-
]
8-
}
9-
}
2+
"presets": [
3+
"es2015",
4+
"stage-1",
5+
"react"
6+
]
107
}

.eslintrc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,10 @@
1818
env: {
1919
"browser": true,
2020
"node": true
21+
},
22+
globals: {
23+
// For Flow
24+
"ReactElement",
25+
"ReactClass"
2126
}
2227
}

.flowconfig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[ignore]
2+
.*/node_modules/.*
3+
4+
[include]
5+
lib/
6+
index.js
7+
8+
[libs]
9+
10+
[options]
11+
suppress_comment=\\(.\\|\n\\)*\\s*\\$FlowFixMe.*
12+
suppress_comment=\\(.\\|\n\\)*\\s*\\$FlowBug.*
13+
suppress_comment=\\(.\\|\n\\)*\\s*\\$FlowIgnore.*
14+
suppress_comment=\\(.\\|\n\\)*\\s*\\$FlowNewLine.*
15+
suppress_comment=\\(.\\|\n\\)*\\s*\\$FlowIssue
16+
esproposal.class_instance_fields=ignore
17+
esproposal.class_static_fields=ignore
18+
module.file_ext=.js
19+
module.file_ext=.jsx
20+
module.file_ext=.es5
21+
module.file_ext=.es6

index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
module.exports = require('./lib/Draggable');
2-
module.exports.DraggableCore = require('./lib/DraggableCore');
1+
module.exports = require('./lib/Draggable').default;
2+
module.exports.DraggableCore = require('./lib/DraggableCore').default;

karma.conf.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ module.exports = function(config) {
2828
loader: 'babel-loader',
2929
query: {
3030
cacheDirectory: true,
31-
plugins: [
32-
'typecheck'
33-
]
3431
},
3532
exclude: /(node_modules)/
3633
}

lib/Draggable.es6

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,36 @@
1+
// @flow
12
import {default as React, PropTypes} from 'react';
23
import ReactDOM from 'react-dom';
4+
// $FlowIgnore
35
import classNames from 'classnames';
4-
import assign from 'object-assign';
5-
import {createUIEvent, createTransform} from './utils/domFns';
6+
import {createUIEvent, createCSSTransform, createSVGTransform} from './utils/domFns';
67
import {canDragX, canDragY, getBoundPosition} from './utils/positionFns';
78
import {dontSetMe} from './utils/shims';
89
import DraggableCore from './DraggableCore';
910
import log from './utils/log';
1011

12+
import type {CoreEvent} from './utils/domFns';
13+
export type CoreEventHandler = (e: Event, coreEvent: CoreEvent) => void | false;
14+
export type DraggableState = {
15+
dragging: boolean,
16+
dragged: boolean,
17+
clientX: number, clientY: number,
18+
slackX: number, slackY: number,
19+
isElementSVG: boolean
20+
};
21+
1122
//
1223
// Define <Draggable>
1324
//
1425

15-
export default class Draggable extends DraggableCore {
26+
export default class Draggable extends React.Component {
1627

1728
static displayName = 'Draggable';
1829

19-
static propTypes = assign({}, DraggableCore.propTypes, {
30+
static propTypes = {
31+
// Accepts all props <DraggableCore> accepts.
32+
...DraggableCore.propTypes,
33+
2034
/**
2135
* `axis` determines which axis the draggable can move.
2236
*
@@ -116,19 +130,23 @@ export default class Draggable extends DraggableCore {
116130
className: dontSetMe,
117131
style: dontSetMe,
118132
transform: dontSetMe
119-
});
133+
};
120134

121-
static defaultProps = assign({}, DraggableCore.defaultProps, {
135+
static defaultProps = {
136+
...DraggableCore.defaultProps,
122137
axis: 'both',
123138
bounds: false,
124139
start: {x: 0, y: 0},
125140
zIndex: NaN
126-
});
141+
};
127142

128-
state = {
143+
state: DraggableState = {
129144
// Whether or not we are currently dragging.
130145
dragging: false,
131146

147+
// Whether or not we have been dragged before.
148+
dragged: false,
149+
132150
// Current transform x and y.
133151
clientX: this.props.start.x, clientY: this.props.start.y,
134152

@@ -150,18 +168,18 @@ export default class Draggable extends DraggableCore {
150168
this.setState({dragging: false}); // prevents invariant if unmounted while dragging
151169
}
152170

153-
onDragStart = (e, coreEvent) => {
171+
onDragStart: CoreEventHandler = (e, coreEvent) => {
154172
log('Draggable: onDragStart: %j', coreEvent.position);
155173

156174
// Short-circuit if user's callback killed it.
157175
let shouldStart = this.props.onStart(e, createUIEvent(this, coreEvent));
158176
// Kills start event on core as well, so move handlers are never bound.
159177
if (shouldStart === false) return false;
160178

161-
this.setState({dragging: true});
179+
this.setState({dragging: true, dragged: true});
162180
};
163181

164-
onDrag = (e, coreEvent) => {
182+
onDrag: CoreEventHandler = (e, coreEvent) => {
165183
if (!this.state.dragging) return false;
166184
log('Draggable: onDrag: %j', coreEvent.position);
167185

@@ -202,7 +220,7 @@ export default class Draggable extends DraggableCore {
202220
this.setState(newState);
203221
};
204222

205-
onDragStop = (e, coreEvent) => {
223+
onDragStop: CoreEventHandler = (e, coreEvent) => {
206224
if (!this.state.dragging) return false;
207225

208226
// Short-circuit if user's callback killed it.
@@ -218,13 +236,14 @@ export default class Draggable extends DraggableCore {
218236
});
219237
};
220238

221-
render() {
222-
let style, svgTransform = null;
239+
render(): ReactElement {
240+
let style = {}, svgTransform = null;
241+
223242
// Add a CSS transform to move the element around. This allows us to move the element around
224243
// without worrying about whether or not it is relatively or absolutely positioned.
225244
// If the item you are dragging already has a transform set, wrap it in a <span> so <Draggable>
226245
// has a clean slate.
227-
style = createTransform({
246+
const transformOpts = {
228247
// Set left if horizontal drag is enabled
229248
x: canDragX(this) ?
230249
this.state.clientX :
@@ -234,12 +253,13 @@ export default class Draggable extends DraggableCore {
234253
y: canDragY(this) ?
235254
this.state.clientY :
236255
this.props.start.y
237-
}, this.state.isElementSVG);
256+
};
238257

239258
// If this element was SVG, we use the `transform` attribute.
240259
if (this.state.isElementSVG) {
241-
svgTransform = style;
242-
style = {};
260+
svgTransform = createSVGTransform(transformOpts);
261+
} else {
262+
style = createCSSTransform(transformOpts);
243263
}
244264

245265
// zIndex option
@@ -259,10 +279,11 @@ export default class Draggable extends DraggableCore {
259279
<DraggableCore {...this.props} onStart={this.onDragStart} onDrag={this.onDrag} onStop={this.onDragStop}>
260280
{React.cloneElement(React.Children.only(this.props.children), {
261281
className: className,
262-
style: assign({}, this.props.children.props.style, style),
282+
style: {...this.props.children.props.style, ...style},
263283
transform: svgTransform
264284
})}
265285
</DraggableCore>
266286
);
267287
}
268288
}
289+

lib/DraggableCore.es6

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// @flow
12
import {default as React, PropTypes} from 'react';
23
import {matchesSelector, createCoreEvent, addEvent, removeEvent, addUserSelectStyles,
34
removeUserSelectStyles, styleHacks} from './utils/domFns';
@@ -6,7 +7,7 @@ import {dontSetMe} from './utils/shims';
67
import log from './utils/log';
78

89
// Simple abstraction for dragging events names.
9-
let eventsFor = {
10+
const eventsFor = {
1011
touch: {
1112
start: 'touchstart',
1213
move: 'touchmove',
@@ -22,6 +23,13 @@ let eventsFor = {
2223
// Default to mouse events.
2324
let dragEventFor = eventsFor.mouse;
2425

26+
type EventHandler = (e: Event) => void;
27+
type CoreState = {
28+
dragging: boolean,
29+
lastX: ?number,
30+
lastY: ?number
31+
};
32+
2533
//
2634
// Define <DraggableCore>.
2735
//
@@ -222,7 +230,7 @@ export default class DraggableCore extends React.Component {
222230
onMouseDown: function(){}
223231
};
224232

225-
state = {
233+
state: CoreState = {
226234
dragging: false,
227235
// Used while dragging to determine deltas.
228236
lastX: null, lastY: null
@@ -239,7 +247,7 @@ export default class DraggableCore extends React.Component {
239247
if (this.props.enableUserSelectHack) removeUserSelectStyles();
240248
}
241249

242-
handleDragStart = (e) => {
250+
handleDragStart: EventHandler = (e) => {
243251
// Make it possible to attach event handlers on top of this one.
244252
this.props.onMouseDown(e);
245253

@@ -300,7 +308,7 @@ export default class DraggableCore extends React.Component {
300308
addEvent(document, dragEventFor.stop, this.handleDragStop);
301309
};
302310

303-
handleDrag = (e) => {
311+
handleDrag: EventHandler = (e) => {
304312
// Return if this is a touch event, but not the correct one for this element
305313
if (e.targetTouches && (e.targetTouches[0].identifier !== this.state.touchIdentifier)) return;
306314

@@ -314,13 +322,13 @@ export default class DraggableCore extends React.Component {
314322
clientX = this.state.lastX + deltaX, clientY = this.state.lastY + deltaY;
315323
}
316324

317-
let coreEvent = createCoreEvent(this, clientX, clientY);
325+
const coreEvent = createCoreEvent(this, clientX, clientY);
318326

319327
log('DraggableCore: handleDrag: %j', coreEvent.position);
320328

321329

322330
// Call event handler. If it returns explicit false, trigger end.
323-
let shouldUpdate = this.props.onDrag(e, coreEvent);
331+
const shouldUpdate = this.props.onDrag(e, coreEvent);
324332
if (shouldUpdate === false) {
325333
this.handleDragStop({});
326334
return;
@@ -332,7 +340,7 @@ export default class DraggableCore extends React.Component {
332340
});
333341
};
334342

335-
handleDragStop = (e) => {
343+
handleDragStop: EventHandler = (e) => {
336344
if (!this.state.dragging) return;
337345

338346
// Short circuit if this is not the correct touch event. `changedTouches` contains all
@@ -343,7 +351,7 @@ export default class DraggableCore extends React.Component {
343351
if (this.props.enableUserSelectHack) removeUserSelectStyles();
344352

345353
let {clientX, clientY} = getControlPosition(e);
346-
let coreEvent = createCoreEvent(this, clientX, clientY);
354+
const coreEvent = createCoreEvent(this, clientX, clientY);
347355

348356
log('DraggableCore: handleDragStop: %j', coreEvent.position);
349357

@@ -366,8 +374,8 @@ export default class DraggableCore extends React.Component {
366374

367375
// When the user scrolls, adjust internal state so the draggable moves along the page properly.
368376
// This only fires when a drag is active.
369-
handleScroll = (e) => {
370-
let s = this.state, x = document.body.scrollLeft, y = document.body.scrollTop;
377+
handleScroll: EventHandler = (e) => {
378+
const s = this.state, x = document.body.scrollLeft, y = document.body.scrollTop;
371379

372380
// Create the usual event, but make the scroll offset our deltas.
373381
let coreEvent = createCoreEvent(this);
@@ -383,7 +391,7 @@ export default class DraggableCore extends React.Component {
383391
};
384392

385393
// On mousedown, consider the drag started.
386-
onMouseDown = (e) => {
394+
onMouseDown: EventHandler = (e) => {
387395
// HACK: Prevent 'ghost click' which happens 300ms after touchstart if the event isn't cancelled.
388396
// We don't cancel the event on touchstart because of #37; we might want to make a scrollable item draggable.
389397
// More on ghost clicks: http://ariatemplates.com/blog/2014/05/ghost-clicks-in-mobile-browsers/
@@ -395,14 +403,14 @@ export default class DraggableCore extends React.Component {
395403
};
396404

397405
// Same as onMouseDown (start drag), but now consider this a touch device.
398-
onTouchStart = (e) => {
406+
onTouchStart: EventHandler = (e) => {
399407
// We're on a touch device now, so change the event handlers
400408
dragEventFor = eventsFor.touch;
401409

402410
return this.handleDragStart(e);
403411
};
404412

405-
render() {
413+
render(): ReactElement {
406414
// Reuse the child provided
407415
// This makes it flexible to use whatever element is wanted (div, ul, etc)
408416
return React.cloneElement(React.Children.only(this.props.children), {

0 commit comments

Comments
 (0)