floatButtonGroup.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React from 'react';
  2. import { cssClassesGroup, strings } from '@douyinfe/semi-foundation/floatButton/constants';
  3. import '@douyinfe/semi-foundation/floatButton/floatButton.scss';
  4. import BaseComponent from '../_base/baseComponent';
  5. import { ArrayElement } from '../_base/base';
  6. import Badge, { BadgeProps } from '../badge';
  7. import cls from 'classnames';
  8. import { FloatButtonProps } from './interface';
  9. const prefixCls = cssClassesGroup.PREFIX;
  10. export interface FloatButtonGroupItem extends FloatButtonProps {
  11. value?: string;
  12. content?: string | React.ReactNode
  13. }
  14. export interface FloatButtonGroupProps {
  15. disabled?: boolean;
  16. items: FloatButtonGroupItem[];
  17. className?: string;
  18. style?: React.CSSProperties;
  19. children?: React.ReactNode;
  20. onClick?: (value: string, e: React.MouseEvent) => void
  21. }
  22. interface FloatButtonGroupState {
  23. }
  24. export default class FloatButtonGroup extends BaseComponent<FloatButtonGroupProps, FloatButtonGroupState> {
  25. static defaultProps = {
  26. shape: 'round',
  27. type: 'default',
  28. size: 'medium',
  29. };
  30. constructor(props: FloatButtonGroupProps) {
  31. super(props);
  32. }
  33. handleClick = (e) => {
  34. const value = e.target.dataset.value;
  35. this.props.onClick?.(value, e);
  36. }
  37. render(): JSX.Element {
  38. const { className, style, disabled, items } = this.props;
  39. return (
  40. <div
  41. className={cls(prefixCls, className, {
  42. [`${prefixCls}-disabled`]: disabled,
  43. })}
  44. style={style}
  45. onClick={this.handleClick}
  46. >
  47. {items.map((item, index) => {
  48. if (item.badge) {
  49. return (
  50. <Badge key={index} {...item.badge}>
  51. <div className={cls(`${prefixCls}-item`)} data-value={item.value}>
  52. {item.icon}
  53. {item.content}
  54. </div>
  55. </Badge>
  56. );
  57. }
  58. return (
  59. <div
  60. key={index}
  61. className={cls(`${prefixCls}-item`)}
  62. data-value={item.value}
  63. >
  64. {item.icon}
  65. {item.content}
  66. </div>
  67. );}
  68. )}
  69. </div>
  70. );
  71. }
  72. }