simplebar-react
Version:
React component for SimpleBar
243 lines (204 loc) • 6.8 kB
JavaScript
/**
* simplebar-react - v2.3.6
* React component for SimpleBar
* https://grsmto.github.io/simplebar/
*
* Made by Adrien Denat
* Under MIT License
*/
import React, { useRef, useEffect } from 'react';
import PropTypes from 'prop-types';
import SimpleBarJS from 'simplebar/dist/simplebar-core.esm';
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _extends() {
_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;
};
return _extends.apply(this, arguments);
}
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
if (i % 2) {
ownKeys(source, true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(source).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
}
return target;
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
function _objectWithoutProperties(source, excluded) {
if (source == null) return {};
var target = _objectWithoutPropertiesLoose(source, excluded);
var key, i;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i = 0; i < sourceSymbolKeys.length; i++) {
key = sourceSymbolKeys[i];
if (excluded.indexOf(key) >= 0) continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
target[key] = source[key];
}
}
return target;
}
/* Deprecated
* Hardcore this here until we can safely deprecated it.
* Helper function to retrieve options from element attributes
*/
var getOptions = function getOptions(obj) {
var options = Array.prototype.reduce.call(obj, function (acc, attribute) {
var option = attribute.name.match(/data-simplebar-(.+)/);
if (option) {
var key = option[1].replace(/\W+(.)/g, function (x, chr) {
return chr.toUpperCase();
});
switch (attribute.value) {
case 'true':
acc[key] = true;
break;
case 'false':
acc[key] = false;
break;
case undefined:
acc[key] = true;
break;
default:
acc[key] = attribute.value;
}
}
return acc;
}, {});
return options;
};
var SimpleBar = React.forwardRef(function (_ref, ref) {
var children = _ref.children,
_ref$scrollableNodePr = _ref.scrollableNodeProps,
scrollableNodeProps = _ref$scrollableNodePr === void 0 ? {} : _ref$scrollableNodePr,
otherProps = _objectWithoutProperties(_ref, ["children", "scrollableNodeProps"]);
var instance;
var scrollableNodeRef = useRef();
var elRef = useRef();
var contentNodeRef = useRef();
var options = {};
var rest = {};
var deprecatedOptions = [];
Object.keys(otherProps).forEach(function (key) {
if (Object.prototype.hasOwnProperty.call(SimpleBarJS.defaultOptions, key)) {
options[key] = otherProps[key];
} else if (key.match(/data-simplebar-(.+)/) && key !== 'data-simplebar-direction') {
deprecatedOptions.push({
name: key,
value: otherProps[key]
});
} else {
rest[key] = otherProps[key];
}
});
if (deprecatedOptions.length) {
console.warn("simplebar-react: this way of passing options is deprecated. Pass it like normal props instead:\n 'data-simplebar-auto-hide=\"false\"' \u2014> 'autoHide=\"false\"'\n ");
}
useEffect(function () {
scrollableNodeRef = scrollableNodeProps.ref || scrollableNodeRef;
if (elRef.current) {
instance = new SimpleBarJS(elRef.current, _objectSpread2({}, getOptions(deprecatedOptions), {}, options, {}, scrollableNodeRef && {
scrollableNode: scrollableNodeRef.current
}, {}, contentNodeRef.current && {
contentNode: contentNodeRef.current
}));
if (ref) {
ref.current = instance;
}
}
return function () {
instance.unMount();
instance = null;
};
}, []);
return React.createElement("div", _extends({
ref: elRef,
"data-simplebar": true
}, rest), React.createElement("div", {
className: "simplebar-wrapper"
}, React.createElement("div", {
className: "simplebar-height-auto-observer-wrapper"
}, React.createElement("div", {
className: "simplebar-height-auto-observer"
})), React.createElement("div", {
className: "simplebar-mask"
}, React.createElement("div", {
className: "simplebar-offset"
}, typeof children === 'function' ? children({
scrollableNodeRef: scrollableNodeRef,
contentNodeRef: contentNodeRef
}) : React.createElement("div", _extends({}, scrollableNodeProps, {
className: "simplebar-content-wrapper".concat(scrollableNodeProps.className ? " ".concat(scrollableNodeProps.className) : '')
}), React.createElement("div", {
className: "simplebar-content"
}, children)))), React.createElement("div", {
className: "simplebar-placeholder"
})), React.createElement("div", {
className: "simplebar-track simplebar-horizontal"
}, React.createElement("div", {
className: "simplebar-scrollbar"
})), React.createElement("div", {
className: "simplebar-track simplebar-vertical"
}, React.createElement("div", {
className: "simplebar-scrollbar"
})));
});
SimpleBar.displayName = 'SimpleBar';
SimpleBar.propTypes = {
children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
scrollableNodeProps: PropTypes.object
};
export default SimpleBar;