import { Divider, 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 useCurrentUser from "@/hooks/useCurrentUser"; import i18n from "@/i18n"; import { useMemoFilterStore, useMemoMetadataStore } from "@/store/v1"; import { useTranslate } from "@/utils/i18n"; import ActivityCalendar from "./ActivityCalendar"; interface UserMemoStats { link: number; taskList: number; code: number; incompleteTasks: number; } const UserStatisticsView = () => { const t = useTranslate(); const currentUser = useCurrentUser(); const memoFilterStore = useMemoFilterStore(); const memoMetadataStore = useMemoMetadataStore(); const metadataList = Object.values(memoMetadataStore.getState().dataMapByName); const [memoAmount, setMemoAmount] = useState(0); const [memoStats, setMemoStats] = useState({ link: 0, taskList: 0, code: 0, incompleteTasks: 0 }); const [activityStats, setActivityStats] = useState>({}); const [selectedDate] = useState(new Date()); const [visibleMonthString, setVisibleMonthString] = useState(dayjs(selectedDate.toDateString()).format("YYYY-MM")); const days = Math.ceil((Date.now() - currentUser.createTime!.getTime()) / 86400000); const singularOrPluralMemo = (memoAmount > 0 ? t("common.memos") : t("common.memo")).toLowerCase(); const singularOrPluralDay = (days > 0 ? t("common.days") : t("common.day")).toLowerCase(); useAsyncEffect(async () => { const memoStats: UserMemoStats = { link: 0, taskList: 0, code: 0, incompleteTasks: 0 }; metadataList.forEach((memo) => { const { property } = memo; if (property?.hasLink) { memoStats.link += 1; } if (property?.hasTaskList) { memoStats.taskList += 1; } if (property?.hasCode) { memoStats.code += 1; } if (property?.hasIncompleteTasks) { memoStats.incompleteTasks += 1; } }); setMemoStats(memoStats); setMemoAmount(metadataList.length); setActivityStats(countBy(metadataList.map((memo) => dayjs(memo.displayTime).format("YYYY-MM-DD")))); }, [memoMetadataStore.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"))} >
{memoAmount === 0 ? (

{t("memo.no-memos")}

) : (

{memoAmount} {singularOrPluralMemo} {t("common.in").toLowerCase()} {days} {singularOrPluralDay}

)}
memoFilterStore.addFilter({ factor: "property.hasLink", value: "" })} >
{t("memo.links")}
{memoStats.link}
memoFilterStore.addFilter({ factor: "property.hasTaskList", value: "" })} >
{memoStats.incompleteTasks > 0 ? : } {t("memo.to-do")}
{memoStats.incompleteTasks > 0 ? (
{memoStats.taskList - memoStats.incompleteTasks} / {memoStats.taskList}
) : ( {memoStats.taskList} )}
memoFilterStore.addFilter({ factor: "property.hasCode", value: "" })} >
{t("memo.code")}
{memoStats.code}
); }; export default UserStatisticsView;