1
0

timeCol.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import React, { PureComponent } from 'react';
  2. import cls from 'classnames';
  3. import PropTypes from 'prop-types';
  4. import LocaleConsumer from '../locale/localeConsumer';
  5. import localeContext from '../locale/context';
  6. import { cssClasses } from '@douyinfe/semi-foundation/calendar/constants';
  7. import '@douyinfe/semi-foundation/calendar/calendar.scss';
  8. import { TimeColProps } from './interface';
  9. import { Locale } from '../locale/interface';
  10. const prefixCls = `${cssClasses.PREFIX}-time`;
  11. export default class timeCol extends PureComponent<TimeColProps> {
  12. static propTypes = {
  13. className: PropTypes.string,
  14. renderTimeDisplay: PropTypes.func,
  15. };
  16. static contextType = localeContext;
  17. formatTime(item: number) {
  18. const { renderTimeDisplay } = this.props;
  19. if (typeof renderTimeDisplay === 'function') {
  20. return renderTimeDisplay(item);
  21. } else {
  22. const replaceTime = (template: string, time: number) => template.replace('${time}', String(time));
  23. return (
  24. <LocaleConsumer componentName="Calendar" key={`locale-${item}`}>
  25. {(locale: Locale['Calendar']) => {
  26. let time = item < 12 ? replaceTime(locale.AM, item) : replaceTime(locale.PM, item - 12);
  27. if (item === 12) {
  28. time = replaceTime(locale.PM, item);
  29. }
  30. return time;
  31. }}
  32. </LocaleConsumer>
  33. );
  34. }
  35. }
  36. renderTime() {
  37. const { className } = this.props;
  38. const wrapperCls = cls(className, `${prefixCls}`);
  39. const list = [...Array(24).keys()].map(item => this.formatTime(item));
  40. list.splice(0, 1, '');
  41. const inner = list.map((item, index) => (
  42. <li key={`time-${index}`} className={`${prefixCls}-item`}>
  43. <span>{item}</span>
  44. </li>
  45. ));
  46. return (
  47. <div className={wrapperCls}>
  48. <ul className={`${prefixCls}-items`}>
  49. {inner}
  50. </ul>
  51. </div>
  52. );
  53. }
  54. render() {
  55. const time = this.renderTime();
  56. return time;
  57. }
  58. }