import { Tooltip } from "@mui/joy"; import clsx from "clsx"; import dayjs from "dayjs"; import { countBy } from "lodash-es"; import { CalendarDaysIcon, CheckCircleIcon, ChevronLeftIcon, ChevronRightIcon, Code2Icon, LinkIcon, ListTodoIcon } from "lucide-react"; import { useState } from "react"; import useAsyncEffect from "@/hooks/useAsyncEffect"; import i18n from "@/i18n"; import { useMemoFilterStore, useUserStatsStore } from "@/store/v1"; import { UserStats_MemoTypeStats } from "@/types/proto/api/v1/user_service"; import { useTranslate } from "@/utils/i18n"; import ActivityCalendar from "./ActivityCalendar"; const StatisticsView = () => { const t = useTranslate(); const memoFilterStore = useMemoFilterStore(); const userStatsStore = useUserStatsStore(); const [memoTypeStats, setMemoTypeStats] = useState(UserStats_MemoTypeStats.fromPartial({})); const [activityStats, setActivityStats] = useState>({}); const [selectedDate] = useState(new Date()); const [visibleMonthString, setVisibleMonthString] = useState(dayjs(selectedDate.toDateString()).format("YYYY-MM")); useAsyncEffect(async () => { const memoTypeStats = UserStats_MemoTypeStats.fromPartial({}); const displayTimeList: Date[] = []; for (const stats of Object.values(userStatsStore.userStatsByName)) { displayTimeList.push(...stats.memoDisplayTimestamps); if (stats.memoTypeStats) { memoTypeStats.codeCount += stats.memoTypeStats.codeCount; memoTypeStats.linkCount += stats.memoTypeStats.linkCount; memoTypeStats.todoCount += stats.memoTypeStats.todoCount; memoTypeStats.undoCount += stats.memoTypeStats.undoCount; } } setMemoTypeStats(memoTypeStats); setActivityStats(countBy(displayTimeList.map((date) => dayjs(date).format("YYYY-MM-DD")))); }, [userStatsStore.userStatsByName, userStatsStore.stateId]); const onCalendarClick = (date: string) => { memoFilterStore.removeFilter((f) => f.factor === "displayTime"); memoFilterStore.addFilter({ factor: "displayTime", value: date }); }; return (
{dayjs(visibleMonthString).toDate().toLocaleString(i18n.language, { year: "numeric", month: "long" })}
setVisibleMonthString(dayjs(visibleMonthString).subtract(1, "month").format("YYYY-MM"))} > setVisibleMonthString(dayjs(visibleMonthString).add(1, "month").format("YYYY-MM"))} >
memoFilterStore.addFilter({ factor: "property.hasLink", value: "" })} >
{t("memo.links")}
{memoTypeStats.linkCount}
memoFilterStore.addFilter({ factor: "property.hasTaskList", value: "" })} >
{memoTypeStats.undoCount > 0 ? : } {t("memo.to-do")}
{memoTypeStats.undoCount > 0 ? (
{memoTypeStats.todoCount - memoTypeStats.undoCount} / {memoTypeStats.todoCount}
) : ( {memoTypeStats.todoCount} )}
memoFilterStore.addFilter({ factor: "property.hasCode", value: "" })} >
{t("memo.code")}
{memoTypeStats.codeCount}
); }; export default StatisticsView;