diff --git a/src/api/user/level.api.ts b/src/api/user/level.api.ts new file mode 100644 index 0000000..cc68ac5 --- /dev/null +++ b/src/api/user/level.api.ts @@ -0,0 +1,12 @@ +import api from '@/api/api'; +import type { UserGradeResponse } from '@/types/level'; + +export const getUserGrade = async (): Promise => { + try { + const response = await api.get<{ data: UserGradeResponse }>('/profile'); + return response.data.data; // ✅ 두 번 접근 + } catch (err) { + console.error('레벨 정보 로딩 에러:', err); + throw err; + } +}; diff --git a/src/components/common/LevelCard/MyLevelCard.tsx b/src/components/common/LevelCard/MyLevelCard.tsx index d9b75cf..06934fc 100644 --- a/src/components/common/LevelCard/MyLevelCard.tsx +++ b/src/components/common/LevelCard/MyLevelCard.tsx @@ -48,10 +48,10 @@ const MyLevelCard: React.FC = ({
-

+

Lv.{userLevel} - {levelTitle} -

+ {levelTitle} +
diff --git a/src/constants/levelcondition.ts b/src/constants/levelcondition.ts index dfc70aa..ce5579a 100644 --- a/src/constants/levelcondition.ts +++ b/src/constants/levelcondition.ts @@ -11,25 +11,25 @@ export interface Level { export const LEVELS_DATA: Level[] = [ { level: 1, - title: '레벨 1 이름', + title: '옥수수 인턴 코니', condition: 'seeat 가입하기', Icon: LevelCharacter1, }, { level: 2, - title: '레벨 2 이름', + title: '영화관 탐험가 코니', condition: '후기 2개 작성하기\n좋아요 5개 누르기', Icon: LevelCharacter2, }, { level: 3, - title: '레벨 3 이름', + title: '영화관 평론가 코니', condition: '후기 10개 작성하기\n좋아요 25개 누르기', Icon: LevelCharacter3, }, { level: 4, - title: '레벨 4 이름', + title: '전설의 팝콘 코니', condition: '후기 40개 작성하기\n좋아요 100개 누르기', Icon: LevelCharacter4, }, diff --git a/src/pages/my/Level.tsx b/src/pages/my/Level.tsx index 14039a5..f21cf21 100644 --- a/src/pages/my/Level.tsx +++ b/src/pages/my/Level.tsx @@ -1,34 +1,47 @@ -// import { HeaderBasic } from '@/components'; -import { LevelInfoCard, MyLevelCard } from '@/components'; +import { useQuery } from '@tanstack/react-query'; +import { Header } from '@/components'; +import { LevelInfoCard, MyLevelCard } from '@/components'; import { LEVELS_DATA } from '@/constants/levelcondition'; +import type { UserGradeResponse } from '@/types/level'; +import { getUserGrade } from '@/api/user/level.api'; + +const gradeToLevelMap: { [key: string]: number } = { + BRONZE: 1, + SILVER: 2, + GOLD: 3, + PLATINUM: 4, +}; export default function LevelPage() { - // 나중에 API - const currentUser = { - level: 3, - progress: 45, - }; - const currentUserStatus = { - reviewCount: 5, - likeCount: 12, - }; + const { data, isLoading, error } = useQuery({ + queryKey: ['userGrade'], + queryFn: getUserGrade, + }); + + if (isLoading) return
로딩 중...
; + if (error || !data || !data.grade) return
데이터를 불러오지 못했습니다.
; + + const userLevelNumber = gradeToLevelMap[data.grade]; + + if (userLevelNumber === undefined) { + return
알 수 없는 레벨입니다.
; + } return (
- {/* {null} */} +
- {/* 현재 레벨 박스 */} - +
+ +
- {/* 구분선 */}
- {/* 레벨 리스트 */}
{LEVELS_DATA.map((levelData) => ( { navigate('/my/settings'); }; + const handleLevelCardClick = () => { + navigate('/my/level'); // 경로를 '/my/level'로 수정했습니다. + }; + if (isLoading) { return
프로필 불러오는 중
; } @@ -127,11 +131,13 @@ const MyPage: React.FC = () => {
- +
+ +
{/* 메뉴 리스트 */}
diff --git a/src/pages/search/ReviewSearch.tsx b/src/pages/search/ReviewSearch.tsx index 6d748b7..c48b76f 100644 --- a/src/pages/search/ReviewSearch.tsx +++ b/src/pages/search/ReviewSearch.tsx @@ -57,4 +57,3 @@ export default function ReviewSearchPage() { } - diff --git a/src/pages/search/ReviewSearchResult.tsx b/src/pages/search/ReviewSearchResult.tsx index ebf079a..5261628 100644 --- a/src/pages/search/ReviewSearchResult.tsx +++ b/src/pages/search/ReviewSearchResult.tsx @@ -43,4 +43,4 @@ export default function ReviewSearchResultPage() {
); -} +} \ No newline at end of file diff --git a/src/types/level.ts b/src/types/level.ts new file mode 100644 index 0000000..a881c37 --- /dev/null +++ b/src/types/level.ts @@ -0,0 +1,15 @@ +export interface UserGradeResponse { + id: number; + email: string; + socialId: string; + username: string; + nickname: string; + imageUrl: string | null; + grade: number; + genres: string[]; + social: 'KAKAO' | 'NAVER'; + auditoriums: string[]; + reviewCount: number; + likeCount: number; + levelExp: number; +}