"use client"; import React, { useState, useEffect, useCallback } from "react"; import { useRouter } from "next/navigation"; import { ChevronLeft, MessageSquare, ArrowUpCircle, ArrowDownCircle, Gift, Users, Video, Zap, } from "lucide-react"; import Image from "next/image"; import InfiniteScroll from "react-infinite-scroll-component"; import Link from "next/link"; const PAGE_SIZE = 10; const PersonalCenter = () => { const router = useRouter(); const [user, setUser] = useState(null); const [predictions, setPredictions] = useState([]); const [points, setPoints] = useState([]); const [isLoading, setIsLoading] = useState(true); const [predictionPage, setPredictionPage] = useState(1); const [pointPage, setPointPage] = useState(1); const [hasMorePredictions, setHasMorePredictions] = useState(true); const [hasMorePoints, setHasMorePoints] = useState(true); const [activities, setActivities] = useState([]); const fetchInitialData = useCallback(async () => { try { setIsLoading(true); const storedUser = JSON.parse( localStorage.getItem("currentUser") || "null" ); setUser(storedUser); if (storedUser && storedUser.id) { const [ predictionResponse, pointResponse, userResponse, activitiesResponse, ] = await Promise.all([ fetch( `/api/prediction?username=${encodeURIComponent( storedUser.username )}¤t=1&pageSize=${PAGE_SIZE}` ), fetch( `/api/point-history?userId=${encodeURIComponent( storedUser.id )}¤t=1&pageSize=${PAGE_SIZE}` ), fetch(`/api/user?id=${encodeURIComponent(storedUser.id)}`), fetch("/api/new-activities", { headers: { "x-from-frontend": "true", }, }), ]); const [predictionData, pointData, userData, activitiesData] = await Promise.all([ predictionResponse.json(), pointResponse.json(), userResponse.json(), activitiesResponse.json(), ]); if (predictionData.success) { setPredictions(predictionData.data); setHasMorePredictions(predictionData.data.length === PAGE_SIZE); } else { console.error("Failed to fetch predictions:", predictionData.error); } if (pointData.success) { setPoints(pointData.data); setHasMorePoints(pointData.data.length === PAGE_SIZE); } else { console.error("Failed to fetch point history:", pointData.error); } if (userData.success && userData.data) { const updatedUser = { ...storedUser, points: userData.data.points }; setUser(updatedUser); localStorage.setItem("currentUser", JSON.stringify(updatedUser)); } else { console.error("Failed to fetch user data:", userData.error); } // 处理活动数据 if (activitiesData.success) { setActivities(activitiesData.data); } else { console.error("Failed to fetch activities:", activitiesData.error); } } else { // 如果用户未登录,仍然获取活动数据 const activitiesResponse = await activitiesPromise; const activitiesData = await activitiesResponse.json(); if (activitiesData.success) { setActivities(activitiesData.data); } else { console.error("Failed to fetch activities:", activitiesData.error); } } } catch (error) { console.error("Error fetching data:", error); } finally { setIsLoading(false); } }, []); useEffect(() => { fetchInitialData(); }, [fetchInitialData]); const loadMorePredictions = async () => { if (!hasMorePredictions || !user) return; try { const response = await fetch( `/api/prediction?username=${encodeURIComponent( user.username )}¤t=${predictionPage + 1}&pageSize=${PAGE_SIZE}` ); const data = await response.json(); if (data.success) { setPredictions((prev) => [...prev, ...data.data]); setPredictionPage((prev) => prev + 1); setHasMorePredictions(data.data.length === PAGE_SIZE); } else { console.error("Failed to fetch more predictions:", data.error); } } catch (error) { console.error("Error fetching more predictions:", error); } }; const loadMorePoints = async () => { if (!hasMorePoints || !user) return; try { const response = await fetch( `/api/point-history?userId=${encodeURIComponent(user.id)}¤t=${ pointPage + 1 }&pageSize=${PAGE_SIZE}` ); const data = await response.json(); if (data.success) { setPoints((prev) => [...prev, ...data.data]); setPointPage((prev) => prev + 1); setHasMorePoints(data.data.length === PAGE_SIZE); } else { console.error("Failed to fetch more point history:", data.error); } } catch (error) { console.error("Error fetching more point history:", error); } }; const handleExchangePoints = () => { console.log("兑换积分"); // router.push('/exchange-points'); }; if (isLoading) { return (
Loading...
); } if (!user) { return (
User not found
); } return (
router.back()} size={32} />

个人中心

User Avatar

{user.username}

积分: {user.points}

{activities && activities.length > 0 && (

最新活动

{activities.map((activity) => ( {activity.icon && (
{activity.title}
)}

{activity.title}

))}
)}

预测记录

加载中...} endMessage={

没有更多记录了

} scrollableTarget="predictionScroll" > {predictions.map((prediction) => (

{prediction.matchInfo}

比赛时间:{" "} {prediction.matchTime}

胜负预测:{" "} {prediction.whoWillWin === "home" ? "主胜" : prediction.whoWillWin === "away" ? "客胜" : "平局"}

结果:{" "} {prediction.whoWillWinResult === "correct" ? "正确" : prediction.whoWillWinResult === "incorrect" ? "错误" : "待定"}

首先得分:{" "} {prediction.firstTeamToScore === "home" ? "主队" : prediction.firstTeamToScore === "away" ? "客队" : "无进球"}

结果:{" "} {prediction.firstTeamToScoreResult === "correct" ? "正确" : prediction.firstTeamToScoreResult === "incorrect" ? "错误" : "待定"}

总进球数预测:{" "} {prediction.totalGoals}

结果:{" "} {prediction.totalGoalsResult === "correct" ? "正确" : prediction.totalGoalsResult === "incorrect" ? "错误" : "待定"}

获得积分:{" "} {prediction.pointsEarned !== null ? prediction.pointsEarned : "待定"}

))}

积分记录

Loading...} endMessage={

没有更多记录了

} scrollableTarget="pointScroll" > {points.map((point) => (
{point.points > 0 ? ( ) : ( )}

{new Date(point.createdAt).toLocaleDateString()}

{point.reason}

0 ? "text-green-600" : "text-red-600" }`} > {point.points > 0 ? "+" : ""} {point.points}
))}
); }; export default PersonalCenter;