import { Tooltip } from "@mui/joy"; import classNames from "classnames"; import { getNormalizedDateString, getDateWithOffset } from "@/helpers/datetime"; interface Props { // Format: 2021-1 month: string; data: Record; onClick?: (date: string) => void; } const getCellAdditionalStyles = (count: number, maxCount: number) => { if (count === 0) { return "bg-gray-100 text-gray-400 dark:bg-gray-700 dark:text-gray-500"; } const ratio = count / maxCount; if (ratio > 0.7) { return "bg-blue-600 text-gray-100 dark:opacity-80"; } else if (ratio > 0.4) { return "bg-blue-400 text-gray-200 dark:opacity-80"; } else { return "bg-blue-300 text-gray-600 dark:opacity-80"; } }; const ActivityCalendar = (props: Props) => { const { month: monthStr, data, onClick } = props; const year = new Date(monthStr).getUTCFullYear(); const month = new Date(monthStr).getUTCMonth() + 1; const dayInMonth = new Date(year, month, 0).getDate(); const firstDay = new Date(year, month - 1, 1).getDay(); const lastDay = new Date(year, month - 1, dayInMonth).getDay(); const maxCount = Math.max(...Object.values(data)); const days = []; for (let i = 0; i < firstDay; i++) { days.push(0); } for (let i = 1; i <= dayInMonth; i++) { days.push(i); } for (let i = 0; i < 6 - lastDay; i++) { days.push(0); } return (
{days.map((day, index) => { const date = getNormalizedDateString( getDateWithOffset(`${year}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`), ); const count = data[date] || 0; const isToday = new Date().toDateString() === new Date(date).toDateString(); const tooltipText = count ? `${count} memos in ${date}` : date; return day ? (
count && onClick && onClick(date)} > {day}
) : (
); })}
); }; export default ActivityCalendar;