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, MoreVerticalIcon, RefreshCcwIcon, } from "lucide-react"; 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 { useMemoFilterStore, useMemoMetadataStore } from "@/store/v1"; import { useTranslate } from "@/utils/i18n"; import ActivityCalendar from "./ActivityCalendar"; import { Popover, PopoverContent, PopoverTrigger } from "./ui/Popover"; 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); 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 rebuildMemoProperty = async () => { await memoServiceClient.rebuildMemoProperty({ name: "memos/-", }); toast.success("Rebuild memo properties successfully."); window.location.reload(); }; 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" })} e.target.showPicker()} onChange={(e) => setVisibleMonthString(e.target.value || dayjs().format("YYYY-MM"))} />
setVisibleMonthString(dayjs(visibleMonthString).subtract(1, "month").format("YYYY-MM"))} /> setVisibleMonthString(dayjs(visibleMonthString).add(1, "month").format("YYYY-MM"))} />
{memoAmount > 0 && (

{memoAmount} memos in {days} {days > 1 ? "days" : "day"}

)}
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;