(() => { const { EventManager, pageHelper, utils } = ShopbySkin; const { initialize } = pageHelper.displayDetailHelper(); const param = utils.getQueryParams(); const displayDetailActionMap = { // NOTE: 좋아요버튼 클릭 PRODUCT_LIKE_BTN: ({ event }) => { event?.preventDefault?.(); const btn = event.target.closest('[shopby-product-no]'); const productNo = Number(btn.getAttribute('shopby-product-no') ?? 0); utils.isSignIn() ? EventManager.fire('MUTATE_LIKE_PRODUCT', { productNo, onSuccess: (like) => { like ? btn.classList.add('is-active') : btn.classList.remove('is-active'); }, }) : EventManager.fire('MODAL_CONFIRM_OPEN', { message: `로그인하셔야 본 서비스를 이용하실 수 있습니다.`, noticeType: 'WARNING', onConfirm: () => { const nextUrl = `${location.origin}/pages/sign-in/sign-in.html`; location.href = `${nextUrl}?from=${encodeURIComponent(location.href)}`; }, }); }, OPEN_PRODUCT_OPTION_MODAL: ({ event, btn }) => { event?.preventDefault?.(); const btns = event.target.closest('[shopby-product-no]'); const productNo = Number(btns.getAttribute('shopby-product-no') ?? 0); const isSoldOut = utils.convertStringBooleanToBoolean( btns.getAttribute('shopby-is-sold-out') ); if (isSoldOut) { return; } if (!utils.isAdultVerified(event)) { EventManager.fire('MODAL_CONFIRM_OPEN', { message: '성인인증이 필요한 상품입니다.', noticeType: constants.NOTICE_MODAL_TYPE.CAUTION, onConfirm: () => { const nextUrl = `${location.origin}/pages/sign-in/sign-in.html`; location.href = `${nextUrl}?from=${encodeURIComponent(location.href)}`; }, }); return; } EventManager.fire('OPEN_LAYER_MODAL', { name: 'select-product-option', title: '옵션 선택', isFull: false, modalAddClass: 'select-product-option-modal', data: { productNo, }, }); }, MOVE_PRODUCT_DETAIL: ({ event }) => { if (!utils.isAdultVerified(event)) { EventManager.fire('MODAL_CONFIRM_OPEN', { message: '성인인증이 필요한 상품입니다.', noticeType: 'CAUTION', onConfirm: () => { location.href = '/pages/intro/adult-certification.html?go-back=true'; }, }); } }, }; initialize({ sectionsId: param.sectionId, by: param.sortType, pageSize: param.pageSize, pageNumber: param.pageNumber, }); const clickEventListener = (e) => { const btn = e.target.closest('[shopby-action]') || e.target.parentElement.closest('[shopby-action]'); const action = btn?.getAttribute('shopby-action'); displayDetailActionMap[action]?.({ event: e, }); }; document.addEventListener('click', clickEventListener); EventManager.on('QUERY_DISPLAY_SECTIONS_IDS_SECTIONID', (data) => { // 외부스크립트 등록 기능. 삭제금지 ShopbyExternalScript?.setGlobalObjectSb({ displaySection: { ...data } }); }); EventManager.on('PAGE_LOAD_COMPLETED', () => { // 외부스크립트 등록 기능. 삭제금지 ShopbyExternalScript?.setPageScriptType('DISPLAY_SECTION'); }); // ============================================================================ // 오늘출발 + 무료배송 뱃지 시스템 // ============================================================================ let holidayData = null; const initShippingBadgeSystem = async () => { if (window.ShippingBadgeUtils) { holidayData = await window.ShippingBadgeUtils.getHolidayData(); } }; const applyShippingBadges = () => { const containerEl = document.querySelector('[shopby-display-detail-items]'); if (!containerEl) return; const productItems = containerEl.querySelectorAll('.thumb-item'); const displayDetailItemsEl = document.querySelector('display-detail-items'); const items = displayDetailItemsEl?.store?.state?.items; if (!items || !items.length) return; productItems.forEach((item, index) => { const product = items[index]; const badgeContainer = item.querySelector('.product-badges-container'); if (!badgeContainer || !product) return; badgeContainer.innerHTML = ''; const salePrice = product.salePrice; const deliveryType = product.deliveryConditionType; const discountAmt = product.immediateDiscountAmt || 0; const minFreeShippingAmt = product.deliveryConditionInfo?.criteria || 50000; // 오늘출발 뱃지 let todayShippingBadgeHTML = ''; if (window.ShippingBadgeUtils && holidayData) { const canShip = window.ShippingBadgeUtils.canShipToday(holidayData.rawData, product); if (canShip) { todayShippingBadgeHTML = window.ShippingBadgeUtils.createTodayShippingBadge(); } else if (window.ShippingBadgeUtils.hasStock(product)) { const nextShippingDate = window.ShippingBadgeUtils.getNextShippingDate( holidayData.rawData, holidayData.continuousHoliday ); if (nextShippingDate) { todayShippingBadgeHTML = window.ShippingBadgeUtils.createNextShippingBadge( nextShippingDate.formatted ); } } } // 무료배송 뱃지 const isFreeShipping = deliveryType === 'FREE' || salePrice - discountAmt >= minFreeShippingAmt; let freeShippingBadgeHTML = ''; if (isFreeShipping) { freeShippingBadgeHTML = '무료배송'; } badgeContainer.innerHTML = todayShippingBadgeHTML + freeShippingBadgeHTML; }); }; // 데이터 로드 완료 후 뱃지 적용 EventManager.on('QUERY_DISPLAY_SECTIONS_IDS_SECTIONID', async () => { await initShippingBadgeSystem(); setTimeout(applyShippingBadges, 200); }); })();