mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-01-16 11:12:11 +01:00
fix: enhance date range calculations and optimize date range change handling
This commit is contained in:
@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user