diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx index ace5daf3..837ffdc2 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx @@ -335,7 +335,7 @@ export default function ProductAllSection({ hasVideo ]); - useEffect(() => { + const fetchCouponData = useCallback(() => { dispatch( getProductCouponSearch({ patnrId: selectedPatnrId, @@ -343,7 +343,14 @@ export default function ProductAllSection({ mbrNo: userNumber, }) ); - }, [dispatch]); + }, [selectedPatnrId, selectedPrdtId, userNumber, dispatch]); + + useEffect(() => { + // 필수 값이 모두 있을 때만 호출 + if (selectedPatnrId && selectedPrdtId) { + fetchCouponData(); + } + }, [fetchCouponData]); const getCouponCode = () => { const snoArray = []; @@ -383,7 +390,7 @@ export default function ProductAllSection({ setCouponTypes(idx); dispatch(setShowPopup(Config.ACTIVE_POPUP.couponPopup)); }, - [dispatch, popupVisible, promotions, userNumber] + [dispatch, userNumber, partnerCoupon] ); const handleCouponTotDownload = useCallback(() => { @@ -748,20 +755,22 @@ export default function ProductAllSection({ : baseMenu; dispatch(sendLogGNB(menu)); + }, [isBillingProductVisible, isGroupProductVisible, isTravelProductVisible, fromPanel?.fromYouMayLike]); // sendLogGNB 전송 후 플래그 초기화 (1회 사용 후 비활성화) - if (fromPanel?.fromYouMayLike === true) { - dispatch(updatePanel({ - name: panel_names.DETAIL_PANEL, - panelInfo: { - ...panelInfo, - fromPanel: { - fromYouMayLike: false // 플래그 초기화 + useEffect(() => { + if (fromPanel?.fromYouMayLike === true) { + dispatch(updatePanel({ + name: panel_names.DETAIL_PANEL, + panelInfo: { + ...panelInfo, + fromPanel: { + fromYouMayLike: false // 플래그 초기화 + } } - } - })); - } -}, [fromPanel?.fromYouMayLike, isBillingProductVisible, isUnavailableProductVisible, isGroupProductVisible, isTravelProductVisible]); // BUY NOW 상태 변경 시 재실행 + })); + } + }, [fromPanel?.fromYouMayLike, dispatch, panelInfo]); // sendLogProductDetail 로깅 - Source의 productData 변경 감지와 동일한 패턴 useEffect(() => { @@ -793,9 +802,9 @@ export default function ProductAllSection({ tsvFlag: productData?.todaySpclFlag ?? "", }; - return () => dispatch(sendLogProductDetail(params)); + dispatch(sendLogProductDetail(params)); } - }, [productData, entryMenuRef.current, panelInfo?.linkTpCd, isBillingProductVisible, isGroupProductVisible, isTravelProductVisible]); // productData 변경 시 재실행 + }, [productData, panelInfo?.linkTpCd, isBillingProductVisible, isGroupProductVisible, isTravelProductVisible, dispatch]); // productData 변경 시 재실행 // [251115] 주석 처리: MediaPanel에서 이미 포커스 이동을 처리하므로 // ProductAllSection의 자동 포커스는 포커스 탈취를 일으킬 수 있음 @@ -1111,35 +1120,32 @@ export default function ProductAllSection({ return hasVideo && productVideoVersion === 1; }, [hasVideo, productVideoVersion]); - const handleShopByMobileOpen = useCallback( - pipe(() => { - // sendLogShopByMobile - Source와 동일한 로깅 추가 - if (productData && Object.keys(productData).length > 0) { - const { priceInfo, patncNm, patnrId, prdtId, prdtNm, brndNm, catNm } = productData; - const regularPrice = priceInfo?.split("|")[0]; - const discountPrice = priceInfo?.split("|")[1]; - const discountRate = priceInfo?.split("|")[4]; + const handleShopByMobileOpen = useCallback(() => { + // sendLogShopByMobile - Source와 동일한 로깅 추가 + if (productData && Object.keys(productData).length > 0) { + const { priceInfo, patncNm, patnrId, prdtId, prdtNm, brndNm, catNm } = productData; + const regularPrice = priceInfo?.split("|")[0]; + const discountPrice = priceInfo?.split("|")[1]; + const discountRate = priceInfo?.split("|")[4]; - const logParams = { - prdtId, - patnrId, - prdtNm, - patncNm, - brndNm, - catNm, - regularPrice, - discountPrice, - discountRate, - shopByMobileTime: new Date().toISOString(), - }; + const logParams = { + prdtId, + patnrId, + prdtNm, + patncNm, + brndNm, + catNm, + regularPrice, + discountPrice, + discountRate, + shopByMobileTime: new Date().toISOString(), + }; - dispatch(sendLogShopByMobile(logParams)); - } + dispatch(sendLogShopByMobile(logParams)); + } - setMobileSendPopupOpen(true); // 팝업 열기 - }), - [setMobileSendPopupOpen] - ); + setMobileSendPopupOpen(true); // 팝업 열기 + }, [productData, dispatch]); const shopByMobileId = useMemo( () => SpotlightIds?.DETAIL_SHOPBYMOBILE || 'detail_shop_by_mobile',