Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 19 additions & 11 deletions src/components/home/RankingPreview.jsx
Original file line number Diff line number Diff line change
@@ -1,33 +1,41 @@
import { useEffect, useState } from "react";
import { getMyRankingAPI, getRankingListAPI } from "services/home/ranking";
import { getRankingListAPI } from "services/home/ranking";
import "styles/components/home/RankingPreview.scss";
import { getAuthToken } from "utils/token";
export const RankingPreview = () => {
const [rankingData, setRankingData] = useState([]);
const [myScore, setMyScore] = useState(null);

useEffect(() => {
const fetchRanking = async () => {
try {
// 🔹 내 랭킹 먼저 가져오기
const myRes = await getMyRankingAPI();
const me = myRes?.data || myRes;

if (me) {
setMyScore(me.exp);
}

// 🔹 전체 랭킹 가져오기
// 전체 랭킹 먼저 조회
const listRes = await getRankingListAPI();
const list = listRes?.data || listRes || [];
setRankingData(list);

// 액세스 토큰이 있을 때만 내 랭킹 조회
const { accessToken } = getAuthToken();

if (accessToken) {
const myRes = 0;
const me = myRes?.data || myRes;

if (me) {
setMyScore(me.exp);
}
} else {
// 토큰 없으면 '-' 유지
setMyScore("-");
}
} catch (e) {
console.error("랭킹 프리뷰 조회 실패:", e);
}
};

fetchRanking();
}, []);
console.log(rankingData);

return (
<div className="ranking-preview-container">
<h2>랭킹 </h2>
Expand Down
49 changes: 33 additions & 16 deletions src/pages/home/RankingPage.jsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,42 @@
import SideRankingList from "components/home/SideRankingList";
import { useEffect, useState } from "react";
import { getMyRankingAPI, getRankingListAPI } from "services/home/ranking";
import { getAuthToken } from "utils/token"; // 🔹 토큰 가져오는 함수
import "styles/pages/home/RankingPage.scss";

const RankingPage = () => {
const [rankingList, setRankingList] = useState([]);
const [myRank, setMyRank] = useState(null);
const [myScore, setMyScore] = useState(null);
const [myRank, setMyRank] = useState("-");
const [myScore, setMyScore] = useState("-");
const [topList, setTopList] = useState([]);
const [nearList, setNearList] = useState([]);

useEffect(() => {
const fetchRanking = async () => {
try {
// ② 내 랭킹 조회
const myRes = await getMyRankingAPI();
const me = myRes?.data || myRes;

if (!me) return;

// 전체 랭킹 조회 (7명까지)
// 전체 랭킹 조회 (상위 7명)
const fullRes = await getRankingListAPI();
const list = fullRes?.data || fullRes || [];
setRankingList(list);
setTopList(list.slice(0, 7));

// 액세스 토큰이 없으면 여기서 종료 → "-" 유지
const { accessToken } = getAuthToken();
if (!accessToken) {
setNearList([]); // 근처 랭킹 없음
return;
}

// 내 랭킹 조회
const myRes = await getMyRankingAPI();
const me = myRes?.data || myRes;

if (!me) return;

setMyRank(me.rank);
setMyScore(me.exp);

// 근처 랭킹 계산 (위 아래 3명)
// 🔹 근처 랭킹 계산
const myIndex = list.findIndex((item) => item.rank === me.rank);
const start = Math.max(myIndex - 3, 0);
const end = Math.min(myIndex + 4, list.length);
Expand All @@ -41,39 +49,48 @@ const RankingPage = () => {
fetchRanking();
}, []);

// 바로 위 등수와의 점수 차이
// 바로 위 등수와의 점수 차이 (1등이거나 토큰 없음 또는 내 정보 없으면 0)
const diffScore =
myRank > 1 && rankingList.length >= myRank - 1
typeof myRank === "number" && myRank > 1 && rankingList.length >= myRank - 1
? rankingList[myRank - 2].exp - myScore
: 0;

return (
<div className="ranking-page-wrapper">
<div className="ranking-page">
{/* 상위 랭킹 */}
<SideRankingList title="상위 랭킹" list={topList} />

{/* 내 랭킹 영역 */}
<div className="ranking-center">
<div className="rank-label">내 등수</div>
<div className="my-rank">
<span className="rank-number">{myRank ?? "-"}</span>
<span className="rank-number">{myRank}</span>
<span className="rank-unit">등</span>
</div>

<div className="score-row">
<span className="score-label">내 점수</span>
<span className="dashed-line"></span>
<span className="my-score">{myScore ?? 0} 점</span>
<span className="my-score">
{myScore === "-" ? "-" : `${myScore} 점`}
</span>
</div>
</div>

{/* 내 근처 랭킹 (- 일 때도 자동 처리됨) */}
<SideRankingList
title="내 근처 랭킹"
list={nearList}
list={myRank === "-" ? [] : nearList}
highlightRank={myRank}
/>
</div>

{/* 하단 배너 */}
<div className="bottom-banner">
{myRank === 1 ? (
{myRank === "-" ? (
<p>개인 랭킹 정보가 없어요!</p>
) : myRank === 1 ? (
<p>현재 1등입니다!</p>
) : (
<p>
Expand Down