Skip to content
Merged

Dev #59

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 41 additions & 17 deletions src/components/features/club/review/ReviewCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,47 +38,60 @@ 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<string | null>(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,
liked: true,
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({
Expand Down Expand Up @@ -131,10 +144,10 @@ export default function ReviewCard({
{reviews?.reviewId ? `익명${reviews?.reviewId}` : '익명'}
</CardTitle>
<p className="text-[12px] font-regular text-[#9c9c9c]">{review?.dateTime || ''}</p>
{likeCount !== null && (
{reviews?.likes !== null && (
<span className="flex flex-row gap-0.5 items-center ml-1.5 text-[#fd3c56]">
<ThumbsUp size={12} className="text-[#fd3c56]" />
<p className="text-[12px] font-regular text-[#fd3c56]">{likeCount}</p>
<p className="text-[12px] font-regular text-[#fd3c56]">{reviews?.likes}</p>
</span>
)}
</div>
Expand Down Expand Up @@ -313,6 +326,17 @@ export default function ReviewCard({
}}
/>
)}

{isOpenLikeModal && (
<Modal
isOpen={isOpenLikeModal}
message={modalMessage}
onClose={() => {
setIsOpenLikeModal(false);

}}
/>
)}
</Card>
);
}
11 changes: 2 additions & 9 deletions src/components/features/club/review/api/ReviewApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -28,7 +23,6 @@ interface ReviewRequest {
clubId: number;
page: number;
size: number;
// sort: string;
reviewSortType: string;
}

Expand All @@ -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);
Expand All @@ -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;
}
};

Expand All @@ -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;
}
};

Expand Down