import React, { useState, useMemo, useRef, useEffect } from 'react'; import type { BoxProps } from '@chakra-ui/react'; import { Box, Card, Flex, useOutsideClick, Button } from '@chakra-ui/react'; import { addDays, format } from 'date-fns'; import { DayPicker } from 'react-day-picker'; import 'react-day-picker/dist/style.css'; import zhCN from 'date-fns/locale/zh-CN'; import { useTranslation } from 'next-i18next'; import MyIcon from '../Icon'; export type DateRangeType = { from: Date; to: Date; }; const DateRangePicker = ({ onChange, onSuccess, popPosition = 'bottom', defaultDate = { from: addDays(new Date(), -30), to: new Date() }, dateRange, formLabel, ...props }: { onChange?: (date: DateRangeType) => void; onSuccess?: (date: DateRangeType) => void; popPosition?: 'bottom' | 'top'; defaultDate?: DateRangeType; dateRange?: DateRangeType; formLabel?: string; } & BoxProps) => { const { t } = useTranslation(); const OutRangeRef = useRef(null); const [range, setRange] = useState(defaultDate); const [showSelected, setShowSelected] = useState(false); useEffect(() => { if (dateRange) { setRange(dateRange); } }, [dateRange]); const formatSelected = useMemo(() => { if (range?.from && range.to) { return `${format(range.from, 'y/MM/dd')} - ${format(range.to, 'y/MM/dd')}`; } return `${format(new Date(), 'y/MM/dd')} - ${format(new Date(), 'y/MM/dd')}`; }, [range]); useOutsideClick({ ref: OutRangeRef, handler: () => { setShowSelected(false); } }); return ( setShowSelected(true)} alignItems={'center'} {...props} > {formLabel && ( <> {formLabel} )} {formatSelected} {!formLabel && } {showSelected && ( { let typeDate = date as DateRangeType; if (!typeDate || typeDate?.from === undefined) { typeDate = { from: range?.from, to: range?.from }; } if (typeDate?.to === undefined) { typeDate.to = typeDate.from; } if (typeDate?.from) { typeDate.from = new Date(typeDate.from.setHours(0, 0, 0, 0)); } if (typeDate?.to) { typeDate.to = new Date(typeDate.to.setHours(23, 59, 59, 999)); } setRange(typeDate); onChange?.(typeDate); }} footer={ } /> )} ); }; export default DateRangePicker;