[251105] fix: UserReviewPanel Review팝업 수정

🕐 커밋 시간: 2025. 11. 05. 05:30:32

📊 변경 통계:
  • 총 파일: 4개
  • 추가: +38줄
  • 삭제: -11줄

📝 수정된 파일:
  ~ com.twin.app.shoptime/src/hooks/useReviews/useReviews.js
  ~ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviewsPopup/UserReviewsPopup.jsx
  ~ com.twin.app.shoptime/src/views/UserReview/ShowUserReviews.jsx
  ~ com.twin.app.shoptime/src/views/UserReview/UserReviewPanel.jsx

🔧 주요 변경 내용:
  • 핵심 비즈니스 로직 개선
  • 소규모 기능 개선
This commit is contained in:
2025-11-05 05:30:33 +09:00
parent 5568da6e5e
commit 72b062ad1b
4 changed files with 38 additions and 11 deletions

View File

@@ -592,9 +592,15 @@ const useReviews = (prdtId, patnrId, _deprecatedReviewVersion) => {
]); ]);
// 필터 변경 시 UserReviewPanel 페이지도 초기화 // 필터 변경 시 UserReviewPanel 페이지도 초기화
// ✅ 클라이언트 필터 + API 필터 모두 감시
useEffect(() => { useEffect(() => {
console.log('[useReviews] 필터 변경 감지 - userReviewPanelPage 초기화:', {
filterType: currentFilter.type,
filterValue: currentFilter.value,
apiFilter: currentReviewFilter,
});
setUserReviewPanelPage(0); setUserReviewPanelPage(0);
}, [currentFilter.type, currentFilter.value]); }, [currentFilter.type, currentFilter.value, currentReviewFilter]);
// Single Filter 적용 함수 // Single Filter 적용 함수
const applyFilter = useCallback((type, value) => { const applyFilter = useCallback((type, value) => {

View File

@@ -105,25 +105,34 @@ export default function UserReviewsPopup({
const [currentReviewIndex, setCurrentReviewIndex] = useState(0); const [currentReviewIndex, setCurrentReviewIndex] = useState(0);
// 모드별 리뷰 인덱스 초기화 // 모드별 리뷰 인덱스 초기화
// ✅ selectedImageIndex 변경 감지 추가: 클릭한 리뷰가 팝업에 표시되도록
useEffect(() => { useEffect(() => {
console.log('[UserReviewsPopup] Mode or selectedImageIndex changed:', {
mode,
selectedImageIndex,
allReviewsLength: allReviews?.length || 0,
});
if (mode === "all-images" && images && images[selectedImageIndex]) { if (mode === "all-images" && images && images[selectedImageIndex]) {
const selectedImage = images[selectedImageIndex]; const selectedImage = images[selectedImageIndex];
const reviewIndex = reviewsWithImages.findIndex( const reviewIndex = reviewsWithImages.findIndex(
(review) => review.rvwId === selectedImage.reviewId (review) => review.rvwId === selectedImage.reviewId
); );
if (reviewIndex !== -1) { if (reviewIndex !== -1) {
console.log('[UserReviewsPopup] all-images mode - found review index:', reviewIndex);
setCurrentReviewIndex(reviewIndex); setCurrentReviewIndex(reviewIndex);
} }
} else if (mode === "user-reviews") { } else if (mode === "user-reviews") {
// User-Reviews 모드: selectedImageIndex를 그대로 사용 // User-Reviews 모드: selectedImageIndex를 그대로 사용
console.log('[UserReviewsPopup] user-reviews mode - setting index to:', selectedImageIndex);
setCurrentReviewIndex(selectedImageIndex); setCurrentReviewIndex(selectedImageIndex);
} }
}, [ }, [
mode, mode,
// selectedImageIndex, selectedImageIndex, // ✅ 추가: 선택된 이미지 인덱스 변경 감지
// images, images, // ✅ 추가: 이미지 데이터 변경 감지
// reviewsWithImages, reviewsWithImages, // ✅ 추가: 이미지 있는 리뷰 변경 감지
// allReviews, allReviews, // ✅ 추가: allReviews 변경 감지
]); ]);
// 리뷰 네비게이션 핸들러 (All-Images 및 User-Reviews 모드) // 리뷰 네비게이션 핸들러 (All-Images 및 User-Reviews 모드)

View File

@@ -124,10 +124,10 @@ const ShowUserReviews = ({ hasVideo, launchedFromPlayer, onFocus, onBlur }) => {
return ( return (
<div className={css.showUserReviews__wrapper}> <div className={css.showUserReviews__wrapper}>
{console.log('[ShowUserReviews_v2] ✅ 버튼 렌더링 시작:', { {/* {console.log('[ShowUserReviews_v2] ✅ 버튼 렌더링 시작:', {
reviewListLength: reviewListData?.length, reviewListLength: reviewListData?.length,
version: REVIEW_VERSION version: REVIEW_VERSION
})} })} */}
<SpottableComponent <SpottableComponent
className={css.showUserReviews__button} className={css.showUserReviews__button}
onClick={handleShowUserReviewsClick} onClick={handleShowUserReviewsClick}

View File

@@ -49,6 +49,7 @@ const UserReviewPanel = ({ className, panelInfo, spotlightId }) => {
currentReviewFilter, currentReviewFilter,
// 전체 리뷰 데이터 (팝업용) // 전체 리뷰 데이터 (팝업용)
allReviews, allReviews,
filteredReviews, // ✅ 필터링된 전체 리뷰 (팝업에서 사용)
getReviewsWithImages, getReviewsWithImages,
extractImagesFromReviews, extractImagesFromReviews,
} = useReviews(prdtId, patnrId); // REVIEW_VERSION 상수에 따라 자동으로 API 선택 } = useReviews(prdtId, patnrId); // REVIEW_VERSION 상수에 따라 자동으로 API 선택
@@ -404,21 +405,31 @@ const UserReviewPanel = ({ className, panelInfo, spotlightId }) => {
}, [dispatch, bgVideoInfo]); }, [dispatch, bgVideoInfo]);
// 리뷰 클릭 핸들러 - ProductAllSection의 UserReviews.jsx 패턴 // 리뷰 클릭 핸들러 - ProductAllSection의 UserReviews.jsx 패턴
// ✅ filteredReviews 사용: 현재 필터에 적용된 리뷰 목록 내에서 찾기
const handleReviewClick = useCallback( const handleReviewClick = useCallback(
(review, index) => { (review, index) => {
console.log('[UserReviewPanel] Review clicked, opening popup:', { console.log('[UserReviewPanel] Review clicked, opening popup:', {
rvwId: review.rvwId, rvwId: review.rvwId,
index, index,
currentFilter,
filteredReviewsLength: filteredReviews.length,
}); });
// 전체 리뷰에서 클릭한 리뷰의 실제 인덱스 찾기 // ✅ filteredReviews에서 클릭한 리뷰의 인덱스 찾기
const realIndex = allReviews.findIndex((r) => r.rvwId === review.rvwId); // filteredReviews는 현재 필터에 적용된 전체 리뷰 목록
const realIndex = filteredReviews.findIndex((r) => r.rvwId === review.rvwId);
console.log('[UserReviewPanel] Review index mapping:', {
localIndex: index,
realIndexInFiltered: realIndex,
selectedIndex: realIndex >= 0 ? realIndex : index,
});
setSelectedImageIndex(realIndex >= 0 ? realIndex : index); setSelectedImageIndex(realIndex >= 0 ? realIndex : index);
setPopupMode('user-reviews'); setPopupMode('user-reviews');
setIsPopupOpen(true); setIsPopupOpen(true);
}, },
[allReviews] [filteredReviews, currentFilter]
); );
// 팝업 닫기 핸들러 // 팝업 닫기 핸들러
@@ -696,6 +707,7 @@ const UserReviewPanel = ({ className, panelInfo, spotlightId }) => {
</TBody> </TBody>
{/* UserReviewsPopup 추가 - ProductAllSection과 동일한 방식 */} {/* UserReviewsPopup 추가 - ProductAllSection과 동일한 방식 */}
{/* ✅ allReviews → filteredReviews 사용: 현재 필터의 리뷰 목록만 팝업에서 순회 */}
<UserReviewsPopup <UserReviewsPopup
open={isPopupOpen} open={isPopupOpen}
onClose={handleClosePopup} onClose={handleClosePopup}
@@ -703,7 +715,7 @@ const UserReviewPanel = ({ className, panelInfo, spotlightId }) => {
images={extractImagesFromReviews} images={extractImagesFromReviews}
selectedImageIndex={selectedImageIndex} selectedImageIndex={selectedImageIndex}
reviewsWithImages={getReviewsWithImages} reviewsWithImages={getReviewsWithImages}
allReviews={allReviews} allReviews={filteredReviews}
onModeChange={handleModeChange} onModeChange={handleModeChange}
/> />
</TPanel> </TPanel>