"use client" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardFooter, CardHeader } from "@/components/ui/card" import { listGames, listOrders, listPlayers, listPosts } from "@/lib/api" import { roleLabels } from "@/lib/constants" import type { Game, Player, Post } from "@/lib/types" import { ClipboardList, Heart, MessageCircle, PenSquare, Pin } from "lucide-react" import Link from "next/link" import { useEffect, useState } from "react" export default function CommunityPage() { const [games, setGames] = useState([]) const [players, setPlayers] = useState([]) const [orders, setOrders] = useState>>([]) const [posts, setPosts] = useState([]) const [postsLoading, setPostsLoading] = useState(true) const [sortMode, setSortMode] = useState<"latest" | "hot">("latest") const [selectedGame, setSelectedGame] = useState(null) useEffect(() => { let cancelled = false Promise.all([listGames(), listPlayers(), Promise.resolve(listOrders()), listPosts()]) .then(([gamesItems, playersItems, ordersItems, postsItems]) => { if (cancelled) return setGames(gamesItems) setPlayers(playersItems) setOrders(ordersItems) setPosts(postsItems) setPostsLoading(false) }) .catch(() => { if (cancelled) return setGames([]) setPlayers([]) setOrders([]) setPosts([]) setPostsLoading(false) }) return () => { cancelled = true } }, []) const filteredPosts = posts .filter((post) => { if (!selectedGame) return true return post.tags.includes(selectedGame) }) .sort((a, b) => { if (sortMode === "latest") { return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() } const scoreA = a.likeCount + a.commentCount const scoreB = b.likeCount + b.commentCount return scoreB - scoreA }) return (

社区

{games.map((game) => ( setSelectedGame(selectedGame === game.name ? null : game.name)} > {game.name} ))}
{postsLoading ? (
加载中...
) : filteredPosts.length === 0 ? (
暂无帖子
) : ( filteredPosts.map((post) => (() => { const linkedOrder = post.linkedOrderId ? orders.find((order) => order.id === post.linkedOrderId) : null const linkedPlayer = linkedOrder ? players.find((player) => player.id === linkedOrder.playerId) : null return (
{post.author.nickname[0]}
{post.author.nickname} {roleLabels[post.authorRole]} {post.pinned && }
{new Date(post.createdAt).toLocaleDateString("zh-CN")}

{post.title}

{post.content}

{post.tags.length > 0 && (
{post.tags.map((tag) => ( {tag} ))}
)} {post.linkedOrderId && (
关联订单秀单
{linkedOrder && (

{linkedOrder.service.gameName} · {linkedOrder.service.title}

{linkedOrder.playerName} {linkedPlayer ? ` · ${linkedPlayer.rating}` : ""}

)}
)}
{post.likeCount} {post.commentCount}
) })(), ) )}
) }