fix: prevent calendar cell redirect and add date deselection

This commit is contained in:
Yuhan Zhang 2026-01-29 20:48:15 +09:00
parent 86f780d1a4
commit 6aa38c22e7
1 changed files with 19 additions and 2 deletions

View File

@ -4,6 +4,7 @@ import { MonthCalendar } from "@/components/ActivityCalendar";
import { useDateFilterNavigation } from "@/hooks";
import type { StatisticsData } from "@/types/statistics";
import { MonthNavigator } from "./MonthNavigator";
import { type MemoFilter, useMemoFilterContext } from "@/contexts/MemoFilterContext";
interface Props {
statisticsData: StatisticsData;
@ -12,20 +13,36 @@ interface Props {
const StatisticsView = (props: Props) => {
const { statisticsData } = props;
const { activityStats } = statisticsData;
const navigateToDateFilter = useDateFilterNavigation();
const [visibleMonthString, setVisibleMonthString] = useState(dayjs().format("YYYY-MM"));
const { getFiltersByFactor, addFilter, removeFilter } = useMemoFilterContext();
const maxCount = useMemo(() => {
const counts = Object.values(activityStats);
return Math.max(...counts, 1);
}, [activityStats]);
const handleClick = (date: string) =>{
const displayTimeFilters = getFiltersByFactor("displayTime");
const isActive = displayTimeFilters.some((f: MemoFilter) => f.value === date);
if (isActive) {
removeFilter((f: MemoFilter) => f.factor === "displayTime" && f.value === date);
} else {
// Remove all existing tag filters first, then add the new one
removeFilter((f: MemoFilter) => f.factor === "displayTime");
addFilter({
factor: "displayTime",
value: date,
});
}
}
return (
<div className="group w-full mt-2 flex flex-col text-muted-foreground animate-fade-in">
<MonthNavigator visibleMonth={visibleMonthString} onMonthChange={setVisibleMonthString} activityStats={activityStats} />
<div className="w-full animate-scale-in">
<MonthCalendar month={visibleMonthString} data={activityStats} maxCount={maxCount} onClick={navigateToDateFilter} />
<MonthCalendar month={visibleMonthString} data={activityStats} maxCount={maxCount} onClick={handleClick} />
</div>
</div>
);