import { Activity } from "../types/heatmap"; export const aggregateToWeeklyData = (dailyData: Activity[]): Activity[] => { if (!dailyData || dailyData.length === 0) return []; // Create a map to group activities by week const weeklyMap = new Map(); for (const dayActivity of dailyData) { const date = new Date(dayActivity.date); // Get the Sunday of this week (week start) const weekStart = new Date(date); weekStart.setDate(date.getDate() - date.getDay()); const weekKey = weekStart.toISOString().split('T')[0]; if (!weeklyMap.has(weekKey)) { weeklyMap.set(weekKey, { count: 0, level: 0, dates: [], items: [] }); } const weekData = weeklyMap.get(weekKey)!; weekData.count += dayActivity.count; weekData.level = Math.max(weekData.level, dayActivity.level); weekData.dates.push(dayActivity.date); // Aggregate items from daily data if (dayActivity.items) { weekData.items.push(...dayActivity.items); } } // Convert to true weekly data - one entry per week, not per day const weeklyData: Activity[] = []; weeklyMap.forEach((weekInfo, weekStartDate) => { weeklyData.push({ date: weekStartDate, // Use the week start date count: weekInfo.count, level: weekInfo.level, items: weekInfo.items, // Include aggregated items }); }); // Sort by date to ensure proper order weeklyData.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); return weeklyData; }; export const getWeekDateRange = (weekStartDate: string): string => { const startDate = new Date(weekStartDate); const endDate = new Date(startDate); endDate.setDate(startDate.getDate() + 6); const formatDate = (date: Date) => { return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); }; return `${formatDate(startDate)} - ${formatDate(endDate)}`; };