science-release-map / src /utils /weeklyCalendar.ts
Avijit Ghosh
Add scientific tag filtering and weekly/daily heatmap view toggle
e603004
raw
history blame
1.89 kB
import { Activity } from "../types/heatmap";
export const aggregateToWeeklyData = (dailyData: Activity[]): Activity[] => {
if (!dailyData || dailyData.length === 0) return [];
const weeklyData: Activity[] = [];
let currentWeekStart: Date | null = null;
let currentWeekCount = 0;
let currentWeekLevel = 0;
for (const dayActivity of dailyData) {
const date = new Date(dayActivity.date);
const dayOfWeek = date.getDay(); // 0 = Sunday, 1 = Monday, etc.
// If it's Sunday or we don't have a current week, start a new week
if (dayOfWeek === 0 || currentWeekStart === null) {
// Save the previous week if it exists
if (currentWeekStart !== null) {
weeklyData.push({
date: currentWeekStart.toISOString().split('T')[0],
count: currentWeekCount,
level: currentWeekLevel,
});
}
// Start new week
currentWeekStart = new Date(date);
currentWeekCount = dayActivity.count;
currentWeekLevel = dayActivity.level;
} else {
// Add to current week
currentWeekCount += dayActivity.count;
// Use the maximum level for the week
currentWeekLevel = Math.max(currentWeekLevel, dayActivity.level);
}
}
// Don't forget the last week
if (currentWeekStart !== null) {
weeklyData.push({
date: currentWeekStart.toISOString().split('T')[0],
count: currentWeekCount,
level: currentWeekLevel,
});
}
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)}`;
};