"use client"; import { useState, useEffect, useRef, memo } from "react"; interface DateRangePickerProps { minDate: string; maxDate: string; onDateRangeChange: (startDate: string, endDate: string) => void; initialStartDate?: string; initialEndDate?: string; } function DateRangePicker({ minDate, maxDate, onDateRangeChange, initialStartDate, initialEndDate, }: DateRangePickerProps) { const [startDate, setStartDate] = useState(initialStartDate || minDate); const [endDate, setEndDate] = useState(initialEndDate || maxDate); const isInitializedRef = useRef(false); useEffect(() => { // Update local state when props change (e.g., when date range is loaded from API) if (initialStartDate && initialStartDate !== startDate) { setStartDate(initialStartDate); } if (initialEndDate && initialEndDate !== endDate) { setEndDate(initialEndDate); } }, [initialStartDate, initialEndDate]); useEffect(() => { // Only notify parent component after initial render and when dates actually change // This prevents the infinite loop by not including onDateRangeChange in dependencies if (isInitializedRef.current) { onDateRangeChange(startDate, endDate); } else { isInitializedRef.current = true; } }, [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 (