UNPKG

pagamio-frontend-commons-lib

Version:

Pagamio library for Frontend reusable components like the form engine and table container

69 lines (68 loc) 2.6 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { addDays, endOfDay, startOfDay } from 'date-fns'; import { DateRangePicker } from 'react-date-range'; import 'react-date-range/dist/styles.css'; // main style file import 'react-date-range/dist/theme/default.css'; import { useEffect, useState } from 'react'; import { cn } from '../../helpers'; /** * A flexible date range picker component using react-date-range * * @see For more customization options, refer to: * - https://hypeserver.github.io/react-date-range/ * - https://www.npmjs.com/package/react-date-range * * @example * ```tsx * const [selectedRange, setSelectedRange] = useState({ * startDate: startOfDay(new Date()), * endDate: endOfDay(addDays(new Date(), 3)), * }); * * return ( * <RangeDatePicker * dateRange={selectedRange} * onChange={setSelectedRange} * showPreview={true} * /> * ) * ``` */ const RangeDatePicker = ({ dateRange, onChange, minDate, maxDate, className, months = 2, direction = 'horizontal', showPreview = true, rangeKey = 'selection', }) => { // Default range: today to 7 days from now const defaultRange = { startDate: startOfDay(new Date()), endDate: endOfDay(addDays(new Date(), 7)), key: rangeKey, }; const [range, setRange] = useState(dateRange ?? defaultRange); // Update internal state when dateRange prop changes useEffect(() => { if (dateRange) { setRange({ ...dateRange, key: rangeKey, }); } }, [dateRange, rangeKey]); // Handle date range changes const handleRangeChange = (rangesByKey) => { const newRange = rangesByKey[rangeKey]; if (newRange?.startDate) { // Ensure start/end of day applied appropriately const updatedRange = { startDate: startOfDay(newRange.startDate), endDate: endOfDay(newRange.endDate ?? newRange.startDate), key: rangeKey, }; setRange(updatedRange); // Notify parent component if onChange is provided if (onChange) { onChange(updatedRange); } } }; return (_jsx("div", { className: cn('range-date-picker', className), children: _jsx(DateRangePicker, { ranges: [range], onChange: handleRangeChange, moveRangeOnFirstSelection: false, months: months, direction: direction, showPreview: showPreview, showDateDisplay: true, minDate: minDate, maxDate: maxDate, rangeColors: ['#b45dae'] }) })); }; export default RangeDatePicker;