import { useNavigate, useParams } from "react-router"; import { CommentWithResource, User } from "../network/models"; import { network } from "../network/network"; import showToast from "../components/toast"; import { useEffect, useState } from "react"; import ResourcesView from "../components/resources_view"; import Loading from "../components/loading"; import Pagination from "../components/pagination"; import { MdOutlineArrowRight } from "react-icons/md"; import {SquareImage} from "../components/image.tsx"; export default function UserPage() { const [user, setUser] = useState(null); const { username: rawUsername } = useParams(); // 解码用户名,确保特殊字符被还原 const username = rawUsername ? decodeURIComponent(rawUsername) : ""; const [page, setPage] = useState(0); useEffect(() => { network.getUserInfo(username || "").then((res) => { if (res.success) { setUser(res.data!); } else { showToast({ message: res.message, type: "error", }); } }); }, [username]); useEffect(() => { document.title = username || "User"; }, [username]); if (!user) { return (
); } return (
setPage(0)} > Resources
setPage(1)} > Comments
{page === 0 && } {page === 1 && }
); } function UserCard({ user }: { user: User }) { return (
{"avatar"}

{user.username}

{user.bio.trim() !== "" ? (

{user.bio.trim()}

) : (

{" "} {user.uploads_count} Resources {" "} {user.comments_count} Comments

)}
); } function UserResources({ user }: { user: User }) { return ( { return network.getResourcesByUser(user.username, page); }} > ); } function UserComments({ user }: { user: User }) { const [page, setPage] = useState(1); const [maxPage, setMaxPage] = useState(0); return (
{maxPage ? (
) : null}
); } function CommentsList({ username, page, maxPageCallback, }: { username: string; page: number; maxPageCallback: (maxPage: number) => void; }) { const [comments, setComments] = useState(null); useEffect(() => { network.listCommentsByUser(username, page).then((res) => { if (res.success) { setComments(res.data!); maxPageCallback(res.totalPages || 1); } else { showToast({ message: res.message, type: "error", }); } }); }, [maxPageCallback, page, username]); if (comments == null) { return (
); } return ( <> {comments.map((comment) => { return ; })} ); } function limitArticleLength(content: string, maxLength: number): string { if (content.length <= maxLength) { return content; } return content.slice(0, maxLength) + "..."; } function CommentTile({ comment }: { comment: CommentWithResource }) { const navigate = useNavigate(); return (
{"avatar"}
{comment.user.username}
{new Date(comment.created_at).toLocaleString()}
{limitArticleLength(comment.content, 200)}
{comment.images.map((image) => ( ))}
{ navigate("/resources/" + comment.resource.id); }} > {comment.resource.title}
); }