web-toolkit
Version:
A GTK inspired toolkit designed to build awesome web apps
268 lines (215 loc) • 8.05 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createClass"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/inherits"));
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createSuper"));
var _react = _interopRequireDefault(require("react"));
var _clsx = _interopRequireDefault(require("clsx"));
var _reactVirtualizedAutoSizer = _interopRequireDefault(require("react-virtualized-auto-sizer"));
/*
* Paned.js
*/
var properties = {
horizontal: {
size: 'width',
position: 'left',
event: 'clientX'
},
vertical: {
size: 'height',
position: 'top',
event: 'clientY'
}
};
var Paned = /*#__PURE__*/function (_React$Component) {
(0, _inherits2.default)(Paned, _React$Component);
var _super = (0, _createSuper2.default)(Paned);
function Paned(props) {
var _this;
(0, _classCallCheck2.default)(this, Paned);
_this = _super.call(this, props);
_this.removeEventListeners = function () {
document.removeEventListener('mousemove', _this.onTouchMove);
document.removeEventListener('mouseup', _this.onTouchEnd);
document.removeEventListener('touchmove', _this.onTouchMove);
document.removeEventListener('touchend', _this.onTouchEnd);
};
_this.onTouchMove = function (event) {
event.preventDefault();
var orientation = _this.props.orientation;
var finger = trackFinger(event, _this.touchId);
if (!finger) {
_this.removeEventListeners();
return;
}
var handle = _this.handle.current.getBoundingClientRect();
var handlePosition = handle[properties[orientation].position];
var mousePosition = finger[properties[orientation].event];
var delta = mousePosition - handlePosition;
_this.setState({
size: _this.state.size + delta
});
};
_this.onTouchEnd = function () {
_this.setState({
dragging: false
});
_this.removeEventListeners();
};
_this.onTouchStart = function (event) {
event.preventDefault();
var touch = event.changedTouches[0]; // A number that uniquely identifies the current finger in the touch session.
_this.touchId = touch === null || touch === void 0 ? void 0 : touch.identifier;
_this.setState({
dragging: true
});
document.addEventListener('touchmove', _this.onTouchMove);
document.addEventListener('touchend', _this.onTouchEnd);
};
_this.onMouseDown = function (event) {
if (event.button !== 0) return;
event.preventDefault();
_this.setState({
dragging: true
});
document.addEventListener('mousemove', _this.onTouchMove);
document.addEventListener('mouseup', _this.onTouchEnd);
};
_this.onKeyDown = function (ev) {
var containerSize = _this.state.containerSize;
var size;
switch (ev.key) {
case 'ArrowLeft':
case 'ArrowUp':
size = _this.state.size - 4;
break;
case 'ArrowRight':
case 'ArrowDown':
size = _this.state.size + 4;
break;
default:
return;
}
if (size < 0) size = 0;
if (size > containerSize) size = containerSize;
_this.setState({
size: size
});
ev.preventDefault();
};
_this.handle = _react.default.createRef();
_this.touchId = undefined;
_this.state = {
size: props.defaultSize,
containerSize: undefined
};
return _this;
}
(0, _createClass2.default)(Paned, [{
key: "updateContainerSize",
value: function updateContainerSize(dimensions) {
var _this2 = this;
var containerSize = dimensions[properties[this.props.orientation].size];
if (this.state.size !== undefined && this.state.containerSize === containerSize) return;
setTimeout(function () {
_this2.setState({
containerSize: containerSize
});
if (_this2.state.size === undefined) _this2.setState({
size: containerSize / 2
});
}, 0);
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _this$props = this.props,
children = _this$props.children,
className = _this$props.className,
orientation = _this$props.orientation,
border = _this$props.border,
fill = _this$props.fill,
defaultSize = _this$props.defaultSize,
rest = (0, _objectWithoutProperties2.default)(_this$props, ["children", "className", "orientation", "border", "fill", "defaultSize"]);
var size = this.state.size;
if (children.length < 2) throw new Error('Paned: requires 2 children at least');
return /*#__PURE__*/_react.default.createElement("div", Object.assign({
className: (0, _clsx.default)('Paned', className, orientation, {
'fill': fill === true,
'fill-width': fill === 'width',
'fill-height': fill === 'height',
'border-none': border === false,
'border-handle': border === 'handle'
})
}, rest), /*#__PURE__*/_react.default.createElement(_reactVirtualizedAutoSizer.default, null, function (dimensions) {
_this3.updateContainerSize(dimensions);
return /*#__PURE__*/_react.default.createElement("div", {
className: (0, _clsx.default)('Paned__wrapper', orientation),
style: dimensions
}, /*#__PURE__*/_react.default.createElement("div", {
className: "Paned__pane",
style: firstStyle(orientation, size)
}, children[0]), /*#__PURE__*/_react.default.createElement("div", {
className: "Paned__handle",
role: "separator",
"aria-orientation": orientation === 'horizontal' ? 'vertical' : 'horizontal',
tabIndex: "0",
onMouseDown: _this3.onMouseDown,
onTouchStart: _this3.onTouchStart,
onKeyDown: _this3.onKeyDown,
ref: _this3.handle,
style: handleStyle(orientation, size)
}), /*#__PURE__*/_react.default.createElement("div", {
className: "Paned__pane",
style: secondStyle(orientation, size, dimensions)
}, children[1]));
}));
}
}]);
return Paned;
}(_react.default.Component);
Paned.defaultProps = {
orientation: 'horizontal',
border: true
};
var _default = Paned;
exports.default = _default;
function handleStyle(orientation, size) {
return (0, _defineProperty2.default)({}, properties[orientation].position, size - 1);
}
function firstStyle(orientation, size) {
return (0, _defineProperty2.default)({}, properties[orientation].size, size);
}
function secondStyle(orientation, size, dimensions) {
var totalSize = dimensions[properties[orientation].size];
if (typeof totalSize !== 'number' || typeof size !== 'number') return undefined;
var secondSize = totalSize - size;
return (0, _defineProperty2.default)({}, properties[orientation].size, secondSize);
}
function trackFinger(event, touchId) {
if (touchId !== undefined && event.changedTouches) {
for (var i = 0; i < event.changedTouches.length; i += 1) {
var touch = event.changedTouches[i];
if (touch.identifier === touchId) {
return {
clientX: touch.clientX,
clientY: touch.clientY
};
}
}
return false;
}
return {
clientX: event.clientX,
clientY: event.clientY
};
}
//# sourceMappingURL=Paned.js.map
;