@helpscout/hsds-react
Version:
React component library for Help Scout's Design System
130 lines (100 loc) • 5.71 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = exports.AccordionSection = exports.classNameStrings = exports.SectionContext = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _getValidProps = _interopRequireDefault(require("@helpscout/react-utils/dist/getValidProps"));
var _classnames = _interopRequireDefault(require("classnames"));
var _Accordion = require("./Accordion.css");
var _Accordion2 = require("./Accordion");
var _id = require("../../utilities/id");
var _jsxRuntime = require("react/jsx-runtime");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
var nextUuid = (0, _id.createUniqueIDFactory)('AccordionSection');
var SectionContext = /*#__PURE__*/(0, _react.createContext)();
exports.SectionContext = SectionContext;
var classNameStrings = {
baseComponentClassName: 'c-Accordion__Section',
isLinkClassName: 'is-link',
isOpenClassName: 'is-open',
isSeamlessClassName: 'is-seamless',
isStatusInfoClassName: 'is-info',
isStatusErrorClassName: 'is-error'
};
exports.classNameStrings = classNameStrings;
var getComponentClassName = function getComponentClassName(_ref) {
var className = _ref.className,
isOpen = _ref.isOpen,
isLink = _ref.isLink,
status = _ref.status;
// eslint-disable-next-line react-hooks/rules-of-hooks
var _ref2 = (0, _react.useContext)(_Accordion2.AccordionContext) || {},
isSeamless = _ref2.isSeamless;
if (isLink) isSeamless = false;
var baseComponentClassName = classNameStrings.baseComponentClassName,
isLinkClassName = classNameStrings.isLinkClassName,
isOpenClassName = classNameStrings.isOpenClassName,
isSeamlessClassName = classNameStrings.isSeamlessClassName,
isStatusInfoClassName = classNameStrings.isStatusInfoClassName,
isStatusErrorClassName = classNameStrings.isStatusErrorClassName;
return (0, _classnames.default)(baseComponentClassName, isLink && isLinkClassName, isOpen && isOpenClassName, isSeamless && isSeamlessClassName, status && status === 'info' && isStatusInfoClassName, status && status === 'error' && isStatusErrorClassName, className);
};
var isSectionOpen = function isSectionOpen(_ref3, openSections) {
var isLink = _ref3.isLink,
uuid = _ref3.uuid;
if (isLink) return false;
return openSections.includes(uuid);
};
var AccordionSection = function AccordionSection(props) {
var children = props.children,
rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["children"]);
var _useState = (0, _react.useState)(props.id || nextUuid()),
uuid = _useState[0];
var _ref4 = (0, _react.useContext)(_Accordion2.AccordionContext) || {},
_ref4$openSections = _ref4.openSections,
openSections = _ref4$openSections === void 0 ? [] : _ref4$openSections;
var isOpen = isSectionOpen((0, _extends2.default)({}, props, {
uuid: uuid
}), openSections);
var componentClassName = getComponentClassName((0, _extends2.default)({}, props, {
isOpen: isOpen
}));
var sectionContextValue = {
uuid: uuid,
isOpen: isOpen
};
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Accordion.SectionUI, (0, _extends2.default)({}, (0, _getValidProps.default)(rest), {
className: componentClassName,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(SectionContext.Provider, {
value: sectionContextValue,
children: children
})
}));
};
exports.AccordionSection = AccordionSection;
AccordionSection.defaultProps = {
'data-cy': 'AccordionSection',
isLink: false
};
AccordionSection.propTypes = {
/** Content to render. */
children: _propTypes.default.any,
/** Custom class names to be added to the component. */
className: _propTypes.default.string,
/** The id used to track the section's open state. */
id: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
/** Renders a Link based UI. */
isLink: _propTypes.default.bool,
/** Callback to be invoked when the section is opened. */
onOpen: _propTypes.default.func,
/** Callback to be invoked when the section is closed. */
onClose: _propTypes.default.func,
/** Data attr for Cypress tests. */
'data-cy': _propTypes.default.string
};
var _default = AccordionSection;
exports.default = _default;