Best Sellers

View all

GLOW Series

View all

Inspired by the delicate yet resilient curvature of an orchid petal, this piece is sculpted to intuitively embrace the natural contours of your face.

ORCHID Series

View all

Our Blog

View all

21 Days of Ritual

Before

After

(function () { const TAG = "spz-custom-discount-popup-bxgy"; class SpzCustomPlacementPopup extends SPZ.BaseElement { constructor(element) { super(element); this.deviceTypeMap = { PD_PC_MOBILE: "PD_PC_MOBILE", PD_PC: "PD_PC", PD_MOBILE: "PD_MOBILE" }; this.reportEventMap = { PE_IMPRESSION: 'PE_IMPRESSION',//曝光事件 PE_CLICK: 'PE_CLICK',//点击事件 } this.popup_z_index = 1050; } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.setupAction_(); this.viewport_ = this.getViewport(); } mountCallback = () => { } // 节流处理 每5s内多次点击 算一次点击上报 throttleReport = this.win.SPZCore.Types.throttle( this.win, (data) => { this.reportData(data) }, 5000 ) // 上报数据 reportData = async(data) => { const reqBody = { placement_id: data.placement_id, event: data.event } this.xhr_.fetchJson(`/api/storefront/promotion/placement/data/report`, { method: "post", body: reqBody }).then((res)=>{ // todo ... }) } doRender_ = (data) => { const popupList = data.popupList || []; if(popupList.length){ // 内容配置 序列化字符转化 popupList.forEach(item => { item.parseConfig = JSON.parse(item.config); }) } return this.templates_ .findAndRenderTemplate(this.element, {popupList}) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }).then(() =>{ popupList.forEach(item => { // buy x get y 弹窗渲染 this.showPopup(item); }) }) } showPopup = async(itemData) => { // 展示弹窗 符合展示条件的弹窗 const $lightbox_item = document.querySelector(`#popup_bxgy_${itemData.id}`); $lightbox_item && SPZ.whenApiDefined($lightbox_item).then((api)=> { const isPC = this.viewport_.getWidth() >= 768; const isMobile = this.viewport_.getWidth() < 768; const isMatchPCDevice = itemData.device === this.deviceTypeMap.PD_PC_MOBILE || itemData.device === this.deviceTypeMap.PD_PC; const isMatchMobileDevice = itemData.device == this.deviceTypeMap.PD_PC_MOBILE || itemData.device === this.deviceTypeMap.PD_MOBILE; if((isPC && isMatchPCDevice) || (isMobile && isMatchMobileDevice)) { // 根据推送时间 延迟展示弹窗 setTimeout(() => { $lightbox_item.style.zIndex = this.popup_z_index; this.popup_z_index ++; api.open(); }, itemData.delay_seconds * 1000); } }) } setupAction_ = () => { this.registerAction('handleTrack', async(invocation) => { // 如果是主题编辑器则不用处理 if(window.top !== window.self) { return; } const data = invocation.args; const event = data.event; // 点击上报 节流处理 if(event === this.reportEventMap.PE_CLICK) { await this.throttleReport(data); } else { this.reportData(data); } }); this.registerAction('handleLinkto', (invocation) => { const url = invocation.args.url; const isNewOpen = invocation.args.isNewOpen; const target = isNewOpen ? '_blank' : '_self'; if(url) { window.open(url, target); } }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomPlacementPopup) })() (function () { const TAG = "spz-custom-discount-placement"; class SpzCustomDiscountPlacement extends SPZ.BaseElement { constructor(element) { super(element); this.placementTypeMap = { PTT_POPUP: "PTT_POPUP", PTT_BANNER: "PTT_BANNER" }; this.placementTemplateMap = { PT_POPUP_BUY_X_GET_Y: "PT_POPUP_BUY_X_GET_Y", PT_BANNER_BUY_X_GET_Y: "PT_BANNER_BUY_X_GET_Y" }; this.progressMap = { PROGRESS_ONGOING: "PROGRESS_ONGOING", PROGRESS_NOT_STARTED: "PROGRESS_NOT_STARTED", PROGRESS_FINISHED: "PROGRESS_FINISHED", PROGRESS_PAUSED: "PROGRESS_PAUSED" }; } static deferredMount() { return false; } buildCallback = () => { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.setupAction_(); this.viewport_ = this.getViewport(); } mountCallback = () => { this.handlePlacement(); } // 上报数据 reportData = async(data) => { const reqBody = { placement_id: data.placement_id, event: data.event } const url = `/api/storefront/promotion/placement/data/report`; this.xhr_.fetchJson(url, { method: "post", body: reqBody }).then((res)=>{ // todo ... }) } // 资源位数据获取 getplacementList = async() => { const reqBody = { page_id: window.SHOPLAZZA.meta.page.template_type } const url = `/api/storefront/promotion/placement/list` const data = await this.xhr_.fetchJson(url, { method: "post", body: reqBody }) return data; } handlePlacement = async() => { const res = await this.getplacementList(); const BXGYPopupList = res.list.filter(item => (item.placement_type == this.placementTypeMap.PTT_POPUP && item.placement_template == this.placementTemplateMap.PT_POPUP_BUY_X_GET_Y)); if(BXGYPopupList.length) { const $spz_custom_popup_bxgy = document.querySelector('#spz_custom_popup_bxgy'); SPZ.whenApiDefined($spz_custom_popup_bxgy).then((api)=> { api.doRender_({popupList: BXGYPopupList}); }) } } doRender_ = (data) => { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }) } setupAction_ = () => { this.registerAction('handleTrack', (invocation) => { const data = invocation.args; this.reportData(data) }); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomDiscountPlacement) })()