fix: enhance date range calculations and optimize date range change handling

This commit is contained in:
Max Kowalski
2025-06-28 00:39:35 +02:00
parent 5b22c0f1f8
commit c4cfe2f389
3 changed files with 50 additions and 17 deletions

View File

@ -91,13 +91,24 @@ export async function GET(request: NextRequest) {
const metrics = sessionMetrics(chatSessions, companyConfigForMetrics); const metrics = sessionMetrics(chatSessions, companyConfigForMetrics);
// Calculate date range from sessions // Calculate date range from ALL sessions (not filtered) to get the full available range
let dateRange: { minDate: string; maxDate: string } | null = null; let dateRange: { minDate: string; maxDate: string } | null = null;
if (prismaSessions.length > 0) { const allSessions = await prisma.session.findMany({
const dates = prismaSessions.map(s => new Date(s.startTime)).sort((a, b) => a.getTime() - b.getTime()); where: {
companyId: user.companyId,
},
select: {
startTime: true,
},
orderBy: {
startTime: 'asc',
},
});
if (allSessions.length > 0) {
dateRange = { dateRange = {
minDate: dates[0].toISOString().split('T')[0], // First session date minDate: allSessions[0].startTime.toISOString().split('T')[0], // First session date
maxDate: dates[dates.length - 1].toISOString().split('T')[0] // Last session date maxDate: allSessions[allSessions.length - 1].startTime.toISOString().split('T')[0] // Last session date
}; };
} }

View File

@ -84,12 +84,15 @@ function DashboardContent() {
} }
}; };
// Handle date range changes // Handle date range changes with proper memoization
const handleDateRangeChange = useCallback((startDate: string, endDate: string) => { const handleDateRangeChange = useCallback((startDate: string, endDate: string) => {
setSelectedStartDate(startDate); // Only update if dates actually changed to prevent unnecessary API calls
setSelectedEndDate(endDate); if (startDate !== selectedStartDate || endDate !== selectedEndDate) {
fetchMetrics(startDate, endDate); setSelectedStartDate(startDate);
}, []); setSelectedEndDate(endDate);
fetchMetrics(startDate, endDate);
}
}, [selectedStartDate, selectedEndDate]);
useEffect(() => { useEffect(() => {
// Redirect if not authenticated // Redirect if not authenticated
@ -329,8 +332,8 @@ function DashboardContent() {
</CardHeader> </CardHeader>
</Card> </Card>
{/* Date Range Picker - Temporarily disabled to debug infinite loop */} {/* Date Range Picker */}
{/* {dateRange && ( {dateRange && (
<DateRangePicker <DateRangePicker
minDate={dateRange.minDate} minDate={dateRange.minDate}
maxDate={dateRange.maxDate} maxDate={dateRange.maxDate}
@ -338,7 +341,7 @@ function DashboardContent() {
initialStartDate={selectedStartDate} initialStartDate={selectedStartDate}
initialEndDate={selectedEndDate} initialEndDate={selectedEndDate}
/> />
)} */} )}
{/* Modern Metrics Grid */} {/* Modern Metrics Grid */}
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6"> <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">

View File

@ -1,6 +1,6 @@
"use client"; "use client";
import { useState, useEffect } from "react"; import { useState, useEffect, useRef, memo } from "react";
interface DateRangePickerProps { interface DateRangePickerProps {
minDate: string; minDate: string;
@ -10,7 +10,7 @@ interface DateRangePickerProps {
initialEndDate?: string; initialEndDate?: string;
} }
export default function DateRangePicker({ function DateRangePicker({
minDate, minDate,
maxDate, maxDate,
onDateRangeChange, onDateRangeChange,
@ -19,10 +19,26 @@ export default function DateRangePicker({
}: DateRangePickerProps) { }: DateRangePickerProps) {
const [startDate, setStartDate] = useState(initialStartDate || minDate); const [startDate, setStartDate] = useState(initialStartDate || minDate);
const [endDate, setEndDate] = useState(initialEndDate || maxDate); const [endDate, setEndDate] = useState(initialEndDate || maxDate);
const isInitializedRef = useRef(false);
useEffect(() => { useEffect(() => {
// Only notify parent component when dates change, not when the callback changes // Update local state when props change (e.g., when date range is loaded from API)
onDateRangeChange(startDate, endDate); 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]); }, [startDate, endDate]);
const handleStartDateChange = (newStartDate: string) => { const handleStartDateChange = (newStartDate: string) => {
@ -151,3 +167,6 @@ export default function DateRangePicker({
</div> </div>
); );
} }
// Export memoized component as default
export default memo(DateRangePicker);