buttonGroup.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import React from 'react';
  2. import BaseComponent, { BaseProps } from '../_base/baseComponent';
  3. import PropTypes from 'prop-types';
  4. import { cssClasses, strings } from '@douyinfe/semi-foundation/button/constants';
  5. import { Type, Size } from './Button';
  6. import '@douyinfe/semi-foundation/button/button.scss';
  7. export type Theme = 'solid' | 'borderless' | 'light';
  8. export interface ButtonGroupProps extends BaseProps {
  9. disabled?: boolean;
  10. type?: Type;
  11. size?: Size;
  12. theme?: Theme;
  13. }
  14. const prefixCls = cssClasses.PREFIX;
  15. const btnSizes = strings.sizes;
  16. export default class ButtonGroup extends BaseComponent<ButtonGroupProps> {
  17. static propTypes = {
  18. children: PropTypes.node,
  19. disabled: PropTypes.bool,
  20. type: PropTypes.string,
  21. size: PropTypes.oneOf(btnSizes),
  22. theme: PropTypes.oneOf(strings.themes),
  23. };
  24. static defaultProps = {
  25. size: 'default',
  26. type: 'primary',
  27. theme: 'light',
  28. };
  29. render() {
  30. const { children, disabled, size, type, ...rest } = this.props;
  31. let inner;
  32. if (children) {
  33. inner = ((Array.isArray(children) ? children : [children]) as React.ReactElement[]).map((itm, index) =>
  34. React.cloneElement(itm, { disabled, size, type, ...itm.props, ...rest, key: index })
  35. );
  36. }
  37. return <div className={`${prefixCls}-group`}>{inner}</div>;
  38. }
  39. }