import { useEffect, useState } from "react"; import { memoServiceClient } from "@/grpcweb"; import { useMemoStore, useTagStore } from "@/store/v1"; import { User } from "@/types/proto/api/v1/user_service"; import { useTranslate } from "@/utils/i18n"; import Icon from "./Icon"; interface Props { user: User; } interface UserMemoStats { links: number; todos: number; code: number; } const UserStatisticsView = (props: Props) => { const { user } = props; const t = useTranslate(); const memoStore = useMemoStore(); const tagStore = useTagStore(); const [memoAmount, setMemoAmount] = useState(0); const [isRequesting, setIsRequesting] = useState(false); const [memoStats, setMemoStats] = useState({ links: 0, todos: 0, code: 0 }); const days = Math.ceil((Date.now() - user.createTime!.getTime()) / 86400000); const memos = Object.values(memoStore.getState().memoMapByName); const tags = tagStore.sortedTags().length; useEffect(() => { if (memos.length === 0) { return; } (async () => { setIsRequesting(true); const { properties } = await memoServiceClient.listMemoProperties({ name: `memos/-`, }); const memoStats: UserMemoStats = { links: 0, todos: 0, code: 0 }; properties.forEach((property) => { if (property.hasLink) { memoStats.links += 1; } if (property.hasTaskList) { memoStats.todos += 1; } if (property.hasCode) { memoStats.code += 1; } }); setMemoStats(memoStats); setMemoAmount(properties.length); setIsRequesting(false); })(); }, [memos.length, user.name]); return (

{t("common.statistics")}

{t("common.days")}
{days}
{t("common.memos")}
{isRequesting ? : {memoAmount}}
{t("common.tags")}
{tags}
Links
{memoStats.links}
Todos
{memoStats.todos}
Code
{memoStats.code}
); }; export default UserStatisticsView;