index.tsx 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import React from 'react';
  2. import cls from 'classnames';
  3. import { cssClasses, strings } from '@douyinfe/semi-foundation/floatButton/constants';
  4. import '@douyinfe/semi-foundation/floatButton/floatButton.scss';
  5. import { IconSearchStroked, IconHelpCircleStroked } from '@douyinfe/semi-icons';
  6. const iconImgs = {
  7. default: {
  8. small: 'https://cdn-tos-cn.bytedance.net/obj/ies-semi/images/mcvcjc2y-ytad407.svg',
  9. medium: 'https://cdn-tos-cn.bytedance.net/obj/ies-semi/images/mcvcjc2y-hfkzeke.svg',
  10. large: 'https://cdn-tos-cn.bytedance.net/obj/ies-semi/images/mcvcjc2y-y4y9tsx.svg',
  11. },
  12. disabled: {
  13. small: 'https://cdn-tos-cn.bytedance.net/obj/ies-semi/images/mcvrr4gn-9vdet0m.svg',
  14. medium: 'https://cdn-tos-cn.bytedance.net/obj/ies-semi/images/mcvcjc2y-bm6q1vr.svg',
  15. large: 'https://cdn-tos-cn.bytedance.net/obj/ies-semi/images/mcvcjc2y-7un8des.svg',
  16. },
  17. };
  18. const badgeContents = {
  19. small: '3',
  20. large: '99+',
  21. };
  22. function FloatButton({ type = 'default', status = 'normal', size = 'medium', showRectangle = false, showBadge = false, badgeContent = '', group = false, groupItems = [] }) {
  23. const iconCls = cls(cssClasses.ICON_BTN,
  24. `${cssClasses.ICON_BTN}-${size}`,
  25. `${cssClasses.ICON_BTN}-${type}`,
  26. {
  27. [`${cssClasses.ICON_BTN}-disabled`]: status === 'disabled',
  28. }
  29. );
  30. const imgCls = cls(cssClasses.ICON_IMG, `${cssClasses.ICON_IMG}-${size}`);
  31. // 单枚浮动按钮
  32. if (!group) {
  33. return (
  34. <span className={cssClasses.PREFIX}>
  35. <span className={iconCls}>
  36. <img src={iconImgs[type][size]} className={imgCls} alt='' />
  37. {showRectangle ? (
  38. <span className={cls(cssClasses.RECTANGLE, `${cssClasses.RECTANGLE}-${size}`)} />
  39. ) : null}
  40. {showBadge ? (
  41. <span className={cssClasses.BADGE}>{badgeContent}</span>
  42. ) : null}
  43. </span>
  44. </span>
  45. );
  46. }
  47. // 按钮组
  48. return (
  49. <span className={cls(cssClasses.PREFIX, cssClasses.GROUP)}>
  50. {groupItems.map((item, idx) => {
  51. const iconBtnCls = cls(cssClasses.GROUP_ITEM, {
  52. [`${cssClasses.ICON_BTN}-disabled`]: item.status === 'disabled',
  53. });
  54. return (
  55. <span className={iconBtnCls} key={idx}>
  56. {item.iconType === 'img' ? (
  57. <img src={iconImgs[item.status][item.size]} className={cls(cssClasses.ICON_IMG, `${cssClasses.ICON_IMG}-${item.size}`)} alt='' />
  58. ) : item.iconType === 'search' ? (
  59. <IconSearchStroked className='semi-icons-search' />
  60. ) : (
  61. <IconHelpCircleStroked className='semi-icons-help' />
  62. )}
  63. <span className={`${cssClasses.GROUP_ITEM}-text`}>{item.label}</span>
  64. {item.showRectangle ? (
  65. <span className={cls(cssClasses.RECTANGLE, `${cssClasses.RECTANGLE}-group`)} />
  66. ) : null}
  67. {item.showBadge ? (
  68. <span className={cssClasses.BADGE}>{item.badgeContent}</span>
  69. ) : null}
  70. </span>
  71. );
  72. })}
  73. </span>
  74. );
  75. }
  76. export default FloatButton;