UNPKG

@smart-react-components/ui

Version:
90 lines (89 loc) 6.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Div_1 = __importDefault(require("@smart-react-components/core/Element/Div")); const element_props_1 = __importDefault(require("@smart-react-components/core/element-props")); const click_events_1 = __importDefault(require("@smart-react-components/core/element-props/click-events")); const intrinsic_styled_core_props_1 = __importDefault(require("@smart-react-components/core/element-props/intrinsic-styled-core-props")); const useChangeEffect_1 = __importDefault(require("@smart-react-components/core/hooks/useChangeEffect")); const react_1 = __importDefault(require("react")); const styled_components_1 = require("styled-components"); const ButtonAddon_1 = __importDefault(require("./ButtonAddon")); const ButtonLoading_1 = __importDefault(require("./ButtonLoading")); const ButtonElement_1 = __importDefault(require("../components/Button/ButtonElement")); const ButtonContent_1 = __importDefault(require("../components/Button/ButtonContent")); const useAddons_1 = __importDefault(require("../hooks/useAddons")); const wave_effect_1 = require("../util/wave-effect"); const WaveEffect_1 = __importDefault(require("../WaveEffect")); const Button = react_1.default.forwardRef((props, forwardRef) => { var _a, _b, _c, _d, _e, _f; const theme = react_1.default.useContext(styled_components_1.ThemeContext); const { leftAddon, rightAddon } = (0, useAddons_1.default)({ Component: ButtonAddon_1.default, leftAddon: props.leftAddon, rightAddon: props.rightAddon, props: { hasHover: props.hasHover, hasWaveEffect: props.hasWaveEffect, isOutline: props.isOutline, isSoft: props.isSoft, palette: props.palette, shape: props.shape, size: props.size, sizeSm: props.sizeSm, sizeMd: props.sizeMd, sizeLg: props.sizeLg, sizeXl: props.sizeXl, waveEffectPalette: props.waveEffectPalette, }, }); const waveEffectPalette = react_1.default.useMemo(() => (0, wave_effect_1.getWaveEffectPalette)(props, theme.$.vars.isDarkMode), [props.palette, props.isOutline, props.isSoft, props.isLink, props.waveEffectPalette, theme.$.vars.isDarkMode]); const getLoadingEl = () => { var _a; if (!props.loading) { return null; } const loadingProps = { isOutline: props.isOutline, isSoft: props.isSoft, palette: props.palette, status: props.isLoading, }; if (((_a = props.loading.type) === null || _a === void 0 ? void 0 : _a.displayName) === 'SRCLoading') { return react_1.default.cloneElement(props.loading, loadingProps); } return react_1.default.createElement(ButtonLoading_1.default, Object.assign({}, loadingProps), props.loading); }; const [loadingEl, setLoadingEl] = react_1.default.useState(() => getLoadingEl()); (0, useChangeEffect_1.default)(() => { setLoadingEl(getLoadingEl()); }, [props.loading, props.isLoading]); const applyIntrinsicStyledCoreProps = () => (Object.assign(Object.assign({}, (0, element_props_1.default)(props, [intrinsic_styled_core_props_1.default])), (props.hasSpace && Object.assign(Object.assign(Object.assign(Object.assign({ margin: `$size.button.${props.size}.margin.y $size.button.${props.size}.margin.x` }, (props.sizeSm && { marginSm: `$size.button.${props.sizeSm}.margin.y $size.button.${props.sizeSm}.margin.x` })), (props.sizeMd && { marginMd: `$size.button.${props.sizeMd}.margin.y $size.button.${props.sizeMd}.margin.x` })), (props.sizeLg && { marginLg: `$size.button.${props.sizeLg}.margin.y $size.button.${props.sizeLg}.margin.x` })), (props.sizeXl && { marginXl: `$size.button.${props.sizeXl}.margin.y $size.button.${props.sizeXl}.margin.x` }))))); const hasButtonContainer = ((_a = leftAddon === null || leftAddon === void 0 ? void 0 : leftAddon.props) === null || _a === void 0 ? void 0 : _a.isSeparated) || ((_b = rightAddon === null || rightAddon === void 0 ? void 0 : rightAddon.props) === null || _b === void 0 ? void 0 : _b.isSeparated); let Element = (react_1.default.createElement(ButtonElement_1.default, Object.assign({}, props.elementProps, ((!props.isDisabled && !props.isLoading) && (0, element_props_1.default)(props, [click_events_1.default])), (!hasButtonContainer && applyIntrinsicStyledCoreProps()), (props.as && { as: props.as }), { buttonSize: props.size, buttonSizeSm: props.sizeSm, buttonSizeMd: props.sizeMd, buttonSizeLg: props.sizeLg, buttonSizeXl: props.sizeXl, hasButtonContainer: hasButtonContainer, hasHover: props.hasHover, hasLeftAddon: !!leftAddon, hasRightAddon: !!rightAddon, hasSeparatedLeftAddon: !!((_c = leftAddon === null || leftAddon === void 0 ? void 0 : leftAddon.props) === null || _c === void 0 ? void 0 : _c.isSeparated), hasSeparatedRightAddon: !!((_d = rightAddon === null || rightAddon === void 0 ? void 0 : rightAddon.props) === null || _d === void 0 ? void 0 : _d.isSeparated), isActive: props.isActive, isBlock: props.isBlock, isDisabled: props.isDisabled, isFixedSize: props.isFixedSize, isLink: props.isLink, isLoading: props.isLoading, isSoft: props.isSoft, isOutline: props.isOutline, palette: props.palette, ref: forwardRef, shape: props.shape, type: props.type }), loadingEl && loadingEl, (leftAddon && !leftAddon.props.isSeparated) && leftAddon, react_1.default.createElement(ButtonContent_1.default, null, props.children), (rightAddon && !rightAddon.props.isSeparated) && rightAddon)); if (props.hasWaveEffect) { Element = react_1.default.createElement(WaveEffect_1.default, { palette: waveEffectPalette }, Element); } if (hasButtonContainer) { Element = (react_1.default.createElement(Div_1.default, Object.assign({}, applyIntrinsicStyledCoreProps(), { display: props.isBlock ? 'flex' : 'inline-flex' }), ((_e = leftAddon === null || leftAddon === void 0 ? void 0 : leftAddon.props) === null || _e === void 0 ? void 0 : _e.isSeparated) && leftAddon, Element, ((_f = rightAddon === null || rightAddon === void 0 ? void 0 : rightAddon.props) === null || _f === void 0 ? void 0 : _f.isSeparated) && rightAddon)); } return Element; }); Button.defaultProps = { elementProps: {}, hasHover: true, hasWaveEffect: true, palette: 'primary', shape: 'rectangle', size: 'medium', }; exports.default = Button;