@findify/react-components
Version:
Findify react UI components
136 lines (118 loc) • 6.21 kB
JavaScript
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 _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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 _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
/**
* @module components/Tabs
*/
import { Children, cloneElement, useCallback, useMemo, useState } from 'react';
import cx from 'classnames';
import Dropdown from "../Dropdown";
import { fromJS } from 'immutable';
var styles = {
"list": "findify-components--tabs__list",
"body": "findify-components--tabs__body",
"dropdown": "findify-components--tabs__dropdown",
"tab": "findify-components--tabs__tab",
"active": "findify-components--tabs__active",
"disabled": "findify-components--tabs__disabled"
};
import { useMobile } from "../../helpers/useMobile";
import { jsx as _jsx } from "react/jsx-runtime";
import { createElement as _createElement } from "react";
import { Fragment as _Fragment } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
export var Tab = function Tab() {
return null;
};
var Item = function Item(_ref) {
var onClick = _ref.onClick,
label = _ref.label,
theme = _ref.theme,
active = _ref.active,
disabled = _ref.disabled,
index = _ref.index;
var _onClick = useCallback(function (e) {
if (disabled) return;
if (e) e.preventDefault();
return onClick(index);
}, []);
return /*#__PURE__*/_jsx("li", {
className: cx(theme.tab, active && theme.active, disabled && theme.disabled),
onClick: _onClick,
children: label
});
};
var MobileDropdown = function MobileDropdown(_ref2) {
var children = _ref2.children,
selected = _ref2.selected,
onChange = _ref2.onChange,
className = _ref2.className;
var _onChange = useCallback(function (item) {
return onChange(item.get('index'));
}, []);
var items = useMemo(function () {
return fromJS(Children.toArray(children).map(function (i, index) {
return {
index: index,
label: i.props.label
};
}));
}, [children]);
return /*#__PURE__*/_jsx(Dropdown, {
className: className,
selectedItem: items.get(selected),
onChange: _onChange,
items: items
});
};
export default (function (_ref3) {
var _ref3$theme = _ref3.theme,
theme = _ref3$theme === void 0 ? styles : _ref3$theme,
children = _ref3.children,
onTabClick = _ref3.onTabClick,
_ref3$selectedIndex = _ref3.selectedIndex,
selectedIndex = _ref3$selectedIndex === void 0 ? 0 : _ref3$selectedIndex;
var _useState = useState(selectedIndex),
_useState2 = _slicedToArray(_useState, 2),
selected = _useState2[0],
setSelected = _useState2[1];
var isMobile = useMobile();
var onSelect = useCallback(function (selectedIndex) {
if (onTabClick) onTabClick(selectedIndex);
setSelected(selectedIndex);
}, []);
var body = useMemo(function () {
var candidate = Children.toArray(children)[selected];
return /*#__PURE__*/cloneElement(candidate.props.children, {
changeTab: onSelect
});
}, [selected]);
return /*#__PURE__*/_jsxs(_Fragment, {
children: [!isMobile ? /*#__PURE__*/_jsx("ul", {
className: theme.list,
children: Children.map(children, function (child, index) {
return /*#__PURE__*/_createElement(Item, _objectSpread(_objectSpread({}, child.props), {}, {
index: index,
key: index,
active: index === selected,
theme: theme,
onClick: onSelect
}));
})
}) : null, isMobile ? /*#__PURE__*/_jsx(MobileDropdown, {
children: children,
selected: selected,
className: theme.dropdown,
onChange: onSelect
}) : null, /*#__PURE__*/_jsx("div", {
className: theme.body,
children: body
})]
});
});