diff --git a/src/pages/MyPage/components/aside/Aside.jsx b/src/pages/MyPage/components/aside/Aside.jsx index 75de1b8..38c2bfb 100644 --- a/src/pages/MyPage/components/aside/Aside.jsx +++ b/src/pages/MyPage/components/aside/Aside.jsx @@ -10,8 +10,8 @@ import { useSelector } from 'react-redux'; import { useQuery } from '@tanstack/react-query'; import { useState } from 'react'; +import UserFollow from '../userfollower/UserFollow.jsx'; import { getUserApi } from '@/apis/userApi'; -import UserFollow from '../userfollower/UserFollow'; const Aside = () => { const { userId, userFullName } = useSelector(state => state.user); diff --git a/src/pages/MyPage/components/userfollower/UserFollow.jsx b/src/pages/MyPage/components/userfollower/UserFollow.jsx new file mode 100644 index 0000000..d514360 --- /dev/null +++ b/src/pages/MyPage/components/userfollower/UserFollow.jsx @@ -0,0 +1,147 @@ +import PropTypes from 'prop-types'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useState } from 'react'; +import { followUser, unfollowUser } from '@/apis/followApi'; +import FollowingTab from './followingTab/FollowingTab'; +import FollowerTab from './followerTab/FollowerTab'; +import { getUserApi } from '@/apis/userApi'; + +const UserFollow = ({ isOpen, closeModal, userData, userName }) => { + const [tapMenu, setTapMenu] = useState('follower'); + const queryClient = useQueryClient(); + + const { data: followerData } = useQuery({ + queryKey: ['followers', userData?.followers], + queryFn: async () => { + if (!userData?.followers) return []; + return Promise.all( + userData.followers.map(async element => { + const followerUser = await getUserApi(element.follower); + + return { + _id: followerUser._id, + fullName: followerUser.fullName, + image: followerUser.image, + followerForFollower: false, + }; + }), + ); + }, + }); + + const { data: followingData } = useQuery({ + queryKey: ['followings', userData?.following], + queryFn: async () => { + if (!userData?.following) return []; + return Promise.all( + userData.following.map(async element => { + const followingUser = await getUserApi(element.user); + return { + id: followingUser._id, + image: followingUser.image, + fullName: followingUser.fullName, + following_ID: element._id, + user_ID: followingUser._id, + }; + }), + ); + }, + }); + + const { mutate: unfollowHandler } = useMutation({ + mutationFn: async userId => { + await unfollowUser(userId); + }, + onSuccess: () => { + queryClient.invalidateQueries(['followings', userData?.following]); + }, + onError: error => { + console.error('언팔로우 실패:', error); + alert('언팔로우 요청이 실패했습니다. 다시 시도해주세요.'); + }, + }); + + const unfollowUserHandler = userId => { + const isChecked = window.confirm('정말로 언팔하시겠습니까?'); + + if (isChecked) { + unfollowHandler(userId); + } + }; + + const { mutate: followHandler } = useMutation({ + mutationFn: async userId => { + await followUser(userId); + }, + onSuccess: () => { + queryClient.invalidateQueries(['followers', userData?.followers]); + }, + }); + + if (!isOpen) return null; + + return ( +