@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.
114 lines (94 loc) • 3.8 kB
JavaScript
;
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 = _interopRequireDefault(require("styled-components"));
var _Heading = _interopRequireDefault(require("../Heading"));
var _Stack = _interopRequireDefault(require("../Stack"));
var _consts = require("./consts");
var _Feedback = _interopRequireWildcard(require("./components/Feedback"));
var _defaultTheme = _interopRequireDefault(require("../defaultTheme"));
var _FilterWrapper = _interopRequireDefault(require("./components/FilterWrapper"));
var _useRandomId = _interopRequireDefault(require("../hooks/useRandomId"));
var _useTheme = _interopRequireDefault(require("../hooks/useTheme"));
const getHeadingSize = size => {
const SIZES = {
[_consts.LABEL_SIZES.NORMAL]: "title3",
[_consts.LABEL_SIZES.LARGE]: "title2"
};
return SIZES[size];
};
const StyledChoiceGroup = _styledComponents.default.div.withConfig({
displayName: "ChoiceGroup__StyledChoiceGroup",
componentId: "sc-yx4edo-0"
})(["width:100%;display:flex;flex-direction:column;", "{position:relative;margin-top:", ";top:initial;}"], _Feedback.StyledFormFeedback, ({
theme
}) => theme.orbit.spaceXSmall); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
StyledChoiceGroup.defaultProps = {
theme: _defaultTheme.default
};
const ChoiceGroup = /*#__PURE__*/React.forwardRef(({
dataTest,
label,
labelSize = _consts.LABEL_SIZES.NORMAL,
labelAs = _consts.LABEL_ELEMENTS.H4,
error,
children,
filter,
onOnlySelection,
onlySelectionText,
onChange
}, ref) => {
const groupID = (0, _useRandomId.default)();
const theme = (0, _useTheme.default)();
const handleChange = ev => {
ev.persist();
if (onChange) {
onChange(ev);
}
};
const itemProps = {
onChange: handleChange,
hasError: Boolean(error)
};
return /*#__PURE__*/React.createElement(StyledChoiceGroup, {
ref: ref,
"data-test": dataTest,
role: "group",
"aria-labelledby": groupID
}, label && /*#__PURE__*/React.createElement(_Heading.default, {
id: groupID,
type: getHeadingSize(labelSize),
as: labelAs,
spaceAfter: "medium"
}, label), typeof children === "function" ? children({
// for now a plain <div> is all we need, but we're reserving this space in the API
// in case we'll need something more in the future
Container: "div",
Item: ({
children: itemChildren
}) => {
return !filter ? /*#__PURE__*/React.cloneElement(React.Children.only(itemChildren), itemProps) : /*#__PURE__*/React.createElement(_FilterWrapper.default, {
child: React.Children.only(itemChildren),
onOnlySelection: onOnlySelection,
onlySelectionText: onlySelectionText
}, /*#__PURE__*/React.cloneElement(React.Children.only(itemChildren), itemProps));
},
spacing: filter ? "0px" : theme.orbit.spaceXSmall
}) : /*#__PURE__*/React.createElement(_Stack.default, {
direction: "column",
spacing: filter ? "none" : "XSmall"
}, React.Children.map(children, child => {
return !filter ? /*#__PURE__*/React.cloneElement(child, itemProps) : /*#__PURE__*/React.createElement(_FilterWrapper.default, {
child: child,
onOnlySelection: onOnlySelection,
onlySelectionText: onlySelectionText
}, /*#__PURE__*/React.cloneElement(child, itemProps));
})), error && /*#__PURE__*/React.createElement(_Feedback.default, null, error));
});
var _default = ChoiceGroup;
exports.default = _default;