From 7188605a84cc49471fde564937dc71aa2a0094e2 Mon Sep 17 00:00:00 2001 From: Kangyeeun0 Date: Fri, 14 Nov 2025 14:26:40 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=A6=AC=EB=B7=B0=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features/club/review/ReviewCard.tsx | 58 +++++++++++++------ .../features/club/review/api/ReviewApi.ts | 11 +--- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/components/features/club/review/ReviewCard.tsx b/src/components/features/club/review/ReviewCard.tsx index 1e265af..380d3aa 100644 --- a/src/components/features/club/review/ReviewCard.tsx +++ b/src/components/features/club/review/ReviewCard.tsx @@ -38,16 +38,15 @@ export default function ReviewCard({ const [isOpenReport, setIsOpenReport] = useState(false); const [reportReason, setReportReason] = useState(''); const [isOpenDeleteModal, setIsOpenDeleteModal] = useState(false); - const likeCount = typeof review?.likes === 'number' ? review.likes : null; + // const likeCount = typeof review?.likes === 'number' ? review.likes : null; const [reviews, setReviews] = useState(review); const [otherDetailReason, setOtherDetailReason] = useState(null); const [isOpenModal, setIsOpenModal] = useState(false); const [modalMessage, setModalMessage] = useState(''); + const [isOpenLikeModal, setIsOpenLikeModal] = useState(false); const handleLike = async () => { - console.log(clubId, reviews?.reviewId); if (!clubId || !reviews?.reviewId) return; - // 즉시 UI 업데이트 setReviews({ ...reviews, @@ -55,30 +54,44 @@ export default function ReviewCard({ likes: (reviews?.likes || 0) + 1, }); - const res = await postReviewLike(clubId, reviews?.reviewId); - if (res) { - console.log(res); + try{ + await postReviewLike(clubId, reviews?.reviewId); + } catch (error) { + setIsOpenLikeModal(true); + setModalMessage('좋아요 기능이 제한된 리뷰입니다.'); + setReviews({ + ...reviews, + liked: true, + likes: Math.max((reviews?.likes || 0) , 0) + }); } + }; const deleteLike = async () => { if (!clubId || !reviews?.reviewId) return; - - // 즉시 UI 업데이트 + //즉시 상태 없데이트트 setReviews({ ...reviews, liked: false, likes: Math.max((reviews?.likes || 0) - 1, 0), }); - - try { - await deleteReviewLike(clubId, reviews?.reviewId); - } catch (error) { - console.error('deleteLike error:', error); - throw error; - } + + try{ + await deleteReviewLike(clubId, reviews?.reviewId); + } catch (error) { + setIsOpenLikeModal(true); + setModalMessage('좋아요 기능이 제한된 리뷰입니다.'); + setReviews({ + ...reviews, + liked: true, + likes: Math.max((reviews?.likes || 0) , 0) + }); + } + }; + const handleReport = async () => { if (!clubId || !review?.reviewId) return; const res = await postReviewReport({ @@ -131,10 +144,10 @@ export default function ReviewCard({ {reviews?.reviewId ? `익명${reviews?.reviewId}` : '익명'}

{review?.dateTime || ''}

- {likeCount !== null && ( + {reviews?.likes !== null && ( -

{likeCount}

+

{reviews?.likes}

)} @@ -313,6 +326,17 @@ export default function ReviewCard({ }} /> )} + +{isOpenLikeModal && ( + { + setIsOpenLikeModal(false); + + }} + /> + )} ); } diff --git a/src/components/features/club/review/api/ReviewApi.ts b/src/components/features/club/review/api/ReviewApi.ts index 3122b92..1c169cb 100644 --- a/src/components/features/club/review/api/ReviewApi.ts +++ b/src/components/features/club/review/api/ReviewApi.ts @@ -6,16 +6,11 @@ export const getReviewsSortedByCount = async (clubId: number,limit:number) => { const res = await apiClient.get(`/v1/clubs/${clubId}/reviews/keyword-stats?limit=${limit}`); if (res.data.success) { const reviews = res.data.data.keywordStats; - console.log('reviews:', reviews); - const sortedReviews = Object.entries(reviews) .sort(([, countA], [, countB]) => (countB as number) - (countA as number)) // value 값 내림차순 .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); // Convert back to object - console.log('sorted:', sortedReviews); - return sortedReviews; } else { - console.error('Failed to fetch reviews'); return null; } } catch (error) { @@ -28,7 +23,6 @@ interface ReviewRequest { clubId: number; page: number; size: number; - // sort: string; reviewSortType: string; } @@ -38,7 +32,6 @@ export const getReviews = async ({ clubId, page, size, reviewSortType }: ReviewR const res = await apiClient.get( `/v1/clubs/${clubId}/reviews?page=${page}&size=${size}&sort=string&reviewSortType=${reviewSortType}` ); - console.log('res:', res.data.data); return res.data.data; } catch (error) { console.error('Error fetching reviews: ', error); @@ -53,7 +46,7 @@ export const postReviewLike = async (clubId: number, id: number) => { return res.data.data; } catch (error) { console.error('Error posting review like: ', error); - return null; + return false; } }; @@ -64,7 +57,7 @@ export const deleteReviewLike = async (clubId: number, id: number) => { return res.data.data; } catch (error) { console.error('Error deleting review like: ', error); - return null; + throw error; } };