(() => { const { actions, Handlebars, EventManager } = ShopbySkin; // 노출할 배너 ID (template 태그의 shopby-banner-id 속성에서 읽음) // currentScript는 동기 실행 시점에만 유효하므로 최상단에서 읽어둠 const BANNER_ID = document.currentScript?.getAttribute('shopby-banner-id'); // 이미지 표시 기간 체크 const isImageInDisplayPeriod = (image) => { if (!image.displayValue) return true; const { displayPeriodType, startDateTime, endDateTime } = image.displayValue; if (displayPeriodType === 'REGULAR') return true; if (displayPeriodType === 'PERIOD') { const now = new Date(); return now >= new Date(startDateTime) && now <= new Date(endDateTime); } return true; }; // 배너 응답에서 노출 가능한 이미지만 추출 (템플릿용 형태로 매핑) const extractImages = (responseData) => { const bannerData = responseData?.data || responseData; let banners = []; if (Array.isArray(bannerData)) { banners = bannerData[0]?.banners || []; } else if (bannerData?.banners) { banners = bannerData.banners; } return banners .filter((banner) => banner.visible === true) .flatMap((banner) => (banner.bannerImages || []).filter(isImageInDisplayPeriod)) .map((image) => ({ imageUrl: image.imageUrl, description: image.description || '', landingUrl: image.landingUrl || '', target: image.openLocationType === 'NEW' ? '_blank' : '_self', })); }; EventManager.on('PAGE_LOAD_COMPLETED', async () => { if (!BANNER_ID) return; const container = document.querySelector('product-detail-notification'); if (!container) return; const template = container.querySelector('script[type="text/x-handlebars-template"]'); if (!template) return; try { const response = await actions.getBannerById({ bannerId: BANNER_ID }); const images = extractImages(response); if (!images.length) { container.style.display = 'none'; return; } const compiled = Handlebars.compile(template.innerHTML); container.innerHTML = compiled({ images }); container.style.display = 'block'; } catch (error) { console.error('상품상세 공지 배너 조회 실패:', error); container.style.display = 'none'; } }); })();