@javierbyte/react-colorizer
Version:
A color picker component for React and React Native.
319 lines (271 loc) • 9.73 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require("babel-runtime/helpers/extends");
var _extends3 = _interopRequireDefault(_extends2);
var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties");
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _propTypes = require("prop-types");
var _propTypes2 = _interopRequireDefault(_propTypes);
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _reactNative = require("react-native");
var _BarWrapperStyled = require("../components-styled/BarWrapperStyled.native");
var _BarWrapperStyled2 = _interopRequireDefault(_BarWrapperStyled);
var _config = require("../utils/config");
var _Handler = require("../../Handler");
var _Handler2 = _interopRequireDefault(_Handler);
var _position = require("../../../utils/position");
var _position2 = _interopRequireDefault(_position);
var _positionValidation = require("../../../utils/position-validation");
var _positionValidation2 = _interopRequireDefault(_positionValidation);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var propTypes = {
children: _propTypes2.default.any.isRequired,
height: _propTypes2.default.number.isRequired,
isDisabled: _propTypes2.default.bool.isRequired,
position: _propTypes2.default.number.isRequired,
width: _propTypes2.default.number.isRequired,
onValueChanged: _propTypes2.default.func.isRequired,
onValueChangeEnd: _propTypes2.default.func,
onValueChangeStart: _propTypes2.default.func
};
var defaultProps = {};
var BarWrapper = function (_React$Component) {
(0, _inherits3.default)(BarWrapper, _React$Component);
function BarWrapper(props) {
(0, _classCallCheck3.default)(this, BarWrapper);
var _this = (0, _possibleConstructorReturn3.default)(this, (BarWrapper.__proto__ || (0, _getPrototypeOf2.default)(BarWrapper)).call(this, props));
_this.cache = {
holdTimer: null,
holdHandler: null,
holdPositionX: null,
holdPositionY: null
};
_this.state = {
dragging: false,
holding: false,
isDomInitialized: false
};
_this.onDraggingChanged = _this.onDraggingChanged.bind(_this);
_this.onSetBarDom = _this.onSetBarDom.bind(_this);
_this.onTouchStart = _this.onTouchStart.bind(_this);
_this.onTouchMove = _this.onTouchMove.bind(_this);
_this.onTouchRelease = _this.onTouchRelease.bind(_this);
return _this;
}
(0, _createClass3.default)(BarWrapper, [{
key: "componentWillMount",
value: function componentWillMount() {
this.panResponder = _reactNative.PanResponder.create({
onStartShouldSetPanResponder: function onStartShouldSetPanResponder() {
return true;
},
onMoveShouldSetPanResponder: function onMoveShouldSetPanResponder() {
return true;
},
onPanResponderGrant: this.onTouchStart,
onPanResponderMove: this.onTouchMove,
onPanResponderRelease: this.onTouchRelease,
onPanResponderTerminationRequest: function onPanResponderTerminationRequest() {
return false;
}
});
}
}, {
key: "onTouchStart",
value: function onTouchStart(e, gestureState) {
var _props = this.props,
isDisabled = _props.isDisabled,
width = _props.width;
if (isDisabled) {
return;
}
var targetBoundingClientRect = {
left: 0,
width: width
};
this.cache.holdPositionX = gestureState.x0;
this.cache.holdPositionY = gestureState.y0;
this.setState(function () {
return {
holding: true
};
});
this.setOnHoldTimerInitIfNeed(this.getOnHoldHandler(gestureState.x0, targetBoundingClientRect));
}
}, {
key: "onTouchMove",
value: function onTouchMove(e, gestureState) {
var _props2 = this.props,
isDisabled = _props2.isDisabled,
width = _props2.width,
onValueChanged = _props2.onValueChanged,
position = _props2.position,
height = _props2.height,
onValueChangeStart = _props2.onValueChangeStart;
if (isDisabled) {
return;
}
var _state = this.state,
dragging = _state.dragging,
holding = _state.holding;
if (this.checkHolding(gestureState.moveX, gestureState.moveY)) {
return;
}
// disable move if moved over handler
if (!dragging && (!holding || Math.abs(position * width - gestureState.moveX) > height / 2)) {
return;
}
if (!dragging) {
if (onValueChangeStart) {
onValueChangeStart();
}
this.onDraggingChanged(true);
}
var newPosition = (0, _position2.default)(0, gestureState.moveX, width);
(0, _positionValidation2.default)(newPosition, onValueChanged);
}
}, {
key: "onTouchRelease",
value: function onTouchRelease() {
var _props3 = this.props,
isDisabled = _props3.isDisabled,
onValueChangeEnd = _props3.onValueChangeEnd;
if (isDisabled) {
return;
}
if (onValueChangeEnd) {
onValueChangeEnd();
}
this.onDraggingChanged(false);
this.setCancelTimer();
}
}, {
key: "onDraggingChanged",
value: function onDraggingChanged(dragging) {
this.setState(function () {
return {
dragging: dragging
};
});
}
}, {
key: "onSetBarDom",
value: function onSetBarDom(barDom) {
this.barDom = barDom;
this.setState(function () {
return {
isDomInitialized: true
};
});
}
}, {
key: "getOnHoldHandler",
value: function getOnHoldHandler(clientX, targetBoundingClientRect) {
var _this2 = this;
return function () {
var _props4 = _this2.props,
isDisabled = _props4.isDisabled,
onValueChanged = _props4.onValueChanged,
onValueChangeStart = _props4.onValueChangeStart;
if (isDisabled) {
return;
}
if (_this2.state.holding) {
onValueChanged((0, _position2.default)(targetBoundingClientRect.left, clientX, targetBoundingClientRect.width));
if (onValueChangeStart) {
onValueChangeStart();
}
_this2.onDraggingChanged(true);
}
};
}
}, {
key: "setOnHoldTimerInitIfNeed",
value: function setOnHoldTimerInitIfNeed(holdHandler) {
var holdTimer = this.cache.holdTimer;
if (holdTimer === null || holdTimer === undefined) {
this.cache.holdHandler = holdHandler;
this.cache.holdTimer = setTimeout(this.cache.holdHandler, _config.HOLD_TIME);
}
}
}, {
key: "setCancelTimer",
value: function setCancelTimer() {
clearTimeout(this.cache.holdTimer);
this.cache.holdTimer = null;
this.cache.holdPositionX = null;
this.setState(function () {
return {
holding: false
};
});
}
}, {
key: "checkHolding",
value: function checkHolding(x, y) {
if (this.state.holding) {
var diffX = Math.abs(this.cache.holdPositionX - x);
var diffY = Math.abs(this.cache.holdPositionY - y);
if (diffX !== 0 && diffX > _config.TOLERANCE || diffY !== 0 && diffY > _config.TOLERANCE) {
this.setState(function () {
return {
holding: false
};
});
return false;
}
}
return this.state.holding;
}
}, {
key: "renderHandler",
value: function renderHandler(height, position) {
var width = this.props.width;
var isDomInitialized = this.state.isDomInitialized;
if (!isDomInitialized) {
return null;
}
return _react2.default.createElement(_Handler2.default, { position: position, size: height, width: width });
}
}, {
key: "render",
value: function render() {
var _props5 = this.props,
children = _props5.children,
height = _props5.height,
isDisabled = _props5.isDisabled,
position = _props5.position,
width = _props5.width,
onValueChanged = _props5.onValueChanged,
props = (0, _objectWithoutProperties3.default)(_props5, ["children", "height", "isDisabled", "position", "width", "onValueChanged"]);
return _react2.default.createElement(
_BarWrapperStyled2.default,
(0, _extends3.default)({
isDisabled: isDisabled,
ref: this.onSetBarDom,
styleHeight: height,
styleWidth: width
}, props, this.panResponder.panHandlers),
children,
this.renderHandler(height, position)
);
}
}]);
return BarWrapper;
}(_react2.default.Component);
exports.default = BarWrapper;
BarWrapper.propTypes = propTypes;
BarWrapper.defaultProps = defaultProps;