import { Button } from "@mui/joy"; import copy from "copy-to-clipboard"; import dayjs from "dayjs"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useParams } from "react-router-dom"; import Empty from "@/components/Empty"; import Icon from "@/components/Icon"; import MemoFilters from "@/components/MemoFilters"; import MemoView from "@/components/MemoView"; import MobileHeader from "@/components/MobileHeader"; import UserAvatar from "@/components/UserAvatar"; import { DEFAULT_LIST_MEMOS_PAGE_SIZE } from "@/helpers/consts"; import useLoading from "@/hooks/useLoading"; import { useMemoFilterStore, useMemoList, useMemoStore, useUserStore } from "@/store/v1"; import { User } from "@/types/proto/api/v1/user_service"; import { useTranslate } from "@/utils/i18n"; const UserProfile = () => { const t = useTranslate(); const params = useParams(); const userStore = useUserStore(); const loadingState = useLoading(); const [user, setUser] = useState(); const memoStore = useMemoStore(); const memoList = useMemoList(); const memoFilterStore = useMemoFilterStore(); const [isRequesting, setIsRequesting] = useState(true); const [nextPageToken, setNextPageToken] = useState(""); const sortedMemos = memoList.value .sort((a, b) => dayjs(b.displayTime).unix() - dayjs(a.displayTime).unix()) .sort((a, b) => Number(b.pinned) - Number(a.pinned)); useEffect(() => { const username = params.username; if (!username) { throw new Error("username is required"); } userStore .searchUsers(`username == "${username}"`) .then((users) => { if (users.length !== 1) { throw new Error("User not found"); } const user = users[0]; setUser(user); loadingState.setFinish(); }) .catch((error) => { console.error(error); toast.error(t("message.user-not-found")); }); }, [params.username]); useEffect(() => { if (!user) { return; } memoList.reset(); fetchMemos(""); }, [user, memoFilterStore.filters]); const fetchMemos = async (nextPageToken: string) => { if (!user) { return; } setIsRequesting(true); const filters = [`creator == "${user.name}"`, `row_status == "NORMAL"`, `order_by_pinned == true`]; const contentSearch: string[] = []; const tagSearch: string[] = []; for (const filter of memoFilterStore.filters) { if (filter.factor === "contentSearch") { contentSearch.push(`"${filter.value}"`); } else if (filter.factor === "tagSearch") { tagSearch.push(`"${filter.value}"`); } } if (contentSearch.length > 0) { filters.push(`content_search == [${contentSearch.join(", ")}]`); } if (tagSearch.length > 0) { filters.push(`tag_search == [${tagSearch.join(", ")}]`); } const response = await memoStore.fetchMemos({ pageSize: DEFAULT_LIST_MEMOS_PAGE_SIZE, filter: filters.join(" && "), pageToken: nextPageToken, }); setIsRequesting(false); setNextPageToken(response.nextPageToken); }; const handleCopyProfileLink = () => { if (!user) { return; } copy(`${window.location.origin}/u/${encodeURIComponent(user.username)}`); toast.success(t("message.copied")); }; return (
{!loadingState.isLoading && (user ? ( <>

{user.nickname || user.username}

{user.description}

{sortedMemos.map((memo) => ( ))} {isRequesting ? (

{t("memo.fetching-data")}

) : !nextPageToken ? ( sortedMemos.length === 0 && (

{t("message.no-data")}

) ) : (
)} ) : (

Not found

))}
); }; export default UserProfile;