@bnorth/components
Version:
bnorth, components, react
408 lines (347 loc) • 12.6 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
_Object$defineProperty2(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
var _react = _interopRequireDefault(require("react"));
var _hammerjs = _interopRequireDefault(require("hammerjs"));
var _BaseComponent = _interopRequireWildcard(require("./BaseComponent"));
var _Panel = _interopRequireDefault(require("./Panel"));
/**
* @module
*/
_hammerjs.default.defaults.inputClass = _BaseComponent.domIsTouch ? _hammerjs.default.TouchInput : _hammerjs.default.TouchMouseInput;
_hammerjs.default.defaults.preset.forEach(function (v) {
!v[1] && v.push({});
v[1].enable = false;
});
var handlerToEvent = {
action: 'tap press',
onDoubleTap: 'doubletap',
onPan: 'pan',
onPanCancel: 'pancancel',
onPanEnd: 'panend',
onPanStart: 'panstart',
onPinch: 'pinch',
onPinchCancel: 'pinchcancel',
onPinchEnd: 'pinchend',
onPinchIn: 'pinchin',
onPinchOut: 'pinchout',
onPinchStart: 'pinchstart',
onPress: 'press',
onPressUp: 'pressup',
onRotate: 'rotate',
onRotateCancel: 'rotatecancel',
onRotateEnd: 'rotateend',
onRotateMove: 'rotatemove',
onRotateStart: 'rotatestart',
onSwipe: 'swipe',
onSwipeRight: 'swiperight',
onSwipeLeft: 'swipeleft',
onSwipeUp: 'swipeup',
onSwipeDown: 'swipedown',
onTap: 'tap'
};
var privateProps = {
direction: true,
options: true,
recognizers: true,
recognizeWith: true
};
(0, _keys.default)(handlerToEvent).forEach(function (v) {
privateProps[v] = true;
});
function updateHammer(hammer, props) {
(0, _entries.default)(props).forEach(function (_ref) {
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
k = _ref2[0],
v = _ref2[1];
if (k === 'direction') {
// direaction
var direction = 'DIRECTION_' + (v ? String(v).toUpperCase() : 'ALL');
hammer.get('pan').set({
direction: _hammerjs.default[direction]
});
hammer.get('swipe').set({
direction: _hammerjs.default[direction]
});
} else if (k === 'options') {
// options
(0, _entries.default)(v).forEach(function (_ref3) {
var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
kk = _ref4[0],
vv = _ref4[1];
if (kk === 'recognizers') return;
hammer.set((0, _defineProperty3.default)({}, kk, vv));
});
} else if (k === 'recognizers') {
// recognizers
(0, _entries.default)(v || {}).forEach(function (_ref5) {
var _ref6 = (0, _slicedToArray2.default)(_ref5, 2),
kk = _ref6[0],
vv = _ref6[1];
var recognizer = hammer.get(kk);
recognizer.set(vv);
if (vv.requireFailure) recognizer.requireFailure(vv.requireFailure);
});
} else if (k === 'recognizeWith') {
// recognizeWith
(0, _entries.default)(v || {}).forEach(function (_ref7) {
var _ref8 = (0, _slicedToArray2.default)(_ref7, 2),
kk = _ref8[0],
vv = _ref8[1];
var recognizer = hammer.get(kk);
recognizer.recognizeWith(vv);
});
} else {
// event
k = handlerToEvent[k];
if (!k) return;
hammer.off(k);
hammer.on(k, v && function (e) {
return v(e, hammer.element);
});
}
});
}
/**
* 支持手势的小面板
* @component
* @mount Panel.Touchable
* @augments BaseComponent
* @see {@link https://hammerjs.github.io/} hammerjs
*/
var Touchable =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(Touchable, _React$Component);
function Touchable() {
(0, _classCallCheck2.default)(this, Touchable);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Touchable).apply(this, arguments));
}
(0, _createClass2.default)(Touchable, [{
key: "componentDidMount",
value: function componentDidMount() {
var element = (0, _BaseComponent.domFindNode)(this);
this.hammer = new _hammerjs.default(element);
updateHammer(this.hammer, this.props);
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.hammer.stop();
this.hammer.destroy();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
updateHammer(this.hammer, this.props);
}
}, {
key: "render",
value: function render() {
var props = (0, _BaseComponent.default)(this.props, Touchable);
(0, _keys.default)(props).forEach(function (v) {
if (privateProps[v]) delete props[v];
});
return _react.default.createElement(_Panel.default, props);
}
}]);
return Touchable;
}(_react.default.Component);
Touchable.defaultProps = {};
/**
* 设置手势识别器的识别方向,none,left,right,up,down,horizontal,vertical,all
* @attribute Panel.module:Touchable~Touchable.direction
* @type {string}
*/
/**
* 设置手势识别器的参数,比如 touchAction :设置 touchAction
* @attribute Panel.module:Touchable~Touchable.options
* @type {object}
*/
/**
* 设置指定手势识别器的参数,enable 为通用属性,如果想要打开某个识别器,需要设置为 true。
* 识别器包括:tap<点>, doubletap<双点击>, press<按住>, 水平方位的pan<平移> 和 swipe<快速滑动>, 以及多触点的 pinch<捏放> 和 rotate<旋转>识别器
* @attribute Panel.module:Touchable~Touchable.recognizers
* @type {object}
* @example
* ```jsx
* <Panel.Touchable direction="horizontal" recognizers={{'pan':{enable: true}}} onPan={e=>console.log(e.deltaY, e.deltaX)} />
* ```
*/
/**
* 设置关联触发的识别器
* @attribute Panel.module:Touchable~Touchable.recognizeWith
* @type {object}
*/
/**
* 手势事件
* @typedef RecognizerEvent
* @type {object}
* @property {string} type - 事件名称
* @property {number} deltaX - x 轴移动距离
* @property {number} deltaY - y 轴移动距离
* @property {number} deltaTime - 事件时间(毫秒)
* @property {number} distance - 移动距离
* @property {number} angle - 移动角度
* @property {number} velocityX - x 轴移动速率
* @property {number} velocityY - y 轴移动速率
* @property {number} volocity - 最高速率
* @property {string} direction - 事件方向
* @property {string} offsetDirection - 偏移方向
* @property {number} scale - 缩放比率
* @property {event} srcEvent - 源事件
* @property {number} rotation - 旋转角度
* @property {object} center - 多点的中心坐标,或者单点的点击坐标
* @property {element} target - 事件目标
* @property {boolean} isFirst - 交互为首次交互
* @property {boolean} isFinal - 交互为最后一次交互
* @property {function} preventDefault - 阻止默认事件处理
*/
/**
* 手势事件回调函数
* @callback RecognizerCallback
* @param {Panel.module:Touchable~RecognizerEvent} event - 手势事件
* @param {element} element - 手势识别的元素
*/
/**
* 双击事件处理函数,对应手势 doubletap
* @attribute Panel.module:Touchable~Touchable.onDoubleTap
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 平移事件处理函数,对应手势 pan
* @attribute Panel.module:Touchable~Touchable.onPan
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 平移事件取消处理函数,对应手势 pancancel
* @attribute Panel.module:Touchable~Touchable.onPanCancel
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 平移事件结束处理函数,对应手势 panend
* @attribute Panel.module:Touchable~Touchable.onPanEnd
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 捏放事件处理函数,对应手势 pinch
* @attribute Panel.module:Touchable~Touchable.onPinch
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 捏放事件取消处理函数,对应手势 pinchcancel
* @attribute Panel.module:Touchable~Touchable.onPinchCancel
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 捏放事件结束处理函数,对应手势 pinchend
* @attribute Panel.module:Touchable~Touchable.onPinchEnd
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 缩小事件处理函数,对应手势 pinchin
* @attribute Panel.module:Touchable~Touchable.onPinchIn
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 放大事件处理函数,对应手势 pinchout
* @attribute Panel.module:Touchable~Touchable.onPinchOut
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 捏放事件开始处理函数,对应手势 pinchstart
* @attribute Panel.module:Touchable~Touchable.onPinchStart
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 按住事件处理函数,对应手势 press
* @attribute Panel.module:Touchable~Touchable.onPress
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 按住并抬起事件处理函数,对应手势 pressup
* @attribute Panel.module:Touchable~Touchable.onPressUp
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 旋转事件处理函数,对应手势 rotate
* @attribute Panel.module:Touchable~Touchable.onRotate
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 旋转取消事件处理函数,对应手势 rotatecancel
* @attribute Panel.module:Touchable~Touchable.onRotateCancel
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 旋转结束事件处理函数,对应手势 rotateend
* @attribute Panel.module:Touchable~Touchable.onRotateEnd
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 旋转并移动事件处理函数,对应手势 rotatemove
* @attribute Panel.module:Touchable~Touchable.onRotateMove
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 旋转开始事件处理函数,对应手势 rotatestart
* @attribute Panel.module:Touchable~Touchable.onRotateStart
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 快速滑动事件处理函数,对应手势 swipe
* @attribute Panel.module:Touchable~Touchable.onSwipe
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 快速右滑事件处理函数,对应手势 swiperight
* @attribute Panel.module:Touchable~Touchable.onSwipeRight
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 快速左滑事件处理函数,对应手势 swipeleft
* @attribute Panel.module:Touchable~Touchable.onSwipeLeft
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 快速上滑事件处理函数,对应手势 swipeup
* @attribute Panel.module:Touchable~Touchable.onSwipeUp
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 快速下滑事件处理函数,对应手势 swipedown
* @attribute Panel.module:Touchable~Touchable.onSwipeDown
* @type {Panel.module:Touchable~RecognizerCallback}
*/
/**
* 点击事件处理函数,对应手势 tap
* @attribute Panel.module:Touchable~Touchable.onTap
* @type {Panel.module:Touchable~RecognizerCallback}
*/
(0, _defineProperty2.default)(Touchable, "Touchable", {
get: function get() {
return Touchable;
},
set: function set(val) {
Touchable = val;
}
});
Touchable.isBnorth = true;
Touchable.defaultProps['b-precast'] = {};
var _default = Touchable;
exports.default = _default;