timePicker.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import type { DatePickerProps } from 'antd';
  2. import { DatePicker, Radio } from 'antd';
  3. import moment from 'moment';
  4. import { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
  5. export enum TimeKey {
  6. 'today' = 'today',
  7. 'week' = 'week',
  8. 'month' = 'month',
  9. 'year' = 'year',
  10. }
  11. export type TimeType = keyof typeof TimeKey;
  12. type ValueType = { start: number; end: number; type: TimeType };
  13. interface ExtraTimePickerProps extends Omit<DatePickerProps, 'onChange' | 'value'> {
  14. onChange?: (data: ValueType) => void;
  15. value?: ValueType;
  16. defaultTime?: TimeType;
  17. pickerTimeChange?: () => void;
  18. showTime?: boolean;
  19. showTimeTool?: boolean;
  20. }
  21. export const getTimeByType = (type: TimeType) => {
  22. switch (type) {
  23. case TimeKey.week:
  24. return moment().subtract(6, 'days').valueOf();
  25. case TimeKey.month:
  26. return moment().subtract(29, 'days').valueOf();
  27. case TimeKey.year:
  28. return moment().subtract(365, 'days').valueOf();
  29. default:
  30. return moment().startOf('day').valueOf();
  31. }
  32. };
  33. export default forwardRef((props: ExtraTimePickerProps, ref) => {
  34. const [radioValue, setRadioValue] = useState<TimeType | undefined>(undefined);
  35. const { value, onChange, ...extraProps } = props;
  36. const change = (startTime: number, endTime: number, type: TimeType) => {
  37. if (onChange) {
  38. onChange({
  39. start: startTime,
  40. end: endTime,
  41. type,
  42. });
  43. }
  44. };
  45. const timeChange = (type: TimeType) => {
  46. const endTime = moment(new Date()).valueOf();
  47. const startTime: number = getTimeByType(type);
  48. setRadioValue(type);
  49. change(startTime, endTime, type);
  50. };
  51. useImperativeHandle(ref, () => ({
  52. timeChange,
  53. }));
  54. useEffect(() => {
  55. timeChange(props.defaultTime || TimeKey.today);
  56. }, []);
  57. return (
  58. <>
  59. {
  60. // @ts-ignore
  61. <DatePicker.RangePicker
  62. {...extraProps}
  63. allowClear={false}
  64. showTime={props.showTime}
  65. value={
  66. value && [
  67. moment(value && value.start ? value.start : new Date()),
  68. moment(value && value.end ? value.end : new Date()),
  69. ]
  70. }
  71. onChange={(rangeValue) => {
  72. setRadioValue(undefined);
  73. if (rangeValue && rangeValue.length === 2) {
  74. change(rangeValue[0]!.valueOf(), rangeValue[1]!.valueOf(), radioValue!);
  75. }
  76. if (props.pickerTimeChange) {
  77. props.pickerTimeChange();
  78. }
  79. }}
  80. renderExtraFooter={
  81. props.showTimeTool !== true
  82. ? () => (
  83. <div style={{ padding: '12px 0' }}>
  84. <Radio.Group
  85. defaultValue="day"
  86. buttonStyle="solid"
  87. value={radioValue}
  88. onChange={(e) => {
  89. timeChange(e.target.value);
  90. }}
  91. >
  92. <Radio.Button value={TimeKey.today}>当天</Radio.Button>
  93. <Radio.Button value={TimeKey.week}>近一周</Radio.Button>
  94. <Radio.Button value={TimeKey.month}>近一月</Radio.Button>
  95. <Radio.Button value={TimeKey.year}>近一年</Radio.Button>
  96. </Radio.Group>
  97. </div>
  98. )
  99. : undefined
  100. }
  101. />
  102. }
  103. </>
  104. );
  105. });