item.tsx 2.2 KB

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