From bf7af5aa2e9817e4ada28807f2b5b9adcdec887f Mon Sep 17 00:00:00 2001 From: optrader Date: Wed, 10 Dec 2025 15:53:46 +0900 Subject: [PATCH] =?UTF-8?q?[251210]=20feat:=20FeaturedBrandsPanel-TopBanne?= =?UTF-8?q?rImage=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ• ์ปค๋ฐ‹ ์‹œ๊ฐ„: 2025. 12. 10. 15:53:45 ๐Ÿ“Š ๋ณ€๊ฒฝ ํ†ต๊ณ„: โ€ข ์ด ํŒŒ์ผ: 6๊ฐœ โ€ข ์ถ”๊ฐ€: +51์ค„ โ€ข ์‚ญ์ œ: -21์ค„ ๐Ÿ“ ์ถ”๊ฐ€๋œ ํŒŒ์ผ: + com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.jsx + com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.module.less ๐Ÿ“ ์ˆ˜์ •๋œ ํŒŒ์ผ: ~ com.twin.app.shoptime/src/actions/brandActions.js ~ com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.jsx ~ com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.module.less ~ com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx ๐Ÿ”ง ์ฃผ์š” ๋ณ€๊ฒฝ ๋‚ด์šฉ: โ€ข ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ์„  โ€ข ์†Œ๊ทœ๋ชจ ๊ธฐ๋Šฅ ๊ฐœ์„  โ€ข ๋ชจ๋“ˆ ๊ตฌ์กฐ ๊ฐœ์„  --- .../src/actions/brandActions.js | 13 ++-- .../FeaturedBrandsPanel/Banner/Banner.jsx | 41 +++++++++--- .../Banner/Banner.module.less | 1 + .../FeaturedBrandsPanel.jsx | 17 +++-- .../TopBannerImage/TopBannerImage.jsx | 67 +++++++++++++++++++ .../TopBannerImage/TopBannerImage.module.less | 25 +++++++ 6 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.jsx create mode 100644 com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.module.less diff --git a/com.twin.app.shoptime/src/actions/brandActions.js b/com.twin.app.shoptime/src/actions/brandActions.js index b1e7b916..713472f0 100644 --- a/com.twin.app.shoptime/src/actions/brandActions.js +++ b/com.twin.app.shoptime/src/actions/brandActions.js @@ -432,19 +432,20 @@ export const getBrandShopByShow = (props) => (dispatch, getState) => { export const getBrandTopBanner = (props) => (dispatch, getState) => { const { patnrId } = props; - console.log("[getBrandTopBanner] Called - patnrId:", patnrId); + console.log("[BRAND-TOP-BANNER-API] Called - patnrId:", patnrId); // NBCU(patnrId: 21)๊ฐ€ ์•„๋‹ˆ๋ฉด ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ - if (patnrId !== 21) { - console.log("[getBrandTopBanner] Skip - patnrId is not 21 (NBCU)"); + if (patnrId !== 21 && patnrId !== "21") { + console.log("[BRAND-TOP-BANNER-API] Skip - patnrId is not 21 (NBCU), patnrId:", patnrId, "(type:", typeof patnrId, ")"); return; } dispatch(changeAppStatus({ showLoadingPanel: { show: true, type: 'wait' } })); const onSuccess = (response) => { - console.log("[getBrandTopBanner] onSuccess - patnrId:", patnrId, "data:", response.data.data); - console.log("[getBrandTopBanner] brandTopBannerInfo:", response.data.data.brandTopBannerInfo); + console.log("[BRAND-TOP-BANNER-API] onSuccess - patnrId:", patnrId); + console.log("[BRAND-TOP-BANNER-API] Full response data:", response.data.data); + console.log("[BRAND-TOP-BANNER-API] brandTopBannerInfo:", response.data.data.brandTopBannerInfo); dispatch({ type: types.GET_BRAND_TOP_BANNER, @@ -457,7 +458,7 @@ export const getBrandTopBanner = (props) => (dispatch, getState) => { }; const onFail = (error) => { - console.log("[getBrandTopBanner] onFail - patnrId:", patnrId, "error:", error); + console.log("[BRAND-TOP-BANNER-API] onFail - patnrId:", patnrId, "error:", error); derror('getBrandTopBanner onFail ', error); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; diff --git a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.jsx b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.jsx index be0db5d0..66f5bc42 100644 --- a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.jsx +++ b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.jsx @@ -2,6 +2,7 @@ import React, { memo } from "react"; import IcPartnersDefault from "../../../../assets/images/ic-tab-partners-default@3x.png"; import CustomImage from "../../../components/CustomImage/CustomImage"; +import TopBannerImage from "../TopBannerImage/TopBannerImage"; import css from "./Banner.module.less"; export default memo(function Banner({ @@ -18,11 +19,14 @@ export default memo(function Banner({ const { topImgAlt, topImgPath } = brandTopImgInfo || {}; // NBCU(patnrId: 21)์ธ ๊ฒฝ์šฐ Top Banner ์ •๋ณด ์‚ฌ์šฉ - const isNBCU = selectedPatnrId === 21; - console.log("[Banner] isNBCU:", isNBCU); - console.log("[Banner] brandTopBannerInfo:", brandTopBannerInfo); + const isNBCU = selectedPatnrId === 21 || selectedPatnrId === "21"; + console.log("[FB-BANNER-COMP] ===== BANNER COMPONENT START ====="); + console.log("[FB-BANNER-COMP] selectedPatnrId:", selectedPatnrId, "(type:", typeof selectedPatnrId, ")"); + console.log("[FB-BANNER-COMP] panelPatnrId:", panelPatnrId, "(type:", typeof panelPatnrId, ")"); + console.log("[FB-BANNER-COMP] isNBCU:", isNBCU); + console.log("[FB-BANNER-COMP] brandTopBannerInfo:", brandTopBannerInfo); - // Top Banner ์ •๋ณด์—์„œ ํ•„์š”ํ•œ ํ•„๋“œ ์ถ”์ถœ + // Top Banner ์ •๋ณด์—์„œ ํ•„์š”ํ•œ ํ•„๋“œ ์ถ”์ถœ (ํ˜„์žฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ) const { banrImgUrl, // ๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€ URL banrImgNm, // ๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€ ์ด๋ฆ„ @@ -31,12 +35,21 @@ export default memo(function Banner({ banrNm // ๋ฐฐ๋„ˆ ์ด๋ฆ„ } = brandTopBannerInfo || {}; - // NBCU์ธ ๊ฒฝ์šฐ Top Banner ์ด๋ฏธ์ง€๋ฅผ, ์•„๋‹ˆ๋ฉด ๊ธฐ์กด Top ์ด๋ฏธ์ง€ ์‚ฌ์šฉ - const bannerImageSrc = isNBCU ? banrImgUrl : topImgPath; - const bannerImageAlt = isNBCU ? banrImgNm || banrNm : topImgAlt; + // ํ˜„์žฌ๋Š” Top Banner ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด Top ์ด๋ฏธ์ง€๋งŒ ์‚ฌ์šฉ + // TODO: ํ–ฅํ›„ Top Banner ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ๋ถ€๋ถ„์„ ํ™œ์„ฑํ™” + const bannerImageSrc = topImgPath; // isNBCU ? banrImgUrl : topImgPath; + const bannerImageAlt = topImgAlt; // isNBCU ? banrImgNm || banrNm : topImgAlt; - console.log("[Banner] bannerImageSrc:", bannerImageSrc); - console.log("[Banner] bannerImageAlt:", bannerImageAlt); + console.log("[FB-BANNER-COMP] Top Banner ์ด๋ฏธ์ง€๋Š” ํ˜„์žฌ ๋น„ํ™œ์„ฑํ™”๋จ"); + if (isNBCU && brandTopBannerInfo) { + console.log("[FB-BANNER-COMP] NBCU Top Banner ๋ฐ์ดํ„ฐ ์ˆ˜์‹  (์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ):"); + console.log("[FB-BANNER-COMP] - banrImgUrl:", banrImgUrl); + console.log("[FB-BANNER-COMP] - pupBanrImgUrl:", pupBanrImgUrl); + console.log("[FB-BANNER-COMP] - pupBanrTtl:", pupBanrTtl); + } + console.log("[FB-BANNER-COMP] Using original Top Image"); + console.log("[FB-BANNER-COMP] bannerImageSrc:", bannerImageSrc); + console.log("[FB-BANNER-COMP] ===== BANNER COMPONENT END ====="); return (
@@ -56,6 +69,16 @@ export default memo(function Banner({ ariaLabel={bannerImageAlt} /> )} + + {/* NBCU Top Banner Image */} + {isNBCU && brandTopBannerInfo?.banrImgUrl && ( + + )}
); }); diff --git a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.module.less b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.module.less index 89060abf..19fa863f 100644 --- a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.module.less +++ b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/Banner/Banner.module.less @@ -3,6 +3,7 @@ .container { position: fixed; + // position: relative; // changed from fixed to relative for absolute positioning of children .flex(@justifyCenter: flex-start, @alignCenter: flex-end); .size(@w: 100%, @h: 108px); margin-bottom: 58px; diff --git a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx index 6afaf686..9bbe90ce 100644 --- a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx +++ b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/FeaturedBrandsPanel.jsx @@ -799,9 +799,12 @@ const FeaturedBrandsPanel = ({ isOnTop, panelInfo, spotlightId }) => { // effect: data fetching based on brandLayoutInfo and selectedPatnrId useEffect(() => { + console.log("[FB-PANEL-DATA-FETCH] Effect triggered"); + console.log("[FB-PANEL-DATA-FETCH] sortedBrandLayoutInfo:", sortedBrandLayoutInfo); + console.log("[FB-PANEL-DATA-FETCH] selectedPatnrId:", selectedPatnrId); + if (sortedBrandLayoutInfo && selectedPatnrId) { - console.log("[FeaturedBrandsPanel] Data Fetching Effect - selectedPatnrId:", selectedPatnrId); - console.log("[FeaturedBrandsPanel] sortedBrandLayoutInfo:", sortedBrandLayoutInfo); + console.log("[FB-PANEL-DATA-FETCH] Fetching data - patnrId:", selectedPatnrId); Object.entries(DISPATCH_MAP) // .forEach(([templateCode, action]) => { if (hasTemplateCodeWithValue(sortedBrandLayoutInfo, templateCode)) { @@ -811,18 +814,20 @@ const FeaturedBrandsPanel = ({ isOnTop, panelInfo, spotlightId }) => { fromDetail && shouldRenderComponent(brandShopByShowContsList) ) { - console.log("[FeaturedBrandsPanel] Skip re-fetch ShopByShow on return from detail"); + console.log("[FB-PANEL-DATA-FETCH] Skip re-fetch ShopByShow on return from detail"); return; } - console.log("[FeaturedBrandsPanel] Fetching data for template:", templateCode, "patnrId:", selectedPatnrId); + console.log("[FB-PANEL-DATA-FETCH] Dispatching for template:", templateCode, "patnrId:", selectedPatnrId); dispatch(action({ patnrId: selectedPatnrId })); } }); // NBCU(patnrId: 21)์ธ ๊ฒฝ์šฐ Top Banner API ํ˜ธ์ถœ - if (selectedPatnrId === 21) { - console.log("[FeaturedBrandsPanel] NBCU detected - calling Top Banner API"); + if (selectedPatnrId === 21 || selectedPatnrId === "21") { + console.log("[FB-PANEL-TOP-BANNER] NBCU(patnrId=21) detected - calling Top Banner API"); + console.log("[FB-PANEL-TOP-BANNER] selectedPatnrId:", selectedPatnrId, "(type:", typeof selectedPatnrId, ")"); + console.log("[FB-PANEL-TOP-BANNER] Before API call - brandTopBannerInfo:", brandTopBannerInfo); dispatch(getBrandTopBanner({ patnrId: selectedPatnrId })); } diff --git a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.jsx b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.jsx new file mode 100644 index 00000000..742f4b52 --- /dev/null +++ b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.jsx @@ -0,0 +1,67 @@ +import React, { memo, useCallback, useState } from "react"; +import CustomImage from "../../../components/CustomImage/CustomImage"; +import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; +import css from "./TopBannerImage.module.less"; + +const Container = SpotlightContainerDecorator( + { leaveFor: { left: "", right: "", down: "best-seller-spotlightId" }, enterTo: "default-element" }, + "div" +); + +const TopBannerImage = memo(({ banrImgUrl, banrImgNm, banrNm, spotlightId }) => { + console.log("[TOP-BANNER-IMG] Rendering with URL:", banrImgUrl); + console.log("[TOP-BANNER-IMG] spotlightId:", spotlightId); + + const [imageDimensions, setImageDimensions] = useState({ width: 0, height: 0 }); + + const handleClick = useCallback(() => { + console.log("[TOP-BANNER-IMG] Clicked"); + // ํ•„์š”์‹œ ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ ๋กœ์ง ์ถ”๊ฐ€ + }, []); + + const handleImageLoad = useCallback((e) => { + const img = e.target; + console.log("[TOP-BANNER-IMG] Image loaded - dimensions:", img.naturalWidth, "x", img.naturalHeight); + + // ์›๋ณธ ์ด๋ฏธ์ง€ ํฌ๊ธฐ + const naturalWidth = img.naturalWidth; + const naturalHeight = img.naturalHeight; + + setImageDimensions({ + width: naturalWidth, + height: naturalHeight + }); + }, []); + + if (!banrImgUrl) { + console.log("[TOP-BANNER-IMG] No image URL provided"); + return null; + } + + return ( + + {banrImgNm + + ); +}); + +export default TopBannerImage; \ No newline at end of file diff --git a/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.module.less b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.module.less new file mode 100644 index 00000000..b294d855 --- /dev/null +++ b/com.twin.app.shoptime/src/views/FeaturedBrandsPanel/TopBannerImage/TopBannerImage.module.less @@ -0,0 +1,25 @@ +.topBannerContainer { + position: absolute; + right: 60px; + top: 48px; + padding: 15px; + background-color: transparent; + + // Spotlight ํฌ์ปค์Šค ์Šคํƒ€์ผ + &:focus { + outline: 2px solid #fff; + outline-offset: 2px; + background-color: rgba(255, 255, 255, 0.1); + } + + // Spotlight hover ํšจ๊ณผ + &[data-spotlight-id] { + cursor: pointer; + } +} + +.topBannerImage { + display: block; + // ํฌ๊ธฐ๋Š” JavaScript์—์„œ ๋™์ ์œผ๋กœ ์„ค์ • + border-radius: 4px; +} \ No newline at end of file