import { Tooltip } from "@mui/joy"; import clsx from "clsx"; import dayjs from "dayjs"; import { useWorkspaceSettingStore } from "@/store/v1"; import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { useTranslate } from "@/utils/i18n"; const WEEK_DAYS = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; interface Props { // Format: 2021-1 month: string; selectedDate: 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-teal-700 text-gray-100 dark:opacity-80"; } else if (ratio > 0.4) { return "bg-teal-600 text-gray-100 dark:opacity-80"; } else { return "bg-teal-500 text-gray-100 dark:opacity-70"; } }; const ActivityCalendar = (props: Props) => { const t = useTranslate(); const { month: monthStr, data, onClick } = props; const workspaceSettingStore = useWorkspaceSettingStore(); const weekStartDayOffset = ( workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.GENERAL).generalSetting || WorkspaceGeneralSetting.fromPartial({}) ).weekStartDayOffset; const year = dayjs(monthStr).toDate().getFullYear(); const month = dayjs(monthStr).toDate().getMonth() + 1; const dayInMonth = new Date(year, month, 0).getDate(); const firstDay = new Date(year, month - 1, 1).getDay() - weekStartDayOffset; const lastDay = new Date(year, month - 1, dayInMonth).getDay() - weekStartDayOffset; const weekDays = WEEK_DAYS.slice(weekStartDayOffset).concat(WEEK_DAYS.slice(0, weekStartDayOffset)); 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 (
{weekDays.map((day, index) => { return (
{day}
); })} {days.map((day, index) => { const date = dayjs(`${year}-${month}-${day}`).format("YYYY-MM-DD"); const count = data[date] || 0; const isToday = dayjs().format("YYYY-MM-DD") === date; const tooltipText = count ? t("memo.count-memos-in-date", { count: count, date: date }) : date; const isSelected = dayjs(props.selectedDate).format("YYYY-MM-DD") === date; return day ? ( count > 0 ? (
count && onClick && onClick(date)} > {day}
) : (
{day}
) ) : (
); })}
); }; export default ActivityCalendar;