import { Divider, Tooltip } from "@mui/joy"; import clsx from "clsx"; import dayjs from "dayjs"; import { useState } from "react"; import toast from "react-hot-toast"; import { memoServiceClient } from "@/grpcweb"; import useAsyncEffect from "@/hooks/useAsyncEffect"; import useCurrentUser from "@/hooks/useCurrentUser"; import i18n from "@/i18n"; import { useFilterStore } from "@/store/module"; import { useMemoStore } from "@/store/v1"; import { useTranslate } from "@/utils/i18n"; import ActivityCalendar from "./ActivityCalendar"; import Icon from "./Icon"; interface UserMemoStats { link: number; taskList: number; code: number; incompleteTasks: number; } const UserStatisticsView = () => { const t = useTranslate(); const currentUser = useCurrentUser(); const memoStore = useMemoStore(); const filterStore = useFilterStore(); const [memoAmount, setMemoAmount] = useState(0); const [isRequesting, setIsRequesting] = useState(false); const [memoStats, setMemoStats] = useState({ link: 0, taskList: 0, code: 0, incompleteTasks: 0 }); const [activityStats, setActivityStats] = useState>({}); const monthString = dayjs(new Date().toDateString()).format("YYYY-MM"); const days = Math.ceil((Date.now() - currentUser.createTime!.getTime()) / 86400000); const filter = filterStore.state; useAsyncEffect(async () => { setIsRequesting(true); const { properties } = await memoServiceClient.listMemoProperties({ name: `memos/-`, }); const memoStats: UserMemoStats = { link: 0, taskList: 0, code: 0, incompleteTasks: 0 }; properties.forEach((property) => { 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(properties.length); const filters = [`row_status == "NORMAL"`]; const { stats } = await memoServiceClient.getUserMemosStats({ name: currentUser.name, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, filter: filters.join(" && "), }); setActivityStats( Object.fromEntries( Object.entries(stats).filter(([date]) => { return dayjs(date).format("YYYY-MM") === monthString; }), ), ); setIsRequesting(false); }, [memoStore.stateId]); const handleRebuildMemoTags = async () => { await memoServiceClient.rebuildMemoProperty({ name: "memos/-", }); toast.success("Refresh successfully"); window.location.reload(); }; return (

{new Date().toLocaleDateString(i18n.language, { month: "long", day: "numeric" })}

Days
{days}
Memos
{isRequesting ? : {memoAmount}}
filterStore.setMemoPropertyFilter({ hasLink: !filter.memoPropertyFilter?.hasLink })} >
{t("memo.links")}
{memoStats.link}
filterStore.setMemoPropertyFilter({ hasTaskList: !filter.memoPropertyFilter?.hasTaskList })} >
{memoStats.incompleteTasks > 0 ? ( ) : ( )} {t("memo.to-do")}
{memoStats.incompleteTasks > 0 ? (
{memoStats.taskList - memoStats.incompleteTasks} / {memoStats.taskList}
) : ( {memoStats.taskList} )}
filterStore.setMemoPropertyFilter({ hasCode: !filter.memoPropertyFilter?.hasCode })} >
{t("memo.code")}
{memoStats.code}
); }; export default UserStatisticsView;