| | import { Activity } from "../types/heatmap"; |
| |
|
| | export const aggregateToWeeklyData = (dailyData: Activity[]): Activity[] => { |
| | if (!dailyData || dailyData.length === 0) return []; |
| |
|
| | |
| | const weeklyMap = new Map<string, { count: number; level: number; dates: string[] }>(); |
| |
|
| | for (const dayActivity of dailyData) { |
| | const date = new Date(dayActivity.date); |
| | |
| | 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: [] }); |
| | } |
| |
|
| | const weekData = weeklyMap.get(weekKey)!; |
| | weekData.count += dayActivity.count; |
| | weekData.level = Math.max(weekData.level, dayActivity.level); |
| | weekData.dates.push(dayActivity.date); |
| | } |
| |
|
| | |
| | const weeklyData: Activity[] = []; |
| | |
| | weeklyMap.forEach((weekInfo, weekStartDate) => { |
| | weeklyData.push({ |
| | date: weekStartDate, |
| | count: weekInfo.count, |
| | level: weekInfo.level, |
| | }); |
| | }); |
| |
|
| | |
| | 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)}`; |
| | }; |