Skip to content
This repository was archived by the owner on Dec 19, 2022. It is now read-only.

Commit a5b6bb6

Browse files
committed
init
0 parents commit a5b6bb6

28 files changed

+1024
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
node_modules
2+
*.swp
3+
.DS_Store

README.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
React Native Gestures
2+
=====================
3+
4+
> React Native Composable Gesture Library
5+
6+
Showcase
7+
--------
8+
9+
![](http://i.imgur.com/qxzroIb.gif?1)
10+
11+
12+
Quick Sample
13+
------------
14+
15+
```js
16+
import React, {
17+
View,
18+
Text
19+
} from 'react-native';
20+
21+
import {
22+
drag,
23+
pinch,
24+
GestureView
25+
} from 'react-native-gestures';
26+
27+
export default React.createClass({
28+
render() {
29+
onGestureError(err) {
30+
console.error(err);
31+
},
32+
return (
33+
<View>
34+
<GestureView gestures={[drag]}>
35+
<Text>I can move</Text>
36+
</GestureView>
37+
38+
<GestureView gestures={[pinch]}>
39+
<Text>I can do pinch</Text>
40+
</GestureView>
41+
42+
<GestureView gestures={[pinch, drag]}>
43+
<Text>I can move and pinch</Text>
44+
</GestureView>
45+
</View>
46+
);
47+
}
48+
});
49+
```

dist/GestureView.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
8+
9+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
10+
11+
var _events = require('./events');
12+
13+
var _events2 = _interopRequireDefault(_events);
14+
15+
var _draggable = require('./draggable');
16+
17+
var _draggable2 = _interopRequireDefault(_draggable);
18+
19+
var _create = require('./create');
20+
21+
var _create2 = _interopRequireDefault(_create);
22+
23+
var _reactNative = require('react-native');
24+
25+
var _reactNative2 = _interopRequireDefault(_reactNative);
26+
27+
exports['default'] = _reactNative2['default'].createClass({
28+
displayName: 'GestureView',
29+
30+
mixins: [(0, _events2['default'])(['onLayout']), (0, _draggable2['default'])()],
31+
propTypes: {
32+
gestures: _reactNative.PropTypes.array.isRequired,
33+
onError: _reactNative.PropTypes.func.isRequired
34+
},
35+
componentDidMount: function componentDidMount() {
36+
var _this = this;
37+
38+
this.layoutStream.subscribe(function (layout) {
39+
return _this.container.setNativeProps({
40+
style: {
41+
height: layout.height,
42+
width: layout.width,
43+
top: layout.y,
44+
left: layout.x
45+
}
46+
});
47+
}, function (err) {
48+
return _this.props.onError;
49+
});
50+
},
51+
render: function render() {
52+
var _this2 = this;
53+
54+
var props = _extends({
55+
ref: function ref(container) {
56+
return _this2.container = container;
57+
},
58+
style: this.props.style,
59+
onLayout: function onLayout(_ref) {
60+
var nativeEvent = _ref.nativeEvent;
61+
62+
_this2.onLayout.onNext(nativeEvent);
63+
}
64+
}, this.gestureResponder.panHandlers);
65+
66+
return _reactNative2['default'].createElement(
67+
_reactNative.View,
68+
props,
69+
this.props.children
70+
);
71+
}
72+
});
73+
module.exports = exports['default'];

dist/center.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
exports.ofTwoTouches = ofTwoTouches;
7+
8+
var _immutable = require('immutable');
9+
10+
function ofTwoTouches(touches) {
11+
var ga = touches.get(0);
12+
var gb = touches.get(1);
13+
14+
return (0, _immutable.Map)({
15+
x: (ga.get('pageX') + gb.get('pageX')) / 2,
16+
y: (ga.get('pageY') + gb.get('pageY')) / 2
17+
});
18+
}

dist/create.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
8+
9+
var _ramda = require('ramda');
10+
11+
var _withSpecificPointerNumbers = require('./withSpecificPointerNumbers');
12+
13+
var _withSpecificPointerNumbers2 = _interopRequireDefault(_withSpecificPointerNumbers);
14+
15+
function createGesture(options, getInitialLayout, draggable) {
16+
return draggable.onDragStart.flatMap(function () {
17+
return (0, _withSpecificPointerNumbers2['default'])(options.GESTURE_NUMBER, draggable.onDragMove, getInitialLayout).transduce(options.calculate).takeUntil(draggable.onDragRelease);
18+
});
19+
};
20+
21+
exports['default'] = (0, _ramda.curry)(createGesture);
22+
module.exports = exports['default'];

dist/distance.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
exports.ofTwoTouches = ofTwoTouches;
7+
function pow2abs(a, b) {
8+
return Math.pow(Math.abs(a - b), 2);
9+
}
10+
11+
function ofTwoTouches(touches) {
12+
var a = touches.get(0);
13+
var b = touches.get(1);
14+
15+
return Math.sqrt(pow2abs(a.get('pageX'), b.get('pageX')) + pow2abs(a.get('pageY'), b.get('pageY')), 2);
16+
}

dist/drag.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
8+
9+
var _rx = require('rx');
10+
11+
var _rx2 = _interopRequireDefault(_rx);
12+
13+
var _transducersJs = require('transducers.js');
14+
15+
var calculate = (0, _transducersJs.map)(function (gesture) {
16+
var layout = gesture.get('initialLayout');
17+
var initialTouch = gesture.get('initialTouches').get(0);
18+
var currentTouch = gesture.get('touches').get(0);
19+
return layout.withMutations(function (l) {
20+
return l.set('x', l.get('x') + (currentTouch.get('pageX') - initialTouch.get('pageX'))).set('y', l.get('y') + (currentTouch.get('pageY') - initialTouch.get('pageY')));
21+
}).toJS();
22+
});
23+
24+
exports.calculate = calculate;
25+
var GESTURE_NUMBER = 1;
26+
exports.GESTURE_NUMBER = GESTURE_NUMBER;

dist/draggable.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
exports['default'] = draggableMixin;
7+
8+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
9+
10+
var _rx = require('rx');
11+
12+
var _rx2 = _interopRequireDefault(_rx);
13+
14+
var _create = require('./create');
15+
16+
var _create2 = _interopRequireDefault(_create);
17+
18+
var _reactNative = require('react-native');
19+
20+
var _reactNative2 = _interopRequireDefault(_reactNative);
21+
22+
var _immutable = require('immutable');
23+
24+
function draggableMixin(gestureDefs) {
25+
gestureDefs = gestureDefs || [];
26+
27+
var target;
28+
var layout;
29+
30+
var getInitialLayout = function getInitialLayout() {
31+
return layout;
32+
};
33+
var isCurrentTarget = function isCurrentTarget(ev) {
34+
return ev.target === target;
35+
};
36+
37+
return {
38+
componentWillMount: function componentWillMount() {
39+
var onDragStart = new _rx2['default'].Subject();
40+
var onDragMove = new _rx2['default'].Subject();
41+
var onDragRelease = new _rx2['default'].Subject();
42+
43+
this.onLayout.take(1).subscribe(function (ev) {
44+
target = ev.target;
45+
});
46+
47+
this.onLayout.subscribe(function (ev) {
48+
return layout = ev.layout;
49+
});
50+
51+
var draggable = {
52+
onDragStart: onDragStart.filter(isCurrentTarget),
53+
onDragMove: onDragMove.filter(isCurrentTarget),
54+
onDragRelease: onDragRelease.filter(isCurrentTarget)
55+
};
56+
57+
this.gestureResponder = _reactNative.PanResponder.create({
58+
onStartShouldSetPanResponder: function onStartShouldSetPanResponder() {
59+
return true;
60+
},
61+
onStartShouldSetPanResponderCapture: function onStartShouldSetPanResponderCapture() {
62+
return true;
63+
},
64+
onMoveShouldSetPanResponder: function onMoveShouldSetPanResponder() {
65+
return true;
66+
},
67+
onMoveShouldSetPanResponderCapture: function onMoveShouldSetPanResponderCapture() {
68+
return true;
69+
},
70+
onPanResponderGrant: function onPanResponderGrant(evt) {
71+
return onDragStart.onNext(evt.nativeEvent);
72+
},
73+
onPanResponderMove: function onPanResponderMove(evt, gestureState) {
74+
return onDragMove.onNext(evt.nativeEvent);
75+
},
76+
onPanResponderTerminationRequest: function onPanResponderTerminationRequest() {
77+
return true;
78+
},
79+
onPanResponderRelease: function onPanResponderRelease(evt) {
80+
return onDragRelease.onNext(evt.nativeEvent);
81+
},
82+
onPanResponderTerminate: function onPanResponderTerminate() {
83+
return true;
84+
},
85+
onShouldBlockNativeResponder: function onShouldBlockNativeResponder() {
86+
return true;
87+
}
88+
});
89+
90+
if (this.props && this.props.gestures) {
91+
gestureDefs = gestureDefs.concat(this.props.gestures);
92+
}
93+
94+
this.layoutStream = _rx2['default'].Observable.merge(gestureDefs.map(function (options) {
95+
return (0, _create2['default'])(options, getInitialLayout, draggable);
96+
}));
97+
}
98+
};
99+
}
100+
101+
;
102+
module.exports = exports['default'];

dist/events.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
exports['default'] = events;
7+
var Rx = require('rx');
8+
9+
function events() {
10+
var evs = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
11+
12+
var streams = evs.reduce(function (res, eventName) {
13+
res[eventName] = new Rx.Subject();
14+
return res;
15+
}, {});
16+
17+
return {
18+
componentWillMount: function componentWillMount() {
19+
Object.assign(this, streams);
20+
},
21+
componentWillUnmount: function componentWillUnmount() {
22+
evs.forEach(function (ev) {
23+
streams[ev].onCompleted();
24+
});
25+
}
26+
};
27+
}
28+
29+
module.exports = exports['default'];

dist/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
'use strict';
2+
3+
module.exports = {
4+
drag: require('./drag'),
5+
pinch: require('./pinch'),
6+
create: require('./create'),
7+
draggable: require('./mixins/draggable'),
8+
GestureView: require('./GestureView')
9+
};

0 commit comments

Comments
 (0)