From d93cfb366d4f852ac96740a0a4a3df388c59a218 Mon Sep 17 00:00:00 2001 From: heeyongKim <166043860+heeeeyong@users.noreply.github.com> Date: Sun, 17 Aug 2025 13:52:10 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=EB=82=B4=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84,=20=EB=8B=A4=EB=A5=B8=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C?= =?UTF-8?q?=20=EB=B6=84=EA=B8=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/Post/PostHeader.tsx | 9 ++- src/components/common/Post/Reply.tsx | 3 + src/components/common/Post/SubReply.tsx | 3 + src/components/feed/OtherFeed.tsx | 14 +++- src/components/feed/Profile.tsx | 12 +-- src/hooks/useOAuthToken.ts | 2 +- src/pages/feed/MyFeedPage.tsx | 92 +++++++++++++++++++++++ src/pages/feed/OtherFeedPage.tsx | 1 + src/pages/index.tsx | 2 + src/types/post.ts | 3 + src/types/profile.ts | 1 + 11 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 src/pages/feed/MyFeedPage.tsx diff --git a/src/components/common/Post/PostHeader.tsx b/src/components/common/Post/PostHeader.tsx index ec49a977..522b2ba9 100644 --- a/src/components/common/Post/PostHeader.tsx +++ b/src/components/common/Post/PostHeader.tsx @@ -8,6 +8,7 @@ interface PostHeaderProps { postDate: string; creatorId?: number; type?: 'post' | 'reply'; + isWriter?: boolean; } const PostHeader = ({ @@ -18,12 +19,18 @@ const PostHeader = ({ postDate, creatorId, type = 'post', + isWriter, }: PostHeaderProps) => { const navigate = useNavigate(); const handleClick = () => { if (creatorId) { - navigate(`/otherfeed/${creatorId}`); + // isWriter가 true면 MyFeedPage로, false면 OtherFeedPage로 이동 + if (isWriter) { + navigate(`/myfeed/${creatorId}`); + } else { + navigate(`/otherfeed/${creatorId}`); + } } }; diff --git a/src/components/common/Post/Reply.tsx b/src/components/common/Post/Reply.tsx index e09c7176..59f2b791 100644 --- a/src/components/common/Post/Reply.tsx +++ b/src/components/common/Post/Reply.tsx @@ -12,6 +12,7 @@ import { deleteComment } from '@/api/comments/deleteComment'; interface ReplyProps extends CommentData { onDelete?: () => void; + isWriter?: boolean; } const Reply = ({ @@ -27,6 +28,7 @@ const Reply = ({ likeCount: initialLikeCount, isDeleted, onDelete, + isWriter, }: ReplyProps) => { const [liked, setLiked] = useState(isLike); const [likeCount, setLikeCount] = useState(initialLikeCount); @@ -121,6 +123,7 @@ const Reply = ({ aliasColor={aliasColor} postDate={postDate} creatorId={creatorId} + isWriter={isWriter} type="reply" /> diff --git a/src/components/common/Post/SubReply.tsx b/src/components/common/Post/SubReply.tsx index 6faae4c0..d83edffa 100644 --- a/src/components/common/Post/SubReply.tsx +++ b/src/components/common/Post/SubReply.tsx @@ -13,6 +13,7 @@ import { deleteComment } from '@/api/comments/deleteComment'; interface SubReplyProps extends ReplyData { onDelete?: () => void; + isWriter?: boolean; } const SubReply = ({ @@ -29,6 +30,7 @@ const SubReply = ({ isLike, isDeleted, onDelete, + isWriter, }: SubReplyProps) => { const [liked, setLiked] = useState(isLike); const [currentLikeCount, setCurrentLikeCount] = useState(likeCount); @@ -143,6 +145,7 @@ const SubReply = ({ aliasColor={aliasColor} postDate={postDate} creatorId={creatorId} + isWriter={isWriter} type="reply" /> diff --git a/src/components/feed/OtherFeed.tsx b/src/components/feed/OtherFeed.tsx index 08d3d5ca..ce36a001 100644 --- a/src/components/feed/OtherFeed.tsx +++ b/src/components/feed/OtherFeed.tsx @@ -12,9 +12,16 @@ interface OtherFeedProps { isMyFeed?: boolean; profileData?: OtherProfileData | null; userId?: number; + showFollowButton?: boolean; // showFollowButton prop 추가 } -const OtherFeed = ({ posts = [], profileData, userId }: OtherFeedProps) => { +const OtherFeed = ({ + posts = [], + profileData, + userId, + showFollowButton, + isMyFeed, +}: OtherFeedProps) => { const hasPosts = posts.length > 0; if (!profileData) { @@ -25,7 +32,7 @@ const OtherFeed = ({ posts = [], profileData, userId }: OtherFeedProps) => { { aliasColor={profileData.aliasColor} followerCount={profileData.followerCount} latestFollowerProfileImageUrls={profileData?.latestFollowerProfileImageUrls || []} + isMyFeed={isMyFeed} /> {hasPosts ? ( posts.map(post => ( - + )) ) : ( diff --git a/src/components/feed/Profile.tsx b/src/components/feed/Profile.tsx index e33f04be..14716783 100644 --- a/src/components/feed/Profile.tsx +++ b/src/components/feed/Profile.tsx @@ -14,6 +14,7 @@ export interface ProfileProps { followerCount: number; latestFollowerProfileImageUrls?: string[]; userId?: number; + isMyFeed?: boolean; } const Profile = ({ @@ -26,6 +27,7 @@ const Profile = ({ followerCount, latestFollowerProfileImageUrls = [], userId, + isMyFeed, }: ProfileProps) => { const [followed, setFollowed] = useState(isFollowing); const { openPopup } = usePopupStore(); @@ -54,14 +56,14 @@ const Profile = ({ console.log(`${nickname} - ${response.data.isFollowing ? '띱 완료' : '띱 취소'}`); // Snackbar 표시 - const message = response.data.isFollowing - ? `${nickname}님을 띱 했어요.` + const message = response.data.isFollowing + ? `${nickname}님을 띱 했어요.` : `${nickname}님을 띱 취소했어요.`; - + openPopup('snackbar', { message, variant: 'top', - onClose: () => {} + onClose: () => {}, }); } catch (error) { console.error('팔로우/언팔로우 실패:', error); @@ -81,7 +83,7 @@ const Profile = ({ - {showFollowButton && ( + {showFollowButton && !isMyFeed && (
{followed ? '띱 취소' : '띱 하기'}
diff --git a/src/hooks/useOAuthToken.ts b/src/hooks/useOAuthToken.ts index a3a138bb..9d6f63d5 100644 --- a/src/hooks/useOAuthToken.ts +++ b/src/hooks/useOAuthToken.ts @@ -18,7 +18,7 @@ export const useOAuthToken = () => { // 서버에 토큰 발급 요청 apiClient - .post('/api/set-cookie', { loginTokenKey }, { withCredentials: true }) + .post('/auth/set-cookie', { loginTokenKey }, { withCredentials: true }) .then(response => { console.log('✅ 토큰 발급 성공:', response.data); // URL에서 code 파라미터 제거 diff --git a/src/pages/feed/MyFeedPage.tsx b/src/pages/feed/MyFeedPage.tsx new file mode 100644 index 00000000..52186562 --- /dev/null +++ b/src/pages/feed/MyFeedPage.tsx @@ -0,0 +1,92 @@ +import { useNavigate, useParams } from 'react-router-dom'; +import { useState, useEffect } from 'react'; +import styled from '@emotion/styled'; +import NavBar from '../../components/common/NavBar'; +import TitleHeader from '@/components/common/TitleHeader'; +import writefab from '../../assets/common/writefab.svg'; +import leftArrow from '../../assets/common/leftArrow.svg'; +import OtherFeed from '@/components/feed/OtherFeed'; +import { getOtherFeed, type OtherFeedItem } from '@/api/feeds/getOtherFeed'; +import { getOtherProfile } from '@/api/users/getOtherProfile'; +import type { OtherProfileData } from '@/types/profile'; + +const Container = styled.div` + min-width: 320px; + max-width: 767px; + margin: 0 auto; +`; + +const MyFeedPage = () => { + const navigate = useNavigate(); + const { userId } = useParams<{ userId: string }>(); + const [feedData, setFeedData] = useState([]); + const [profileData, setProfileData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const handleBackClick = () => { + navigate(-1); + }; + + // 다른 사용자 피드 및 프로필 데이터 로드 + useEffect(() => { + const loadOtherData = async () => { + if (!userId) { + setError('사용자 ID가 없습니다.'); + setLoading(false); + return; + } + + try { + setLoading(true); + + const [feedResponse, profileResponse] = await Promise.all([ + getOtherFeed(Number(userId)), + getOtherProfile(Number(userId)), + ]); + + console.log('🔍 MyFeedPage - Profile Response:', profileResponse.data); + console.log('🔍 MyFeedPage - isWriter 값:', profileResponse.data.isWriter); + + setFeedData(feedResponse.data.feedList); + setProfileData(profileResponse.data); + setError(null); + } catch (err) { + console.error('다른 사용자 데이터 로드 실패:', err); + setError('사용자 정보를 불러오는데 실패했습니다.'); + } finally { + setLoading(false); + } + }; + + loadOtherData(); + }, [userId]); + + if (loading) { + return <>; + } + + if (error) { + return <>; + } + + return ( + + } + onLeftClick={handleBackClick} + /> + + + + ); +}; + +export default MyFeedPage; diff --git a/src/pages/feed/OtherFeedPage.tsx b/src/pages/feed/OtherFeedPage.tsx index db3fab8a..ea87a156 100644 --- a/src/pages/feed/OtherFeedPage.tsx +++ b/src/pages/feed/OtherFeedPage.tsx @@ -80,6 +80,7 @@ const OtherFeedPage = () => { posts={feedData} isMyFeed={false} profileData={profileData} + showFollowButton={!profileData?.isWriter} // isWriter가 true면 팔로우 버튼 숨김 />
diff --git a/src/pages/index.tsx b/src/pages/index.tsx index df5aa1df..5cf16c67 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -18,6 +18,7 @@ import GroupSearch from './groupSearch/GroupSearch'; import Search from './search/Search'; import ApplyBook from './search/ApplyBook'; import OtherFeedPage from './feed/OtherFeedPage'; +import MyFeedPage from './feed/MyFeedPage'; import FollowerListPage from './feed/FollowerListPage'; import TodayWords from './today-words/TodayWords'; import SearchBook from './searchBook/SearchBook'; @@ -69,6 +70,7 @@ const Router = () => { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/types/post.ts b/src/types/post.ts index 44d23e38..f275a192 100644 --- a/src/types/post.ts +++ b/src/types/post.ts @@ -15,6 +15,7 @@ export interface PostData { isSaved?: boolean; isLiked?: boolean; isPublic?: boolean; + isWriter?: boolean; } export interface FeedListProps { @@ -50,6 +51,7 @@ export interface SubReplyDataProps { likeCount: number; replyId: number; isLike: boolean; + isWriter: boolean; } // 댓글(Reply) @@ -65,6 +67,7 @@ export interface ReplyDataProps { likeCount: number; isLike: boolean; isDeleted: boolean; + isWriter: boolean; replyList: SubReplyDataProps[]; } diff --git a/src/types/profile.ts b/src/types/profile.ts index 54d6d023..0a75c757 100644 --- a/src/types/profile.ts +++ b/src/types/profile.ts @@ -12,4 +12,5 @@ export interface MyProfileData { // 다른 사용자 프로필 정보 타입 (isFollowing 포함) export interface OtherProfileData extends MyProfileData { isFollowing: boolean; + isWriter?: boolean; } From 4a5ab816d323ff0496085fc017c2c83747951b9a Mon Sep 17 00:00:00 2001 From: heeyongKim <166043860+heeeeyong@users.noreply.github.com> Date: Sun, 17 Aug 2025 13:56:00 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EB=B9=8C=EB=93=9C=EC=97=90=EB=9F=AC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/postData.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/data/postData.ts b/src/data/postData.ts index e65d867a..94c504d1 100644 --- a/src/data/postData.ts +++ b/src/data/postData.ts @@ -20,6 +20,7 @@ export const mockPosts: PostData[] = [ isSaved: false, isLiked: true, isPublic: true, + isWriter: false, }, { feedId: 56, @@ -39,6 +40,7 @@ export const mockPosts: PostData[] = [ isSaved: true, isLiked: false, isPublic: false, + isWriter: false, }, { feedId: 58, @@ -58,6 +60,7 @@ export const mockPosts: PostData[] = [ isSaved: false, isLiked: false, isPublic: true, + isWriter: false, }, ]; @@ -80,6 +83,7 @@ export const mockFeedPost: FeedPostProps = { isSaved: true, isLiked: false, isPublic: true, + isWriter: false, }; // 📌 댓글/대댓글(Mock) @@ -97,6 +101,7 @@ export const mockCommentList: ReplyDataProps[] = [ likeCount: 1, isLike: false, isDeleted: false, + isWriter: false, replyList: [ { parentCommentCreatorNickname: 'User31', @@ -110,6 +115,7 @@ export const mockCommentList: ReplyDataProps[] = [ content: '맞아요, 저도 너무 좋았어요!맞아요, 저도 너무 좋았어요!', likeCount: 2, isLike: false, + isWriter: false, }, { parentCommentCreatorNickname: 'User35', @@ -123,6 +129,7 @@ export const mockCommentList: ReplyDataProps[] = [ content: '추천 감사합니다!', likeCount: 123, isLike: true, + isWriter: false, }, ], }, @@ -139,5 +146,6 @@ export const mockCommentList: ReplyDataProps[] = [ isLike: true, replyList: [], isDeleted: false, + isWriter: false, }, ];