@@ -20,7 +20,7 @@ export default function MemberCard({
2020 userId,
2121 onUnfollow,
2222} : MemberCardProps ) {
23- const { followStatus, followedUserFnc , unFollowUserFnc } = useMemberStore ( ) ;
23+ const { followStatus } = useMemberStore ( ) ;
2424 const { currentUserId } = useProfileStore ( ) ;
2525 const { createRoom, isLoading : isCreatingRoom } = useCreateChatRoom ( ) ;
2626 const navigate = useNavigate ( ) ;
@@ -48,20 +48,72 @@ export default function MemberCard({
4848 document . removeEventListener ( "mousedown" , handleClickOutside ) ;
4949 } , [ ] ) ;
5050
51- const handleFollow = ( ) => {
52- if ( ! friend . users ?. auth_id ) return ;
51+ useEffect ( ( ) => {
52+ const fetchFollowStatus = async ( ) => {
53+ if ( ! currentUserId ) return ;
54+
55+ try {
56+ // 서버에서 로그인한 사용자가 팔로우한 목록 가져오기
57+ const friends = await useMemberStore
58+ . getState ( )
59+ . fetchUserFollowings ( currentUserId ) ;
60+
61+ // followStatus 맵 세팅
62+ friends . forEach ( ( friend ) => {
63+ if ( friend . users ?. auth_id ) {
64+ useMemberStore
65+ . getState ( )
66+ . setFollowStatus ( friend . users . auth_id , true ) ;
67+ }
68+ } ) ;
69+ } catch ( err ) {
70+ console . error ( "팔로우 상태 초기화 실패:" , err ) ;
71+ }
72+ } ;
73+
74+ fetchFollowStatus ( ) ;
75+ } , [ currentUserId ] ) ;
76+
77+ const handleFollow = async ( ) => {
78+ if ( ! friend . users ?. auth_id || ! currentUserId ) return ;
79+
80+ // 1️⃣ 화면에서 바로 팔로우 상태 변경 (Optimistic Update)
81+ useMemberStore . getState ( ) . setFollowStatus ( friend . users . auth_id , true ) ;
5382
54- if ( ! isFollowing ) {
55- followedUserFnc ( currentUserId ! , friend . users . auth_id ) ;
83+ try {
84+ // 2️⃣ 서버에 팔로우 요청
85+ await useMemberStore
86+ . getState ( )
87+ . followedUserFnc ( currentUserId , friend . users . auth_id ) ;
88+ } catch ( err ) {
89+ // 실패 시 상태 롤백
90+ useMemberStore
91+ . getState ( )
92+ . setFollowStatus ( friend . users . auth_id , false ) ;
93+ alert ( "팔로우에 실패했습니다. 다시 시도해주세요." ) ;
5694 }
95+
5796 setOpenId ( null ) ;
5897 } ;
5998
6099 const handleUnfollowClick = async ( ) => {
61100 if ( ! friend . users ?. auth_id || ! currentUserId ) return ;
62101
63- await unFollowUserFnc ( currentUserId , friend . users . auth_id ) ;
64- onUnfollow ?.( friend . users . auth_id ) ;
102+ useMemberStore . getState ( ) . setFollowStatus ( friend . users . auth_id , false ) ;
103+
104+ try {
105+ await useMemberStore
106+ . getState ( )
107+ . unFollowUserFnc ( currentUserId , friend . users . auth_id ) ;
108+ onUnfollow ?.( friend . users . auth_id ) ;
109+ } catch ( err ) {
110+ useMemberStore
111+ . getState ( )
112+ . setFollowStatus ( friend . users . auth_id , true ) ;
113+ alert ( "팔로우 취소에 실패했습니다. 다시 시도해주세요." ) ;
114+ }
115+
116+ setOpenId ( null ) ;
65117 } ;
66118
67119 const handleSendMessage = async ( ) => {
@@ -71,7 +123,7 @@ export default function MemberCard({
71123 const room = await createRoom ( friend . users . auth_id ) ;
72124 if ( room ) {
73125 navigate ( `/msg/${ room . id } ` ) ;
74- setOpenId ( null ) ; // 드롭다운 닫기
126+ setOpenId ( null ) ;
75127 }
76128 } catch ( error ) {
77129 console . error ( "채팅방 생성 실패:" , error ) ;
0 commit comments