[251101] fix: BuyNow Mock Mocde
🕐 커밋 시간: 2025. 11. 01. 16:14:38 📊 변경 통계: • 총 파일: 13개 • 추가: +504줄 • 삭제: -170줄 📁 추가된 파일: + com.twin.app.shoptime/src/utils/BuyNowConfig.js + com.twin.app.shoptime/src/utils/BuyNowDataManipulator.js 📝 수정된 파일: ~ com.twin.app.shoptime/src/hooks/useReviews/useReviews.js ~ com.twin.app.shoptime/src/views/CheckOutPanel/CheckOutPanel.jsx ~ com.twin.app.shoptime/src/views/CheckOutPanel/container/FixedSideBar.jsx ~ com.twin.app.shoptime/src/views/CheckOutPanel/container/InformationContainer.jsx ~ com.twin.app.shoptime/src/views/CheckOutPanel/container/OrderItemsSideBar.jsx ~ com.twin.app.shoptime/src/views/CheckOutPanel/container/SummaryCotainer.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/components/BuyOption.jsx ~ com.twin.app.shoptime/src/views/MainView/MainView.jsx ~ com.twin.app.shoptime/src/views/UserReview/ShowUserReviews.jsx 🔧 주요 변경 내용: • 핵심 비즈니스 로직 개선 • UI 컴포넌트 아키텍처 개선 • 공통 유틸리티 함수 최적화 • 대규모 기능 개발 • 모듈 구조 개선
This commit is contained in:
@@ -42,6 +42,8 @@ import TButton from '../../../components/TButton/TButton';
|
||||
import TPopUp from '../../../components/TPopUp/TPopUp';
|
||||
import * as Config from '../../../utils/Config';
|
||||
import { $L } from '../../../utils/helperMethods';
|
||||
import { BUYNOW_CONFIG } from '../../../utils/BuyNowConfig';
|
||||
import { createMockProductOptionData } from '../../../utils/BuyNowDataManipulator';
|
||||
import FavoriteBtn from '../components/FavoriteBtn';
|
||||
import styles from './BuyOption.module.less';
|
||||
import BuyOptionPriceBlock from './BuyOptionPriceBlock';
|
||||
@@ -75,7 +77,7 @@ const BuyOption = ({
|
||||
);
|
||||
const reduxProductInfo = useSelector((state) => state.main.productData);
|
||||
const productInfo = propsProductInfo || reduxProductInfo;
|
||||
const productOptionInfos = useSelector((state) => state.product.prdtOptInfo);
|
||||
const reduxProductOptionInfos = useSelector((state) => state.product.prdtOptInfo);
|
||||
const productData = useSelector((state) => state.main.productData);
|
||||
const { partnerCoupon } = useSelector(
|
||||
(state) => state.coupon.productCouponSearchData || {}
|
||||
@@ -106,6 +108,24 @@ const BuyOption = ({
|
||||
const selectedPatnrId = propsSelectedPatnrId || productInfo?.patnrId;
|
||||
const selectedPrdtId = propsSelectedPrdtId || productInfo?.prdtId;
|
||||
|
||||
// Mock Mode에서 옵션 데이터 처리
|
||||
const productOptionInfos = useMemo(() => {
|
||||
// API Mode: 기존 로직 100% 유지
|
||||
if (!BUYNOW_CONFIG.isMockMode()) {
|
||||
return reduxProductOptionInfos;
|
||||
}
|
||||
|
||||
// Mock Mode: 옵션 데이터가 없으면 Mock 데이터 생성
|
||||
if (!reduxProductOptionInfos || reduxProductOptionInfos.length === 0) {
|
||||
const mockOptionData = createMockProductOptionData(productData);
|
||||
// Mock 옵션 데이터 배열 반환 (기존 구조와 호환)
|
||||
return mockOptionData?.optionList || [];
|
||||
}
|
||||
|
||||
// Mock Mode이고 옵션 데이터가 있으면 그대로 사용
|
||||
return reduxProductOptionInfos;
|
||||
}, [reduxProductOptionInfos, productData]);
|
||||
|
||||
// logInfo 생성 (SingleOption과 동일한 로직, productData 우선 사용)
|
||||
const logInfo = useMemo(() => {
|
||||
if (productData) {
|
||||
@@ -215,21 +235,26 @@ const BuyOption = ({
|
||||
}, [productOptionInfos, selectedBtnOptIdx, isOptionValue]);
|
||||
|
||||
// 필수 데이터 로드 (SingleOption과 동일)
|
||||
// Mock Mode: API 호출 스킵 (Mock 데이터만 사용)
|
||||
useEffect(() => {
|
||||
dispatch(
|
||||
getProductOption({
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
})
|
||||
);
|
||||
// API Mode: 실제 API 호출
|
||||
if (!BUYNOW_CONFIG.isMockMode()) {
|
||||
dispatch(
|
||||
getProductOption({
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
})
|
||||
);
|
||||
|
||||
dispatch(
|
||||
getProductCouponSearch({
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
mbrNo: userNumber,
|
||||
})
|
||||
);
|
||||
dispatch(
|
||||
getProductCouponSearch({
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
mbrNo: userNumber,
|
||||
})
|
||||
);
|
||||
}
|
||||
// Mock Mode: API 호출 하지 않음
|
||||
}, [dispatch, selectedPatnrId, selectedPrdtId, userNumber]);
|
||||
|
||||
// 포커스 관리 로직 (SingleOption과 유사)
|
||||
@@ -403,26 +428,45 @@ const BuyOption = ({
|
||||
})
|
||||
);
|
||||
|
||||
dispatch(
|
||||
getMyInfoCheckoutInfo(
|
||||
{
|
||||
mbrNo: userNumber,
|
||||
dirPurcSelYn: 'Y',
|
||||
cartList: [
|
||||
{
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
prodOptCdCval: selectedOptions?.prodOptCdCval
|
||||
? selectedOptions.prodOptCdCval
|
||||
: null,
|
||||
prodQty: String(quantity),
|
||||
prodOptTpCdCval: productOptionInfos[0]?.prodOptTpCdCval,
|
||||
},
|
||||
],
|
||||
},
|
||||
checkOutValidate
|
||||
)
|
||||
);
|
||||
// Mock Mode: API 호출 스킵
|
||||
if (!BUYNOW_CONFIG.isMockMode()) {
|
||||
dispatch(
|
||||
getMyInfoCheckoutInfo(
|
||||
{
|
||||
mbrNo: userNumber,
|
||||
dirPurcSelYn: 'Y',
|
||||
cartList: [
|
||||
{
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
prodOptCdCval: selectedOptions?.prodOptCdCval
|
||||
? selectedOptions.prodOptCdCval
|
||||
: null,
|
||||
prodQty: String(quantity),
|
||||
prodOptTpCdCval: productOptionInfos[0]?.prodOptTpCdCval,
|
||||
},
|
||||
],
|
||||
},
|
||||
checkOutValidate
|
||||
)
|
||||
);
|
||||
} else {
|
||||
// Mock Mode: 체크아웃 페이지로 이동 (시뮬레이션)
|
||||
console.log('[BuyOption] Mock Mode - Simulating checkout');
|
||||
console.log('[BuyOption] logInfo:', logInfo);
|
||||
console.log('[BuyOption] Dispatching pushPanel to CHECKOUT_PANEL');
|
||||
dispatch(finishVideoPreview());
|
||||
dispatch(finishMediaPreview());
|
||||
const checkoutPanelInfo = { logInfo: { ...logInfo, cartTpSno: `MOCK_${Date.now()}` } };
|
||||
console.log('[BuyOption] checkoutPanelInfo:', checkoutPanelInfo);
|
||||
dispatch(
|
||||
pushPanel({
|
||||
name: Config.panel_names.CHECKOUT_PANEL,
|
||||
panelInfo: checkoutPanelInfo,
|
||||
})
|
||||
);
|
||||
console.log('[BuyOption] pushPanel dispatch completed');
|
||||
}
|
||||
}
|
||||
dispatch(clearAllToasts());
|
||||
}, [
|
||||
@@ -478,23 +522,29 @@ const BuyOption = ({
|
||||
// })
|
||||
// );
|
||||
|
||||
// 장바구니에 추가
|
||||
dispatch(
|
||||
addToCart({
|
||||
mbrNo: userNumber,
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
prodQty: String(quantity),
|
||||
prdtOpt: {
|
||||
prodOptCdCval: selectedOptions?.prodOptCdCval
|
||||
? selectedOptions.prodOptCdCval
|
||||
: "",
|
||||
prodOptCval:productOptionInfos[0]?.optNm,
|
||||
prodOptSno: productOptionInfos[0]?.prodOptSno,
|
||||
prodOptTpCdCval: productOptionInfos[0]?.prodOptTpCdCval,
|
||||
}
|
||||
})
|
||||
);
|
||||
// Mock Mode: API 호출 스킵
|
||||
if (!BUYNOW_CONFIG.isMockMode()) {
|
||||
// 장바구니에 추가
|
||||
dispatch(
|
||||
addToCart({
|
||||
mbrNo: userNumber,
|
||||
patnrId: selectedPatnrId,
|
||||
prdtId: selectedPrdtId,
|
||||
prodQty: String(quantity),
|
||||
prdtOpt: {
|
||||
prodOptCdCval: selectedOptions?.prodOptCdCval
|
||||
? selectedOptions.prodOptCdCval
|
||||
: "",
|
||||
prodOptCval:productOptionInfos[0]?.optNm,
|
||||
prodOptSno: productOptionInfos[0]?.prodOptSno,
|
||||
prodOptTpCdCval: productOptionInfos[0]?.prodOptTpCdCval,
|
||||
}
|
||||
})
|
||||
);
|
||||
} else {
|
||||
// Mock Mode: 로컬 장바구니 데이터 생성 후 CartPanel로 이동
|
||||
console.log('[BuyOption] Mock Mode - Adding to cart (Mock)');
|
||||
}
|
||||
|
||||
// CartPanel로 이동
|
||||
dispatch(
|
||||
|
||||
Reference in New Issue
Block a user