science-release-map / src /utils /weeklyCalendar.ts
cgeorgiaw's picture
cgeorgiaw HF Staff
avi_tag_selector (#1)
cd201c7 verified
raw
history blame
1.78 kB
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<string, { count: number; level: number; dates: string[] }>();
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: [] });
}
const weekData = weeklyMap.get(weekKey)!;
weekData.count += dayActivity.count;
weekData.level = Math.max(weekData.level, dayActivity.level);
weekData.dates.push(dayActivity.date);
}
// 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,
});
});
// 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)}`;
};