From 4beb610f2379627ded8dd6e93e48a2072807cd9f Mon Sep 17 00:00:00 2001 From: zetaloop Date: Sun, 22 Feb 2026 08:30:21 +0800 Subject: [PATCH] refactor(pages): migrate app data reads to api adapters --- app/(dashboard)/dashboard/page.tsx | 10 +++--- .../dashboard/services/new/page.tsx | 7 ++-- .../dashboard/shop/income/page.tsx | 4 +-- app/(main)/community/page.tsx | 15 +++++--- app/(main)/page.tsx | 12 ++++--- app/(main)/player/[id]/page.tsx | 17 +++++---- app/(main)/search/page.tsx | 36 +++++++++++-------- app/(main)/shop/[id]/page.tsx | 20 ++++++----- app/(main)/user/[id]/page.tsx | 18 ++++++---- app/(order)/order/new/page.tsx | 6 ++-- lib/api/disputes.ts | 6 ++-- lib/api/reviews.ts | 8 ++--- lib/api/transactions.ts | 4 +-- 13 files changed, 97 insertions(+), 66 deletions(-) diff --git a/app/(dashboard)/dashboard/page.tsx b/app/(dashboard)/dashboard/page.tsx index 95205fc..17383f1 100644 --- a/app/(dashboard)/dashboard/page.tsx +++ b/app/(dashboard)/dashboard/page.tsx @@ -6,17 +6,17 @@ import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Progress } from "@/components/ui/progress" +import { listOrders, listPlayers, listServices, listShops } from "@/lib/api" import { statusLabels } from "@/lib/constants" -import { mockOrders, mockPlayers, mockServices, mockShops } from "@/lib/mock" import { useAuthStore } from "@/store/auth" export default function DashboardPage() { const { currentRole } = useAuthStore() const isOwner = currentRole === "owner" - const player = mockPlayers[0] - const shop = mockShops[0] - const recentOrders = mockOrders.slice(0, 3) + const player = listPlayers()[0] + const shop = listShops()[0] + const recentOrders = listOrders().slice(0, 3) return (
@@ -76,7 +76,7 @@ export default function DashboardPage() {
- {isOwner ? "¥12,800" : mockServices.filter((s) => s.playerId === player.id).length} + {isOwner ? "¥12,800" : listServices().filter((s) => s.playerId === player.id).length}
diff --git a/app/(dashboard)/dashboard/services/new/page.tsx b/app/(dashboard)/dashboard/services/new/page.tsx index 2a762e7..d7c0218 100644 --- a/app/(dashboard)/dashboard/services/new/page.tsx +++ b/app/(dashboard)/dashboard/services/new/page.tsx @@ -19,8 +19,8 @@ import { SelectValue, } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" +import { getGameById, listGames } from "@/lib/api" import { GameIcon } from "@/lib/game-icons" -import { mockGames } from "@/lib/mock" import type { PlayerService } from "@/lib/types" import { useAuthStore } from "@/store/auth" import { useServiceStore } from "@/store/services" @@ -76,9 +76,10 @@ export default function NewServicePage() { const selectedGameId = watch("gameId") const selectedUnit = watch("unit") + const games = listGames() const onSubmit = async (data: z.infer) => { - const game = mockGames.find((item) => item.id === data.gameId) + const game = getGameById(data.gameId) if (!game) return const payload: Omit = { @@ -128,7 +129,7 @@ export default function NewServicePage() { - {mockGames.map((game) => ( + {games.map((game) => (
diff --git a/app/(dashboard)/dashboard/shop/income/page.tsx b/app/(dashboard)/dashboard/shop/income/page.tsx index c40893a..9251089 100644 --- a/app/(dashboard)/dashboard/shop/income/page.tsx +++ b/app/(dashboard)/dashboard/shop/income/page.tsx @@ -11,7 +11,7 @@ import { TableHeader, TableRow, } from "@/components/ui/table" -import { mockTransactions } from "@/lib/mock" +import { listTransactions } from "@/lib/api" import { useAuthStore } from "@/store/auth" import { useOrderStore } from "@/store/orders" import { useShopStore } from "@/store/shops" @@ -35,7 +35,7 @@ export default function ShopIncomePage() { .reduce((acc, order) => acc + order.totalPrice, 0) const shopOrderIds = new Set(shopOrders.map((order) => order.id)) - const relatedTransactions = mockTransactions.filter((transaction) => { + const relatedTransactions = listTransactions().filter((transaction) => { if (transaction.type === "withdrawal") return true if (transaction.type !== "income") return false const match = transaction.description.match(/ord\d+/) diff --git a/app/(main)/community/page.tsx b/app/(main)/community/page.tsx index 0b4ed2a..405d53e 100644 --- a/app/(main)/community/page.tsx +++ b/app/(main)/community/page.tsx @@ -7,14 +7,19 @@ 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 { mockGames, mockOrders, mockPlayers, mockPosts } from "@/lib/mock" export default function CommunityPage() { + const games = listGames() + const posts = listPosts() + const orders = listOrders() + const players = listPlayers() + const [sortMode, setSortMode] = useState<"latest" | "hot">("latest") const [selectedGame, setSelectedGame] = useState(null) - const filteredPosts = mockPosts + const filteredPosts = posts .filter((post) => { if (!selectedGame) return true return post.tags.includes(selectedGame) @@ -60,7 +65,7 @@ export default function CommunityPage() {
- {mockGames.map((game) => ( + {games.map((game) => ( (() => { const linkedOrder = post.linkedOrderId - ? mockOrders.find((order) => order.id === post.linkedOrderId) + ? orders.find((order) => order.id === post.linkedOrderId) : null const linkedPlayer = linkedOrder - ? mockPlayers.find((player) => player.id === linkedOrder.playerId) + ? players.find((player) => player.id === linkedOrder.playerId) : null return ( diff --git a/app/(main)/page.tsx b/app/(main)/page.tsx index fded128..dbb8530 100644 --- a/app/(main)/page.tsx +++ b/app/(main)/page.tsx @@ -4,10 +4,14 @@ 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, CardTitle } from "@/components/ui/card" +import { listGames, listPlayers, listShops } from "@/lib/api" import { GameIcon } from "@/lib/game-icons" -import { mockGames, mockPlayers, mockShops } from "@/lib/mock" export default function HomePage() { + const games = listGames() + const players = listPlayers() + const shops = listShops() + return (
@@ -44,7 +48,7 @@ export default function HomePage() {
- {mockGames.map((game) => ( + {games.map((game) => (
- {mockPlayers.map((player) => ( + {players.map((player) => ( @@ -127,7 +131,7 @@ export default function HomePage() {
- {mockShops.map((shop) => ( + {shops.map((shop) => ( {shop.name} diff --git a/app/(main)/player/[id]/page.tsx b/app/(main)/player/[id]/page.tsx index e2877be..97dd4bc 100644 --- a/app/(main)/player/[id]/page.tsx +++ b/app/(main)/player/[id]/page.tsx @@ -15,24 +15,27 @@ import { } from "@/components/ui/card" import { Separator } from "@/components/ui/separator" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" -import { mockFavorites, mockPlayers, mockReviews, mockServices } from "@/lib/mock" +import { + isFavorited as checkFavorited, + listPlayers, + listReviewsByTargetUser, + listServicesByPlayer, +} from "@/lib/api" export default async function PlayerDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params - const player = mockPlayers.find((p) => p.id === id) + const player = listPlayers().find((p) => p.id === id) if (!player) { notFound() } - const playerReviews = mockReviews.filter((r) => r.toUserId === player.id) + const playerReviews = listReviewsByTargetUser(player.id) const playerServices = player.services && player.services.length > 0 ? player.services - : mockServices.filter((s) => s.playerId === player.id) - const isFavorited = mockFavorites.some( - (f) => f.userId === "u1" && f.targetType === "player" && f.targetId === player.id, - ) + : listServicesByPlayer(player.id) + const isFavorited = checkFavorited("u1", "player", player.id) return (
diff --git a/app/(main)/search/page.tsx b/app/(main)/search/page.tsx index aac9486..cfbd7ff 100644 --- a/app/(main)/search/page.tsx +++ b/app/(main)/search/page.tsx @@ -41,9 +41,9 @@ import { SheetTrigger, } from "@/components/ui/sheet" import { Switch } from "@/components/ui/switch" +import { listGames, listPlayers, listServices, listShops } from "@/lib/api" import { GameIcon } from "@/lib/game-icons" -import { mockGames, mockPlayers, mockServices, mockShops } from "@/lib/mock" -import type { Player, Shop } from "@/lib/types" +import type { Game, Player, Shop } from "@/lib/types" import { cn } from "@/lib/utils" function StatusBadge({ status }: { status: Player["status"] }) { @@ -255,6 +255,7 @@ type SearchResult = } interface FilterProps { + games: Game[] selectedGames: string[] onGameChange: (game: string, checked: boolean) => void priceRange: { min: string; max: string } @@ -267,6 +268,7 @@ interface FilterProps { } function FilterSection({ + games, selectedGames, onGameChange, priceRange, @@ -285,7 +287,7 @@ function FilterSection({ 游戏类型
- {mockGames.map((game) => ( + {games.map((game) => (
(() => { @@ -406,30 +412,30 @@ function SearchPageContent() { } const shopResultItems = useMemo(() => { - return mockShops.map((shop) => { - const shopPlayers = mockPlayers.filter((player) => player.shopId === shop.id) + return shops.map((shop) => { + const shopPlayers = players.filter((player) => player.shopId === shop.id) const playerIds = new Set(shopPlayers.map((player) => player.id)) - const services = mockServices.filter((service) => playerIds.has(service.playerId)) + const shopServices = services.filter((service) => playerIds.has(service.playerId)) const minPrice = - services.length > 0 ? Math.min(...services.map((service) => service.price)) : 0 + shopServices.length > 0 ? Math.min(...shopServices.map((service) => service.price)) : 0 const unit = - services.length > 0 - ? services.reduce((prev, curr) => (prev.price < curr.price ? prev : curr)).unit + shopServices.length > 0 + ? shopServices.reduce((prev, curr) => (prev.price < curr.price ? prev : curr)).unit : "局" - const games = [...new Set(services.map((service) => service.gameName))] + const shopGames = [...new Set(shopServices.map((service) => service.gameName))] const hasAvailable = shopPlayers.some((player) => player.status === "available") return { shop, minPrice, unit, - games, + games: shopGames, hasAvailable, } }) - }, []) + }, [players, services, shops]) const filteredPlayers = useMemo(() => { - return mockPlayers.filter((player) => { + return players.filter((player) => { if (searchQuery) { const query = searchQuery.toLowerCase() const matchName = player.user.nickname.toLowerCase().includes(query) @@ -456,7 +462,7 @@ function SearchPageContent() { return true }) - }, [searchQuery, selectedGames, priceRange, onlyOnline, minRating]) + }, [minRating, onlyOnline, players, priceRange, searchQuery, selectedGames]) const filteredShops = useMemo(() => { return shopResultItems.filter((item) => { @@ -559,6 +565,7 @@ function SearchPageContent() {
@@ -16,19 +22,17 @@ interface PageProps { export default async function ShopPage({ params }: PageProps) { const { id } = await params - const shop = mockShops.find((s) => s.id === id) + const shop = getShopById(id) if (!shop) { notFound() } - const shopPlayers = mockPlayers.filter((p) => p.shopId === shop.id) + const shopPlayers = listPlayersByShop(shop.id) const playerIds = shopPlayers.map((p) => p.id) - const shopServices = mockServices.filter((s) => playerIds.includes(s.playerId)) - const shopReviews = mockReviews.filter((r) => playerIds.includes(r.toUserId)) - const isFavorited = mockFavorites.some( - (f) => f.userId === "u1" && f.targetType === "shop" && f.targetId === shop.id, - ) + const shopServices = listServices().filter((s) => playerIds.includes(s.playerId)) + const shopReviews = listReviews().filter((r) => playerIds.includes(r.toUserId)) + const isFavorited = checkFavorited("u1", "shop", shop.id) const sortedSections = [...shop.templateConfig.sections] .filter((s) => s.enabled) diff --git a/app/(main)/user/[id]/page.tsx b/app/(main)/user/[id]/page.tsx index c582a74..612f58a 100644 --- a/app/(main)/user/[id]/page.tsx +++ b/app/(main)/user/[id]/page.tsx @@ -5,25 +5,31 @@ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" -import { mockFavorites, mockPlayers, mockPosts, mockShops, mockUsers } from "@/lib/mock" +import { + getUserById, + listFavoritesByUser, + listPlayers, + listPostsByAuthor, + listShops, +} from "@/lib/api" export default async function UserProfilePage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params - const user = mockUsers.find((u) => u.id === id) + const user = getUserById(id) if (!user) { notFound() } - const userPosts = mockPosts.filter((p) => p.author.id === user.id) - const userFavorites = mockFavorites.filter((f) => f.userId === user.id) + const userPosts = listPostsByAuthor(user.id) + const userFavorites = listFavoritesByUser(user.id) const favoritePlayers = userFavorites .filter((f) => f.targetType === "player") - .map((f) => mockPlayers.find((p) => p.id === f.targetId)) + .map((f) => listPlayers().find((p) => p.id === f.targetId)) .filter((p): p is NonNullable => p != null) const favoriteShops = userFavorites .filter((f) => f.targetType === "shop") - .map((f) => mockShops.find((s) => s.id === f.targetId)) + .map((f) => listShops().find((s) => s.id === f.targetId)) .filter((s): s is NonNullable => s != null) return ( diff --git a/app/(order)/order/new/page.tsx b/app/(order)/order/new/page.tsx index d5b8855..3180d88 100644 --- a/app/(order)/order/new/page.tsx +++ b/app/(order)/order/new/page.tsx @@ -11,7 +11,7 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Separator } from "@/components/ui/separator" import { Textarea } from "@/components/ui/textarea" -import { mockPlayers, mockServices } from "@/lib/mock" +import { getPlayerById, getServiceById } from "@/lib/api" import { notifySuccess } from "@/lib/toast" import { useRequireAuth } from "@/lib/use-require-auth" import { useAuthStore } from "@/store/auth" @@ -29,8 +29,8 @@ export default function NewOrderPage() { const deductBalance = useWalletStore((state) => state.deductBalance) const serviceId = searchParams.get("serviceId") - const service = mockServices.find((s) => s.id === serviceId) - const player = service ? mockPlayers.find((p) => p.id === service.playerId) : null + const service = serviceId ? getServiceById(serviceId) : undefined + const player = service ? getPlayerById(service.playerId) : undefined const [quantity, setQuantity] = useState(1) const [note, setNote] = useState("") diff --git a/lib/api/disputes.ts b/lib/api/disputes.ts index 5aee7ba..830e90c 100644 --- a/lib/api/disputes.ts +++ b/lib/api/disputes.ts @@ -1,9 +1,9 @@ -import { mockDisputes } from "@/lib/mock" +import { useDisputeStore } from "@/store/disputes" export function listDisputes() { - return mockDisputes + return useDisputeStore.getState().disputes } export function getDisputeByOrderId(orderId: string) { - return mockDisputes.find((dispute) => dispute.orderId === orderId) + return useDisputeStore.getState().disputes.find((dispute) => dispute.orderId === orderId) } diff --git a/lib/api/reviews.ts b/lib/api/reviews.ts index c4da795..1716ffe 100644 --- a/lib/api/reviews.ts +++ b/lib/api/reviews.ts @@ -1,13 +1,13 @@ -import { mockReviews } from "@/lib/mock" +import { useReviewStore } from "@/store/reviews" export function listReviews() { - return mockReviews + return useReviewStore.getState().reviews } export function listReviewsByOrder(orderId: string) { - return mockReviews.filter((review) => review.orderId === orderId) + return useReviewStore.getState().reviews.filter((review) => review.orderId === orderId) } export function listReviewsByTargetUser(userId: string) { - return mockReviews.filter((review) => review.toUserId === userId) + return useReviewStore.getState().reviews.filter((review) => review.toUserId === userId) } diff --git a/lib/api/transactions.ts b/lib/api/transactions.ts index 195ead5..7ced12f 100644 --- a/lib/api/transactions.ts +++ b/lib/api/transactions.ts @@ -1,5 +1,5 @@ -import { mockTransactions } from "@/lib/mock" +import { useWalletStore } from "@/store/wallet" export function listTransactions() { - return mockTransactions + return useWalletStore.getState().transactions }