11import React , { useState , useEffect } from 'react' ;
22import { StyledText } from '../../../components/Text/StyledText' ;
33import theme from '../../../styles/theme' ;
4- import { FavoritesContainer , FavoritesMent , FeedContainer , UserContainer , UserRow } from './styles' ;
4+ import {
5+ FavoritesContainer ,
6+ FavoritesMent ,
7+ FeedContainer ,
8+ UserContainer ,
9+ UserRow ,
10+ NoFavoriteContainer ,
11+ } from './styles' ;
512import Feed from './Feed' ;
6- import { FeedProps , UserProps , UserInterestsResponse , UserPostsResponse } from './dto' ;
13+ import { FavoritesProps , FeedProps , UserProps , UserInterestsResponse , UserPostsResponse } from './dto' ;
714import User from './User' ;
815import Loading from '../../../components/Loading' ;
9- import request from '../../../apis/core' ;
16+ import request , { BaseResponse } from '../../../apis/core' ;
1017
11- const Favorites : React . FC = ( ) => {
12- const [ selectedUser , setSelectedUser ] = useState < number | null > ( null ) ; // 초기값을 null로 설정
18+ const Favorites : React . FC < FavoritesProps > = ( ) => {
19+ const [ selectedUser , setSelectedUser ] = useState < number | null > ( null ) ;
1320 const [ users , setUsers ] = useState < UserProps [ ] > ( [ ] ) ;
1421 const [ feeds , setFeeds ] = useState < FeedProps [ ] > ( [ ] ) ;
1522 const [ isUserLoading , setIsUserLoading ] = useState ( false ) ;
1623 const [ isFeedLoading , setIsFeedLoading ] = useState ( false ) ;
1724
18- // 관심 친구 목록을 서버에서 가져오는 함수
19- const fetchUserInterests = async ( ) => {
25+ // 즐겨찾기 친구 목록을 서버에서 가져오는 함수
26+ const fetchFavoriteUsers = async ( ) => {
2027 setIsUserLoading ( true ) ;
2128 try {
22- const response : UserInterestsResponse = await request . get ( '/user-interests' ) ;
23- if ( response . isSuccess ) {
24- const userData = response . result . map ( ( user : any ) => ( {
29+ // 매칭 요청한 친구 목록 요청
30+ const requestedResponse : BaseResponse = await request . get ( '/user-relationships/requested' ) ;
31+ let requestedUserData : UserProps [ ] = [ ] ;
32+
33+ if ( requestedResponse . isSuccess ) {
34+ requestedUserData = requestedResponse . result . map ( ( relationship : any ) => {
35+ const target = relationship . target ;
36+ return {
37+ userId : target . id ,
38+ userImgUrl : target . profilePictureUrl ,
39+ userName : target . nickname || target . name ,
40+ } ;
41+ } ) ;
42+ } else {
43+ console . error ( 'Failed to fetch requested users' ) ;
44+ }
45+
46+ // 관심 친구 목록 요청
47+ const interestsResponse : UserInterestsResponse = await request . get ( '/user-interests' ) ;
48+ let interestedUserData : UserProps [ ] = [ ] ;
49+
50+ if ( interestsResponse . isSuccess ) {
51+ interestedUserData = interestsResponse . result . map ( ( user : any ) => ( {
2552 userId : user . friendId ,
2653 userImgUrl : user . profilePictureUrl ,
27- userName : user . nickname ,
54+ userName : user . nickname || user . name ,
2855 } ) ) ;
29- setUsers ( userData ) ;
3056 } else {
31- console . error ( 'Failed to fetch user interests ' ) ;
57+ console . error ( 'Failed to fetch interested users ' ) ;
3258 }
59+
60+ // 두 데이터를 합쳐서 중복된 userId를 제거하고 users로 설정
61+ const combinedData = [ ...requestedUserData , ...interestedUserData ] ;
62+ const uniqueUsers = Array . from ( new Map ( combinedData . map ( ( user ) => [ user . userId , user ] ) ) . values ( ) ) ;
63+
64+ setUsers ( uniqueUsers ) ;
3365 } catch ( error ) {
34- console . error ( 'Error fetching user interests :' , error ) ;
66+ console . error ( 'Error fetching users :' , error ) ;
3567 } finally {
3668 setIsUserLoading ( false ) ;
3769 }
@@ -45,6 +77,7 @@ const Favorites: React.FC = () => {
4577 if ( response . isSuccess ) {
4678 const feedData = response . result . posts . map ( ( post : any ) => ( {
4779 postId : post . postId , // postId 추가
80+ userId : userId ,
4881 profileUrl : users . find ( ( user ) => user . userId === userId ) ?. userImgUrl || '' ,
4982 userName : users . find ( ( user ) => user . userId === userId ) ?. userName || '' ,
5083 feedImgUrl : post . firstPhoto ,
@@ -62,11 +95,18 @@ const Favorites: React.FC = () => {
6295 }
6396 } ;
6497
65- // 관심 친구 목록을 가져오는 effect
98+ // 컴포넌트가 마운트되거나 탭이 선택될 때마다 fetchFavoriteUsers 호출
6699 useEffect ( ( ) => {
67- fetchUserInterests ( ) ;
100+ fetchFavoriteUsers ( ) ;
68101 } , [ ] ) ;
69102
103+ // users가 업데이트될 때, 첫 번째 사용자를 selectedUser로 설정
104+ useEffect ( ( ) => {
105+ if ( users . length > 0 ) {
106+ setSelectedUser ( users [ 0 ] . userId ) ;
107+ }
108+ } , [ users ] ) ;
109+
70110 // 특정 친구를 클릭했을 때 해당 유저의 게시물을 가져오는 effect
71111 useEffect ( ( ) => {
72112 if ( selectedUser !== null ) {
@@ -89,7 +129,7 @@ const Favorites: React.FC = () => {
89129 < UserContainer >
90130 { isUserLoading ? (
91131 < Loading />
92- ) : (
132+ ) : users . length !== 0 ? (
93133 < UserRow >
94134 { users . map ( ( user ) => (
95135 < User
@@ -100,11 +140,25 @@ const Favorites: React.FC = () => {
100140 />
101141 ) ) }
102142 </ UserRow >
143+ ) : (
144+ < NoFavoriteContainer >
145+ < StyledText $textTheme = { { style : 'heading2-light' , lineHeight : 2 } } color = { theme . colors . black } >
146+ 즐겨찾기 친구가 없습니다
147+ </ StyledText >
148+ < StyledText $textTheme = { { style : 'heading2-light' , lineHeight : 2 } } color = { theme . colors . black } >
149+ 친구 신청 또는
150+ </ StyledText >
151+ < StyledText $textTheme = { { style : 'heading2-light' , lineHeight : 2 } } color = { theme . colors . black } >
152+ 관심 친구 등록을 해보세요 !
153+ </ StyledText >
154+ </ NoFavoriteContainer >
103155 ) }
104156 </ UserContainer >
105- < FeedContainer >
106- { isFeedLoading ? < Loading /> : feeds . map ( ( feed , index ) => < Feed key = { index } feed = { feed } /> ) }
107- </ FeedContainer >
157+ { ! isUserLoading && (
158+ < FeedContainer >
159+ { isFeedLoading ? < Loading /> : feeds . map ( ( feed , index ) => < Feed key = { index } feed = { feed } /> ) }
160+ </ FeedContainer >
161+ ) }
108162 </ FavoritesContainer >
109163 ) ;
110164} ;
0 commit comments