@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.
156 lines (128 loc) • 5.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _Heading = _interopRequireDefault(require("../Heading"));
var _Stack = _interopRequireDefault(require("../Stack"));
var _ButtonLink = _interopRequireDefault(require("../ButtonLink"));
var _ChevronDown = _interopRequireDefault(require("../icons/ChevronDown"));
var _Slide = _interopRequireDefault(require("../utils/Slide"));
var _defaultTheme = _interopRequireDefault(require("../defaultTheme"));
var _useRandomId = require("../hooks/useRandomId");
var _useBoundingRect = _interopRequireDefault(require("../hooks/useBoundingRect"));
const AnimatedIcon = (0, _styledComponents.default)(_ChevronDown.default).withConfig({
displayName: "Collapse__AnimatedIcon",
componentId: "sc-1h9d3np-0"
})(["", ""], ({
theme
}) => (0, _styledComponents.css)(["transition:transform ", " ease-in-out;", ";"], theme.orbit.durationFast, ({
expanded
}) => expanded && (0, _styledComponents.css)(["transform:rotate(180deg);"]))); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
AnimatedIcon.defaultProps = {
theme: _defaultTheme.default
};
const StyledCollapse = _styledComponents.default.div.withConfig({
displayName: "Collapse__StyledCollapse",
componentId: "sc-1h9d3np-1"
})(["", ""], ({
theme
}) => (0, _styledComponents.css)(["width:100%;display:block;border-bottom:1px solid ", ";padding-bottom:", ";margin-bottom:", ";:last-child,:only-child{border:0;margin:0;}"], theme.orbit.paletteCloudNormal, theme.orbit.spaceSmall, theme.orbit.spaceMedium)); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
StyledCollapse.defaultProps = {
theme: _defaultTheme.default
};
const StyledCollapseLabel = _styledComponents.default.div.withConfig({
displayName: "Collapse__StyledCollapseLabel",
componentId: "sc-1h9d3np-2"
})(["width:100%;display:block;cursor:pointer;"]); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
StyledCollapseLabel.defaultProps = {
theme: _defaultTheme.default
};
const StyledCollapseChildren = _styledComponents.default.div.withConfig({
displayName: "Collapse__StyledCollapseChildren",
componentId: "sc-1h9d3np-3"
})(["", ""], ({
theme
}) => (0, _styledComponents.css)(["margin:", " 0;"], theme.orbit.spaceSmall)); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
StyledCollapseChildren.defaultProps = {
theme: _defaultTheme.default
};
const StyledActionsWrapper = _styledComponents.default.div.withConfig({
displayName: "Collapse__StyledActionsWrapper",
componentId: "sc-1h9d3np-4"
})(["display:flex;align-items:center;"]);
const Collapse = ({
initialExpanded = false,
expanded: expandedProp,
label,
children,
dataTest,
onClick,
actions
}) => {
const isControlledComponent = React.useMemo(() => expandedProp != null, [expandedProp]);
const [expandedState, setExpandedState] = React.useState(isControlledComponent ? expandedProp : initialExpanded);
const expanded = isControlledComponent ? expandedProp : expandedState;
const [{
height
}, node] = (0, _useBoundingRect.default)({
height: expanded ? null : 0
});
const randomId = (0, _useRandomId.useRandomIdSeed)();
const slideID = randomId("slideID");
const labelID = randomId("labelID");
const handleClick = React.useCallback(event => {
if (!isControlledComponent) {
if (onClick) {
onClick(event, !expanded);
}
setExpandedState(!expanded);
} else if (onClick) {
onClick(event, !expanded);
}
}, [expanded, isControlledComponent, onClick]);
return /*#__PURE__*/React.createElement(StyledCollapse, {
"data-test": dataTest
}, /*#__PURE__*/React.createElement(StyledCollapseLabel, {
onClick: handleClick,
role: "button",
id: labelID
}, /*#__PURE__*/React.createElement(_Stack.default, {
justify: "between",
align: "center"
}, /*#__PURE__*/React.createElement(_Heading.default, {
type: "title4"
}, label), /*#__PURE__*/React.createElement(_Stack.default, {
inline: true,
grow: false,
align: "center",
spacing: "small"
}, /*#__PURE__*/React.createElement(StyledActionsWrapper, {
onClick: ev => {
ev.stopPropagation();
}
}, actions), /*#__PURE__*/React.createElement(_ButtonLink.default, {
iconLeft: /*#__PURE__*/React.createElement(AnimatedIcon, {
color: "secondary",
expanded: expanded
}),
size: "small",
type: "secondary",
ariaLabelledby: labelID,
ariaExpanded: expanded,
ariaControls: slideID
})))), /*#__PURE__*/React.createElement(_Slide.default, {
maxHeight: height,
expanded: expanded,
id: slideID,
ariaLabelledBy: labelID
}, /*#__PURE__*/React.createElement(StyledCollapseChildren, {
ref: node
}, children)));
};
var _default = Collapse;
exports.default = _default;