(() => { const { EventManager, utils } = ShopbySkin; const { isMobileDevice } = utils; const headerEl = document.querySelector('shopby-header-v2'); let memberProfile = null; // 외부스크립트 등록 기능. 삭제금지 ShopbyExternalScript?.initialize({ apiOption: { platform: 'PC', }, }).then(() => { EventManager.fire('QUERY_PAGE_SCRIPTS', ShopbyExternalScript?.scripts); }); // 클릭이벤트 맵 // 1. SIGN_OUT : 로그아웃 const headerActionMap = { SIGN_OUT: () => { EventManager.fire('SIGN_OUT'); window.ShopbySkin.utils.signOut(); }, GO_MY_MENU: (e) => { if (!utils.isSignedIn()) { e.preventDefault(); const from = e.target.href; const nextUrl = `${location.origin}/pages/sign-in/sign-in.html`; location.href = `${nextUrl}?from=${encodeURIComponent(from)}`; } }, }; // 클릭이벤트 핸들러 const clickEventListener = (e) => { const action = e?.target?.closest('[shopby-action]')?.getAttribute('shopby-action'); headerActionMap[action]?.(e); }; const applyActiveCategory = (data, activeCategoryNo) => { return data?.map((item) => (item.categoryNo === activeCategoryNo ? { ...item, active: true } : { ...item, active: false })); }; // 숨김 카테고리는 기본적으로 숨기고, 지정된 등급일 때만 노출 (설정: libs/custom-common.js) const filterCategoriesByGrade = (categories, memberGradeNo) => { const { categoryNo, memberGradeNo: hiddenGradeNo } = window.HIDDEN_CATEGORY_CONFIG; if (memberGradeNo === hiddenGradeNo) return categories; return categories?.filter((item) => item.categoryNo !== categoryNo); }; //기획전 loading 데이터 const fetchEventList = async () => { try { const response = await fetch('https://shop-api.e-ncp.com/display/events?page.number=1&page.size=2&progressStatus=ING&order.by=REGISTER_DATE&order.direction=DESC', { headers: { 'Content-Type': 'application/json', Version: '2.0', platform: 'PC', clientId: 'csG2RJQcc5VZ+OjSZWG1og==', }, }); if (!response.ok) { throw new Error('Failed to fetch event list'); } const data = await response.json(); return data; } catch (error) { console.error(error); } }; //active카테고리 데이터 업데이트 (헤더는 전체 목록 유지, active만 표시) EventManager.on('QUERY_DISPLAY_CATEGORY', (data) => { const displayCategoryEl = document.querySelector('[slot="displayCategory"]'); const displayState = displayCategoryEl?.store.getState(); const activeCategoryNo = displayState?.multiLevelCategories?.[0]?.categoryNo; if (displayCategoryEl && activeCategoryNo != null && headerEl) { const headerState = headerEl.store.getState(); const headerCategories = headerState?.multiLevelCategories; if (headerCategories?.length) { headerEl.store.setState({ ...headerState, multiLevelCategories: applyActiveCategory(headerCategories, activeCategoryNo), }); } } }); EventManager.on('PAGE_LOAD_COMPLETED', async (commonData) => { const { profile } = commonData; memberProfile = profile; if (headerEl) { const headerState = headerEl.store.getState(); const headerCategories = headerState?.multiLevelCategories; if (headerCategories?.length) { headerEl.store.setState({ ...headerState, multiLevelCategories: filterCategoriesByGrade(headerCategories, memberProfile?.memberGradeNo), }); } } // 외부스크립트 등록 기능. 삭제금지 ShopbyExternalScript?.setGlobalObjectSb({ getPlatform: () => (isMobileDevice ? 'MOBILE_WEB' : 'PC'), profile, }); // 햄버거 메뉴 액션 const allMenuBtn = document.querySelector('.nav__all-menu-btn'); const labelTextEl = allMenuBtn.querySelector('.nav__all-menu-btn-label'); allMenuBtn.addEventListener('click', () => { allMenuBtn.classList.toggle('open'); labelTextEl.textContent = allMenuBtn.classList.contains('open') ? '카테고리 닫힘' : '카테고리 열림'; }); const filteredData = await fetchEventList(); if (!filteredData?.contents?.length) return; if (headerEl) { const state = { ...headerEl.store.getState(), hasEvents: true, getEventList: filteredData }; headerEl.store.setState(state); headerEl.updateSlot(state, 'event-menu'); } }); headerEl?.addEventListener('click', clickEventListener); const searchParams = new URLSearchParams(location.search); const trackingKey = searchParams.get('trackingKey'); const channelType = searchParams.get('channelType'); const { setTrackingKey, setChannelType } = ShopbySkin.utils; setTrackingKey(trackingKey); setChannelType(channelType); })();