(() => { const moveSoldOutToEnd = (containerEl, sectionId) => { const targetSectionIds = ['SCPC0001']; // 본서버 PC 메인 신상 영역만 if (!targetSectionIds.includes(sectionId)) return; setTimeout(() => { if (!containerEl) return; // 슬라이더형 containerEl.querySelectorAll('.swiper-wrapper').forEach((wrapper) => { const slides = Array.from(wrapper.children).filter((el) => el.classList.contains('swiper-slide') ); if (!slides.length) return; const normal = []; const soldout = []; slides.forEach((slide) => { const isSoldOut = !!slide.querySelector('.thumb-item__overlay'); (isSoldOut ? soldout : normal).push(slide); }); [...normal, ...soldout].forEach((el) => wrapper.appendChild(el)); }); // 일반형 containerEl.querySelectorAll('.display-product__contents').forEach((contents) => { if (contents.querySelector('.swiper-wrapper')) return; const items = Array.from(contents.children).filter( (el) => el.classList && el.classList.contains('thumb-item') ); if (!items.length) return; const normal = []; const soldout = []; items.forEach((item) => { const isSoldOut = !!item.querySelector('.thumb-item__overlay'); (isSoldOut ? soldout : normal).push(item); }); [...normal, ...soldout].forEach((el) => contents.appendChild(el)); }); }, 400); }; const initialize = async (params, containerEl) => { if (params.usesProductSearch) { containerEl.setDisplayProductConfig(); moveSoldOutToEnd(containerEl, params.sectionId); return; } const { actions } = ShopbySkin; try { await actions?.getDisplayProductSectionById?.({ sectionsId: params?.sectionId, ...params?.apiOption?.displayProductSectionByIdQueryParams, }); moveSoldOutToEnd(containerEl, params.sectionId); } catch (e) { console.error(e); containerEl.setIsLoaded(true); } }; const { EventManager, utils, constants } = ShopbySkin; const sectionId = document.currentScript.getAttribute('shopby-section-id'); const containerEl = document.querySelector(`[shopby-section-id="${sectionId}"]`); const displayProductActionMap = { // NOTE: 좋아요버튼 클릭. PRODUCT_LIKE_BTN: ({ sectionId, 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, sectionId, onSuccess: (like) => { const likeBtns = document.querySelectorAll(`[shopby-product-no="${productNo}"]`); likeBtns?.forEach((btn) => { like ? btn.classList.add('is-active') : btn.classList.remove('is-active'); }); }, }) : EventManager.fire('MODAL_CONFIRM_OPEN', { message: `로그인하셔야 본 서비스를 이용하실 수 있습니다.`, noticeType: constants.NOTICE_MODAL_TYPE.WARNING, onConfirm: () => { const nextUrl = `${location.origin}/pages/sign-in/sign-in.html`; location.href = `${nextUrl}?from=${encodeURIComponent(location.href)}`; }, }); }, OPEN_PRODUCT_OPTION_MODAL: ({ event }) => { event?.preventDefault?.(); const btn = event.target.closest('[shopby-product-no]'); const productNo = Number(btn.getAttribute('shopby-product-no') ?? 0); const isSoldOut = utils.convertStringBooleanToBoolean(btn.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'; }, }); } }, }; const clickEventListener = (e) => { const btn = e.target.closest('[shopby-action]') || e.target.parentElement.closest('[shopby-action]'); const action = btn?.getAttribute('shopby-action'); displayProductActionMap[action]?.({ sectionId, event: e, }); }; initialize( { sectionId, usesProductSearch: containerEl.hasAttribute('shopby-uses-product-search'), }, containerEl ); containerEl.addEventListener('click', clickEventListener); containerEl.removeEventListener('unload', clickEventListener); })();