"use client"; import { useEffect, useId, useState } from "react"; interface DateRangePickerProps { minDate: string; maxDate: string; onDateRangeChange: (startDate: string, endDate: string) => void; initialStartDate?: string; initialEndDate?: string; } export default function DateRangePicker({ minDate, maxDate, onDateRangeChange, initialStartDate, initialEndDate, }: DateRangePickerProps) { const startDateId = useId(); const endDateId = useId(); const [startDate, setStartDate] = useState(initialStartDate || minDate); const [endDate, setEndDate] = useState(initialEndDate || maxDate); useEffect(() => { // Only notify parent component when dates change, not when the callback changes onDateRangeChange(startDate, endDate); }, [startDate, endDate]); const handleStartDateChange = (newStartDate: string) => { // Ensure start date is not before min date if (newStartDate < minDate) { setStartDate(minDate); return; } // Ensure start date is not after end date if (newStartDate > endDate) { setEndDate(newStartDate); } setStartDate(newStartDate); }; const handleEndDateChange = (newEndDate: string) => { // Ensure end date is not after max date if (newEndDate > maxDate) { setEndDate(maxDate); return; } // Ensure end date is not before start date if (newEndDate < startDate) { setStartDate(newEndDate); } setEndDate(newEndDate); }; const resetToFullRange = () => { setStartDate(minDate); setEndDate(maxDate); }; const setLast30Days = () => { const thirtyDaysAgo = new Date(); thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); const thirtyDaysAgoStr = thirtyDaysAgo.toISOString().split("T")[0]; // Use the later of 30 days ago or minDate const newStartDate = thirtyDaysAgoStr > minDate ? thirtyDaysAgoStr : minDate; setStartDate(newStartDate); setEndDate(maxDate); }; const setLast7Days = () => { const sevenDaysAgo = new Date(); sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); const sevenDaysAgoStr = sevenDaysAgo.toISOString().split("T")[0]; // Use the later of 7 days ago or minDate const newStartDate = sevenDaysAgoStr > minDate ? sevenDaysAgoStr : minDate; setStartDate(newStartDate); setEndDate(maxDate); }; return (
Date Range:
handleStartDateChange(e.target.value)} className="px-3 py-1.5 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-sky-500 focus:border-sky-500" />
handleEndDateChange(e.target.value)} className="px-3 py-1.5 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-sky-500 focus:border-sky-500" />
Available data: {new Date(minDate).toLocaleDateString()} -{" "} {new Date(maxDate).toLocaleDateString()}
); }