Skip to content

Commit eed3ca4

Browse files
authored
merge: 팔로우 버튼 갱신 디버깅 및 최적화
fix: 팔로우 버튼 갱신 디버깅 및 최적화
2 parents cfc4248 + 78739bc commit eed3ca4

5 files changed

Lines changed: 145 additions & 114 deletions

File tree

src/components/FollowList/MyFollowList.jsx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,35 @@ const FOLLOWER = 'follower';
1313
//TODO: follows 데이터 구조
1414
// const followData = [{ followId: '', userData: {}, followData: {}}]; // 팔로잉 기준 전부 isFollow true
1515

16-
const FollowList = ({ followList, tab, handleFollowSuccess }) => {
16+
const FollowList = ({ followList, tab, handleFollowChange }) => {
1717
const { currentUser, onFollow, onUnfollow } = useUserContext();
1818
const [isModal, setIsModal] = useState(false);
1919
const [unfollowId, setUnfollowId] = useState('');
20-
const [isFollowSuccess, setIsFollowSuccess] = useState(false);
20+
const [isFollowChange, setIsFollowChange] = useState(false);
2121

2222
const onClose = () => {
2323
setIsModal(false);
2424
};
2525

26-
const hadleFollow = useCallback(
26+
const handleFollow = useCallback(
2727
(followId, userId) => {
2828
if (!currentUser.following.some((follow) => follow.user === userId)) {
2929
onFollow({ userId, followId });
30-
setIsFollowSuccess(true);
30+
setIsFollowChange(true);
31+
handleFollowChange(true);
3132
} else {
32-
setIsFollowSuccess(false);
33+
setIsFollowChange(false);
3334
}
3435
setIsModal(true);
35-
handleFollowSuccess(isFollowSuccess);
3636
},
37-
[currentUser, onFollow, handleFollowSuccess, isFollowSuccess],
37+
[currentUser, onFollow, handleFollowChange],
3838
);
3939

40-
const hadleUnFollow = useCallback(() => {
40+
const handleUnFollow = useCallback(() => {
4141
onUnfollow({ unfollowId });
4242
setIsModal(false);
43-
handleFollowSuccess(true);
44-
}, [unfollowId, onUnfollow, handleFollowSuccess]);
43+
handleFollowChange(true);
44+
}, [unfollowId, onUnfollow, handleFollowChange]);
4545

4646
return (
4747
//TODO: user._id:
@@ -84,7 +84,7 @@ const FollowList = ({ followList, tab, handleFollowSuccess }) => {
8484
fontSize="16px"
8585
style={{ ...followButtonStyle }}
8686
onClick={() => {
87-
hadleFollow(followId, followData.follower);
87+
handleFollow(followId, followData.follower);
8888
}}
8989
>
9090
팔로우
@@ -93,7 +93,7 @@ const FollowList = ({ followList, tab, handleFollowSuccess }) => {
9393
</ProfileContainer>
9494
);
9595
})}{' '}
96-
{tab === FOLLOWER && !isFollowSuccess && isModal && (
96+
{tab === FOLLOWER && !isFollowChange && isModal && (
9797
<Modal visible={isModal} onClose={onClose}>
9898
<Modal.Content
9999
title="팔로우 실패했어요!"
@@ -103,7 +103,7 @@ const FollowList = ({ followList, tab, handleFollowSuccess }) => {
103103
<Modal.Button onClick={onClose}>확인</Modal.Button>
104104
</Modal>
105105
)}
106-
{tab === FOLLOWER && isFollowSuccess && isModal && (
106+
{tab === FOLLOWER && isFollowChange && isModal && (
107107
<Modal visible={isModal} onClose={onClose}>
108108
<Modal.Content title="팔로우에 성공했어요!" onClose={onClose} />
109109
<Modal.Button onClick={onClose}>확인</Modal.Button>
@@ -118,7 +118,7 @@ const FollowList = ({ followList, tab, handleFollowSuccess }) => {
118118
/>
119119
<Modal.Button
120120
onClick={() => {
121-
hadleUnFollow();
121+
handleUnFollow();
122122
}}
123123
>
124124
확인

src/pages/FollowPage/index.jsx

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,10 @@ const FollowPage = () => {
1616
const [followingData, setFollowingData] = useState([]); // 얘는 해당 user(id) 유저 정보들의 배열 vs following은 id가 담긴 배열
1717
const [followerData, setFollowerData] = useState([]); // 얘는 해당 follower(id) 유저 정보들의 배열 vs followers는 id가 담긴 배열
1818
const { currentUser } = useUserContext();
19-
const [isFollowSuccess, setIsFollowSuccess] = useState(false);
19+
const [isFollowChange, setIsFollowChange] = useState(false);
2020

21-
useEffect(() => {
22-
if (currentUser.id !== id) {
23-
handleGetUser();
24-
setIsMyFollow(false);
25-
} else {
26-
setUser(currentUser);
27-
setIsMyFollow(true);
28-
}
29-
}, [currentUser]);
30-
31-
const handleFollowSuccess = (value) => {
32-
setIsFollowSuccess(value);
21+
const handleFollowChange = (value) => {
22+
setIsFollowChange(value);
3323
};
3424

3525
//TODO:신영 현재 페이지 유저의 정보 => 전역데이터가 아닌 경우 context를 사용할 수 없어서 직접 api 호출
@@ -45,6 +35,16 @@ const FollowPage = () => {
4535
setCurrentTab(value);
4636
};
4737

38+
useEffect(() => {
39+
if (currentUser.id !== id) {
40+
handleGetUser();
41+
setIsMyFollow(false);
42+
} else {
43+
setUser(currentUser);
44+
setIsMyFollow(true);
45+
}
46+
}, [currentUser, id, handleGetUser]);
47+
4848
//FOLLOWING: 내가 팔로잉 한 사람들 user: 그놈들 id , follower: 내 id
4949
const handleGetFollowing = useCallback(async () => {
5050
const { following } = user;
@@ -63,6 +63,7 @@ const FollowPage = () => {
6363
} else {
6464
setFollowingData([]);
6565
}
66+
setIsFollowChange(false);
6667
}, [user]);
6768

6869
//FOLLOWERS: 나를 팔로잉 한 사람들 user: 내 id , follower: 그 놈들 id
@@ -81,17 +82,24 @@ const FollowPage = () => {
8182
);
8283
setFollowerData(data);
8384
}
85+
setIsFollowChange(false);
8486
}, [user]);
85-
87+
8688
useEffect(() => {
87-
if (currentTab === FOLLOWING && (followingData.length === 0 || isFollowSuccess)) {
89+
if (currentTab === FOLLOWING && (followingData.length === 0 || isFollowChange)) {
8890
handleGetFollowing();
89-
setIsFollowSuccess(false);
9091
} else if (currentTab === FOLLOWER && followerData.length === 0) {
9192
handleGetFollowers();
92-
setIsFollowSuccess(false);
9393
}
94-
}, [user, currentTab]);
94+
}, [
95+
currentTab,
96+
user,
97+
isFollowChange,
98+
followingData,
99+
followerData,
100+
handleGetFollowing,
101+
handleGetFollowers,
102+
]);
95103

96104
return (
97105
<PageWrapper header nav prev title={user.fullName}>
@@ -101,7 +109,7 @@ const FollowPage = () => {
101109
<MyFollowList
102110
followList={followerData}
103111
tab={FOLLOWER}
104-
handleFollowSuccess={handleFollowSuccess}
112+
handleFollowChange={handleFollowChange}
105113
/>
106114
) : (
107115
<FollowList followList={followerData} />
@@ -112,7 +120,7 @@ const FollowPage = () => {
112120
<MyFollowList
113121
followList={followingData}
114122
tab={FOLLOWING}
115-
handleFollowSuccess={handleFollowSuccess}
123+
handleFollowChange={handleFollowChange}
116124
/>
117125
) : (
118126
<FollowList followList={followingData} />

src/pages/UserPage/PostData.jsx

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import {
2+
GRID_INACTIVE,
3+
GRID_ACTIVE,
4+
HEART_INACTIVE,
5+
HEART_ACTIVE,
6+
} from 'utils/constants/icons/names';
7+
import { Icon, PostImageContainer, Tab } from 'components';
8+
import React, { useEffect, useState, useCallback } from 'react';
9+
import { getPostData } from 'utils/apis/postApi';
10+
11+
const USER_POSTS = 'userPosts';
12+
const LIKE_POSTS = 'likePosts';
13+
14+
const PostData = ({ user }) => {
15+
const [userLikePosts, setUserLikePosts] = useState([]);
16+
const [currentTab, setCurrentTab] = useState(USER_POSTS);
17+
18+
const onActive = (value) => {
19+
setCurrentTab(value);
20+
};
21+
22+
const handleGetLikePosts = useCallback(async () => {
23+
const { likes } = user;
24+
if (likes.length !== 0) {
25+
try {
26+
const data = await Promise.allSettled(
27+
likes.map((like) => getPostData(like.post).then((result) => result.data)),
28+
);
29+
setUserLikePosts(data);
30+
} catch (error) {
31+
console.error(error);
32+
}
33+
}
34+
}, [user]);
35+
36+
useEffect(() => {
37+
if (currentTab === LIKE_POSTS && user.likes.length !== 0) {
38+
handleGetLikePosts();
39+
}
40+
}, [user]);
41+
42+
useEffect(() => {
43+
if (currentTab === LIKE_POSTS && userLikePosts.length === 0) {
44+
handleGetLikePosts();
45+
}
46+
}, [currentTab, handleGetLikePosts, userLikePosts]);
47+
48+
return (
49+
<Tab onActive={onActive}>
50+
<Tab.Item
51+
icon={{
52+
active: <Icon name={GRID_ACTIVE} size={24} />,
53+
inactive: <Icon name={GRID_INACTIVE} size={24} />,
54+
}}
55+
index={USER_POSTS}
56+
>
57+
<PostImageContainer posts={user.posts} />
58+
</Tab.Item>
59+
<Tab.Item
60+
icon={{
61+
active: <Icon name={HEART_ACTIVE} size={24} />,
62+
inactive: <Icon name={HEART_INACTIVE} size={24} />,
63+
}}
64+
index={LIKE_POSTS}
65+
>
66+
<PostImageContainer posts={userLikePosts} />
67+
</Tab.Item>
68+
</Tab>
69+
);
70+
};
71+
72+
export default React.memo(PostData);

src/pages/UserPage/UserData.jsx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState, useCallback } from 'react';
1+
import React, { useEffect, useState, useCallback } from 'react';
22
import { Text, Avatar, Button, Image, Modal } from 'components';
33
import { useUserContext } from 'contexts/UserContext';
44
import theme from 'styles/theme';
@@ -18,12 +18,20 @@ import {
1818

1919
const UserData = ({ user, pageUserId, userLevel }) => {
2020
const { currentUser, onFollow, onUnfollow } = useUserContext();
21-
const checkFollow = currentUser.following.some((follow) => follow.user === pageUserId);
22-
const [isFollow, setIsFollow] = useState(checkFollow);
21+
const followData = currentUser.following.filter((follow) => follow.user === pageUserId);
22+
const [isFollow, setIsFollow] = useState(false);
2323
const [isFollowModal, setIsFollowModal] = useState(false);
2424
const [isUnFollowModal, setIsUnFollowModal] = useState(false);
2525
const [followers, setFollowers] = useState();
2626

27+
useEffect(() => {
28+
setIsFollow(followData.length === 0 ? false : true);
29+
}, [followData]);
30+
31+
useEffect(() => {
32+
setFollowers(user.followers.length);
33+
}, [user]);
34+
2735
const navigate = useNavigate();
2836

2937
const onCloseFollow = () => {
@@ -34,7 +42,7 @@ const UserData = ({ user, pageUserId, userLevel }) => {
3442
setIsUnFollowModal(false);
3543
};
3644

37-
const hadleFollow = useCallback(() => {
45+
const handleFollow = useCallback(() => {
3846
if (!isFollow) {
3947
onFollow({ userId: pageUserId, followId: '' });
4048
setIsFollowModal(true);
@@ -44,9 +52,7 @@ const UserData = ({ user, pageUserId, userLevel }) => {
4452
setIsFollow(true);
4553
}, [pageUserId, isFollow, onFollow, followers]);
4654

47-
const hadleUnFollow = useCallback(() => {
48-
const followData = currentUser.following.filter((follow) => follow.user === pageUserId);
49-
55+
const handleUnFollow = useCallback(() => {
5056
if (followData.length !== 0) {
5157
onUnfollow({ unfollowId: followData[0]._id });
5258
setIsFollow(false);
@@ -55,11 +61,7 @@ const UserData = ({ user, pageUserId, userLevel }) => {
5561
}
5662
}
5763
setIsUnFollowModal(false);
58-
}, [pageUserId, currentUser, onUnfollow, followers]);
59-
60-
useEffect(() => {
61-
setFollowers(user.followers.length);
62-
}, [user]);
64+
}, [followData, onUnfollow, followers]);
6365

6466
return (
6567
<UserInfo>
@@ -127,7 +129,7 @@ const UserData = ({ user, pageUserId, userLevel }) => {
127129
borderRadius={10}
128130
fontSize="16px"
129131
style={{ ...followButtonStyle }}
130-
onClick={hadleFollow}
132+
onClick={handleFollow}
131133
>
132134
팔로우
133135
</Button>
@@ -150,7 +152,7 @@ const UserData = ({ user, pageUserId, userLevel }) => {
150152
/>
151153
<Modal.Button
152154
onClick={() => {
153-
hadleUnFollow();
155+
handleUnFollow();
154156
}}
155157
>
156158
확인
@@ -167,7 +169,7 @@ const UserData = ({ user, pageUserId, userLevel }) => {
167169
);
168170
};
169171

170-
export default UserData;
172+
export default React.memo(UserData);
171173

172174
UserData.propTypes = {
173175
user: PropTypes.object,

0 commit comments

Comments
 (0)