class CustomLabel extends ShopbySkin.modules.ShopbyElement {
constructor() {
super();
const eventNo = getUrlParam('event');
callShopApi(`/display/events/${eventNo}`, 'GET').then((data) => {
const { result: eventDetail } = data;
this.store.resetState({
eventLabel: eventDetail.label,
});
});
}
}
customElements.define('custom-event-detail-label', CustomLabel);
class CustomEventDetailDisplayMenu extends ShopbySkin.modules
.EventDetailDisplayMenu {
setup() {
super.setup();
const currentTabId = this.store.getState().currentTabId;
const displayMenus = this.store.getState().displayMenus;
// [Jay] 간헐적으로 데이터 없는 현상이 있어서 상태값 업데이트
if (currentTabId === '' && displayMenus.length === 0) {
const eventNo = getUrlParam('event');
callShopApi(`/display/events/${eventNo}`, 'GET').then((data) => {
const { result: eventDetail } = data;
this.store.setState((prev) => ({
...prev,
currentTabId: 'section0',
displayMenus: eventDetail.section.map((menu, index) => ({
...menu,
id: 'section' + index,
})),
}));
});
}
}
}
customElements.define(
'custom-event-detail-display-menu',
CustomEventDetailDisplayMenu,
);
class CustomEventDetailTopImage extends ShopbySkin.modules.ShopbyElement {
constructor() {
super();
const eventNo = getUrlParam('event');
callShopApi(`/display/events/${eventNo}`, 'GET').then((data) => {
const { result: eventDetail } = data;
this.store.resetState({
top: eventDetail.top,
eventLabel: eventDetail.label,
});
});
}
}
customElements.define(
'custom-event-detail-top-image',
CustomEventDetailTopImage,
);
(async () => {
const { pageHelper, EventManager, utils, actions } = ShopbySkin;
const eventDetailHelper = pageHelper.eventDetailHelper();
const $customEventDetailProductList = $('custom-event-detail-product-list'); // 기획전 상품 리스트 컴포넌트
const containerEl = document.querySelector(
'[shopby-helper-key="event-detail-helper-key"]',
);
const eventNo = new URLSearchParams(location.search).get('event');
const eventDetailParams = {
queryString: {
soldout: false,
saleStatus: 'ONSALE',
hasProductDetail: true,
},
};
const eventDetailRes = await callShopApi(
`/display/events/${eventNo}?`,
'GET',
eventDetailParams,
);
const data = eventDetailRes.result.section;
const eventDetailProductHtml = renderHtml(
$customEventDetailProductList,
data,
);
$customEventDetailProductList.append(eventDetailProductHtml);
const { event: eventNoOrId } = utils.getQueryParams(location);
const eventDetailRequest = {
eventNo: eventNoOrId,
sortType: 'ADMIN_SETTING',
soldout: false,
};
const redirectLoginPage = () => {
const nextUrl = '/pages/sign-in/sign-in.html';
location.href = `${nextUrl}?from=${encodeURIComponent(location.href)}`;
};
eventDetailHelper.initialize({
helperKey: 'event-detail-helper-key',
});
const likeHelper = {
toggleClassName: (likeEl) => {
likeEl.classList.toggle('is-active');
},
toggleLikeStatus: async (likeEl) => {
const productNo = likeEl.getAttribute('shopby-product-no') ?? 0;
await actions.toggleLikeStatus({
productNo: Number(productNo),
});
},
};
const CLICK_EVENT_HANDLER_MAP = {
HANDLE_COUPON_BTN_CLICK: () => {
if (!utils.isSignIn()) {
ShopbySkin.EventManager.fire('MODAL_CONFIRM_OPEN', {
noticeType: 'CAUTION',
message: '로그인하셔야 본 서비스를 이용하실 수 있습니다.',
onConfirm: redirectLoginPage,
});
return;
}
const { coupon, eventNo } =
document.querySelector('event-detail-product-list').store.state ?? {};
ShopbySkin.EventManager.fire('OPEN_LAYER_MODAL', {
title: '쿠폰받기',
name: 'coupon-download',
data: {
coupons: coupon?.coupons ?? [],
eventNo,
},
isFull: false,
onClose: () => null,
});
},
HANDLE_SECTION_ID_CLICK: ({ target, helper }) => {
const tabId = target.getAttribute('shopby-tab-id');
const tabs = document.querySelectorAll('.event_tabs');
tabs.forEach((val) => {
val.classList.remove('is-active');
});
document.querySelector(`#tab_${tabId}`).classList.add('is-active');
helper.eventAction.selectEventCategory(tabId);
},
LIKE_PRODUCT: ({ target }) => {
if (!utils.isSignIn()) {
ShopbySkin.EventManager.fire('MODAL_CONFIRM_OPEN', {
noticeType: 'CAUTION',
message: '로그인하셔야 본 서비스를 이용하실 수 있습니다.',
onConfirm: redirectLoginPage,
});
return;
}
const likeEl = target.closest('[shopby-product-no]');
likeHelper.toggleClassName(likeEl);
likeHelper.toggleLikeStatus(likeEl);
},
};
const CHANGE_EVENT_HANDLER_MAP = {
HANDLE_SORT_CHANGE: ({ target, helper }) => {
helper.eventAction.fetchEventDetail({
...eventDetailRequest,
sortType: target.value,
});
},
};
EventManager.fire('INIT_EVENT_PRODUCT_SECTION_SLIDER', {
spaceBetween: 32,
direction: 'horizontal',
effect: 'slide',
slidesPerView: 'auto',
});
EventManager.on('PAGE_LOAD_COMPLETED', () => {
eventDetailHelper.eventAction.fetchEventDetail(eventDetailRequest);
});
const clickEventListener = ({ target }) => {
const actionType =
target.getAttribute('shopby-action') ??
target.closest('button')?.getAttribute('shopby-action');
CLICK_EVENT_HANDLER_MAP[actionType]?.({
helper: eventDetailHelper,
target,
});
};
const changeEventListener = ({ target }) => {
const actionType = target.getAttribute('shopby-action');
CHANGE_EVENT_HANDLER_MAP[actionType]?.({
helper: eventDetailHelper,
target,
});
};
containerEl.addEventListener('click', clickEventListener);
containerEl.addEventListener('change', changeEventListener);
})();