import React, { useState, useMemo, useRef } from 'react'; import { Box, Card, Flex, useTheme, useOutsideClick, Button } from '@chakra-ui/react'; import { addDays, format } from 'date-fns'; import { type DateRange, 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'; const DateRangePicker = ({ onChange, onSuccess, position = 'bottom', defaultDate = { from: addDays(new Date(), -30), to: new Date() } }: { onChange?: (date: DateRange) => void; onSuccess?: (date: DateRange) => void; position?: 'bottom' | 'top'; defaultDate?: DateRange; }) => { const { t } = useTranslation(); const theme = useTheme(); const OutRangeRef = useRef(null); const [range, setRange] = useState(defaultDate); const [showSelected, setShowSelected] = useState(false); 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)} > {formatSelected} {showSelected && ( { if (date?.from === undefined) { date = { from: range?.from, to: range?.from }; } if (date?.to === undefined) { date.to = date.from; } setRange(date); onChange && onChange(date); }} footer={ } /> )} ); }; export default DateRangePicker; export type DateRangeType = DateRange;