1
0

item.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React, { PureComponent } from 'react';
  2. import cls from 'classnames';
  3. import { noop } from 'lodash';
  4. import PropTypes from 'prop-types';
  5. import { cssClasses, strings } from '@douyinfe/semi-foundation/timeline/constants';
  6. import '@douyinfe/semi-foundation/timeline/timeline.scss';
  7. export interface TimelineItemProps {
  8. color?: string;
  9. children?: React.ReactNode;
  10. time?: React.ReactNode;
  11. type?: 'default' | 'ongoing' | 'success' | 'warning' | 'error';
  12. dot?: React.ReactNode;
  13. extra?: React.ReactNode;
  14. position?: 'left' | 'right';
  15. className?: string;
  16. style?: React.CSSProperties;
  17. onClick?: React.MouseEventHandler<HTMLLIElement>;
  18. }
  19. const prefixCls = cssClasses.ITEM;
  20. export default class Item extends PureComponent<TimelineItemProps> {
  21. static propTypes = {
  22. color: PropTypes.string,
  23. time: PropTypes.node,
  24. type: PropTypes.oneOf(strings.ITEM_TYPE),
  25. dot: PropTypes.node,
  26. extra: PropTypes.node,
  27. position: PropTypes.oneOf(strings.ITEM_POS),
  28. className: PropTypes.string,
  29. style: PropTypes.object,
  30. onClick: PropTypes.func,
  31. };
  32. static defaultProps = {
  33. type: 'default',
  34. time: '',
  35. onClick: noop,
  36. };
  37. render() {
  38. const {
  39. className,
  40. color,
  41. children,
  42. dot,
  43. type,
  44. style,
  45. time,
  46. extra,
  47. onClick,
  48. } = this.props;
  49. const itemCls = cls(prefixCls,
  50. className
  51. );
  52. const dotCls = cls({
  53. [`${prefixCls}-head`]: true,
  54. [`${prefixCls}-head-custom`]: dot,
  55. [`${prefixCls}-head-${type}`]: type,
  56. });
  57. const dotStyle = color ? { style: { backgroundColor: color } } : null;
  58. return (
  59. <li className={itemCls} style={style} onClick={onClick}>
  60. <div className={`${prefixCls}-tail`} aria-hidden />
  61. <div
  62. className={dotCls}
  63. aria-hidden
  64. {...dotStyle}
  65. >
  66. {dot}
  67. </div>
  68. <div className={`${prefixCls}-content`}>
  69. {children}
  70. {extra && <div className={`${prefixCls}-content-extra`}>{extra}</div>}
  71. {time && <div className={`${prefixCls}-content-time`}>{time}</div>}
  72. </div>
  73. </li>
  74. );
  75. }
  76. }