(() => { const containerEl = document.querySelector("[shopby-footer-container]"); const shortcut = { async initialize(commonData) { await this.replaceManifestWith(this.generateManifestUrl(commonData)); this.executeServiceWorker(); }, replaceManifestWith(manifestURL) { const manifestPlaceholderEl = document.querySelector("[shopby-manifest-placeholder]"); manifestPlaceholderEl?.setAttribute("href", manifestURL); }, generateManifestUrl(commonData) { const mallName = commonData.mallConfig.mall?.mallName; const manifest = { name: mallName, short_name: mallName, description: mallName, start_url: location.origin, display: "standalone", orientation: "portrait", incognito: "split", icons: [ { src: `https:${commonData.bannerConfig?.appIcon}`, sizes: "144x144", type: "image/png", purpose: "any", }, ], }; const blob = new Blob([JSON.stringify(manifest)], { type: "application/json" }); return URL.createObjectURL(blob); }, executeServiceWorker() { this.deferPromptEvent(); this.registerServiceWorker(); }, deferPromptEvent() { window.addEventListener("beforeinstallprompt", (event) => { event.preventDefault(); window.deferredPrompt = event; }); window.addEventListener("appinstalled", (event) => { event.preventDefault(); window.deferredPrompt = null; }); }, registerServiceWorker() { try { if (!location.href.includes("test-page.html")) { return; } const url = "/serviceWorker.js"; "serviceWorker" in navigator && navigator.serviceWorker.register(url); } catch (e) { console.error(e); } }, }; const CLICK_EVENT_HANDLER_MAP = { HANDLE_ADD_TO_HOME_BTN_CLICK: async () => { const promptEvent = window.deferredPrompt; if (!promptEvent) return; promptEvent.prompt(); const { outcome } = await promptEvent.userChoice; if (outcome === "accepted") { // eslint-disable-next-line require-atomic-updates window.deferredPrompt = null; window.close(); } }, }; const clickEventListener = (e) => { const action = e.target.getAttribute("shopby-action"); CLICK_EVENT_HANDLER_MAP[action]?.(e); }; containerEl?.addEventListener("click", clickEventListener); /* 240523 서주원 : 슬라이드토글 효과 */ (function () { // slideUp 함수 function slideUp(element, duration = 400) { if (element.dataset.isAnimating === "true") return; element.dataset.isAnimating = "true"; element.style.transitionProperty = "height, margin, padding"; element.style.transitionDuration = duration + "ms"; element.style.boxSizing = "border-box"; element.style.height = element.offsetHeight + "px"; element.offsetHeight; // 강제 리플로우 element.style.overflow = "hidden"; element.style.height = 0; element.style.paddingTop = 0; element.style.paddingBottom = 0; element.style.marginTop = 0; element.style.marginBottom = 0; window.setTimeout(function () { element.style.display = "none"; element.style.removeProperty("height"); element.style.removeProperty("padding-top"); element.style.removeProperty("padding-bottom"); element.style.removeProperty("margin-top"); element.style.removeProperty("margin-bottom"); element.style.removeProperty("overflow"); element.style.removeProperty("transition-duration"); element.style.removeProperty("transition-property"); element.dataset.isAnimating = "false"; }, duration); } // slideDown 함수 function slideDown(element, duration = 400) { if (element.dataset.isAnimating === "true") return; element.dataset.isAnimating = "true"; element.style.removeProperty("display"); let display = window.getComputedStyle(element).display; if (display === "none") display = "block"; element.style.display = display; let height = element.offsetHeight; element.style.overflow = "hidden"; element.style.height = 0; element.style.paddingTop = 0; element.style.paddingBottom = 0; element.style.marginTop = 0; element.style.marginBottom = 0; element.offsetHeight; // 강제 리플로우 element.style.boxSizing = "border-box"; element.style.transitionProperty = "height, margin, padding"; element.style.transitionDuration = duration + "ms"; element.style.height = height + "px"; element.style.removeProperty("padding-top"); element.style.removeProperty("padding-bottom"); element.style.removeProperty("margin-top"); element.style.removeProperty("margin-bottom"); window.setTimeout(function () { element.style.removeProperty("height"); element.style.removeProperty("overflow"); element.style.removeProperty("transition-duration"); element.style.removeProperty("transition-property"); element.dataset.isAnimating = "false"; }, duration); } // slideToggle 함수 function slideToggle(element, duration = 400, button = null) { if (element.dataset.isAnimating === "true") return; if (window.getComputedStyle(element).display === "none") { slideDown(element, duration); if (button) button.classList.add("active"); } else { slideUp(element, duration); if (button) button.classList.remove("active"); } } // 전역으로 함수 등록 window.slideUp = slideUp; window.slideDown = slideDown; window.slideToggle = slideToggle; })(); /* 240523 서주원 : 슬라이드토글 효과 사용 */ document.querySelectorAll(".toggleSlideButton").forEach((btn, index) => { btn.addEventListener("click", function () { const content = document.querySelectorAll(".toggleSlideContent")[index]; slideToggle(content, 400, btn); }); }); /* fixed */ // 스크롤과 페이지 로드 시 실행될 함수를 정의 function adjustSideBtnsPosition() { var windowHeight = window.innerHeight; // 창의 높이 var scrollPosition = window.scrollY || window.pageYOffset; // 현재 스크롤 위치 var sideBtnsOriginalBottom = 90; // .side_btns 원래 bottom 위치 var bottomLimit = 510; // 스크롤 내렸을 때 bottom 위치 var sideBtns = document.querySelector(".foot_fixed_box"); var sideBtnsHeight = sideBtns.offsetHeight; // .side_btns의 높이 var documentHeight = document.documentElement.scrollHeight; // 문서 전체 높이 // 스크롤 위치에 따라 .side_btns의 위치를 조정 if (documentHeight - windowHeight - scrollPosition <= bottomLimit) { // 스크롤이 아래쪽에 도달했을 때 var translateY = bottomLimit - (documentHeight - windowHeight - scrollPosition) - sideBtnsOriginalBottom; sideBtns.style.transform = "translateY(-" + translateY + "px)"; sideBtns.style.bottom = sideBtnsOriginalBottom + "px"; } else { // 스크롤이 아래쪽에 도달하지 않았을 때 sideBtns.style.transform = "translateY(0)"; sideBtns.style.bottom = sideBtnsOriginalBottom + "px"; } } // 스크롤 이벤트 리스너 추가 window.addEventListener("scroll", adjustSideBtnsPosition); // 페이지 로드 시 함수 실행 document.addEventListener("DOMContentLoaded", adjustSideBtnsPosition); /* go down */ var btnGoBottom = document.getElementById("goBottom"); btnGoBottom.addEventListener("click", function () { window.scrollTo({ top: document.body.scrollHeight, behavior: "smooth", }); }); })();