class SpzCustomDiscountBundleProducts extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.getDiscountPriceApi = "\/api\/storefront\/promotion\/calculate\/discounted_price"; this.buyNowApi = "\/api\/checkout\/order"; this.batchAtcApi = "\/api\/cart\/batch"; // 款式信息集合 this.productStyleInfo = []; // 弹窗内选择款式集合 this.modalVariantInfo = []; this.show_classic_bundle_spu_style = false; this.bundleProducts = []; //捆绑商品 this.bundleConfig = {}; //下方按钮配置 this.discountId = ""; this.discountType = ""; this.discountInfo = ""; this.lineItems = []; this.tempCss = {}; this.renderQuickShop_ = this.win.SPZCore.Types.debounce(this.win, this.renderQuickShopModal.bind(this), 500); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { this.setupAction_(); }; init(data = []) { this.productStyleInfo = data; } handleRequestError_(data) { this.showToast(data?.message || data?.errors?.[0] || 'Unknown error'); }; showToast(message) { SPZ.whenApiDefined(document.getElementById("discount_toast")).then((apis) => { apis.showToast(message); }); } //外部组件调用传值 setBundleData(products, config = "", id = "", type = "", info = {}) { this.bundleProducts = products; if(config) { this.bundleConfig = config; this.discountId = id; this.discountType = type; this.discountInfo = info; if(type === 'DT_CLASSIC_BUNDLE' && info.enable_min_purchase_qty && info.min_purchase_qty_type == 'spu') { this.show_classic_bundle_spu_style = true; } // 经典捆绑初始化商品数据 if(type == 'DT_CLASSIC_BUNDLE') { this.productStyleInfo = products.map((item) => { return this.getFilteredVariants_(item, 'single'); }); } } } handleChangeSort() { const result = this.productStyleInfo.reduce((map, item) => { if (!map[item.product_id]) { map[item.product_id] = []; } map[item.product_id].push(item); return map; }, {}); Object.values(result).forEach((item) => { this.handleSpzVariantRender_(item, item[0].product_id); this.handleProductOption_(item[0].product_id, true); }); } // 调用spz-tag组件的doRender方法 handleSpzVariantRender_(data, id) { const spzVariantTag = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionSpzVariantTags-${id}`); spzVariantTag && SPZ.whenApiDefined(spzVariantTag).then((api) => { api.render(data, true); }); } // 执行经典捆绑最低购买数量更新 handleMinPurchaseQtyUpdate_(data, id) { const minPruchaseQty = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionMinPurchaseQty-${id}`); minPruchaseQty && SPZ.whenApiDefined(minPruchaseQty).then((api) => { api.render(data, true); }); } // 更新价格 updateProductPrice_(data) { const bottomBtnContainer = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionBottomContainer`); if (data.length == 0) { bottomBtnContainer && SPZ.whenApiDefined(bottomBtnContainer).then((api) => { const renderInfo = { setting: this.bundleConfig, ...{ original_price: 0, received_discounts: 0, picked_qty: 0 } } api.render({original_price: 0, received_discounts: 0}, true); }); return; } const reqBody = { discount_id: this.discountId, customer: { customer_id: '', email: '', }, sales_channel: { sale_channel_type: "online", sale_channel_id: '372868' }, line_items: data } // 如果已经有一个请求在等待,那么取消这个请求 if (this.debounceTimer) { clearTimeout(this.debounceTimer); } this.debounceTimer = setTimeout(() => { this.xhr_.fetchJson(this.getDiscountPriceApi, { method: "post", body: reqBody }).then((res)=>{ // 更新商品列表价格 Object.keys(res.line_items).forEach((key) => { const currentProductPrice = SPZCore.Dom.scopedQuerySelector(document.body, `#appDiscountProductPrice-${key}`); currentProductPrice && SPZ.whenApiDefined(currentProductPrice).then((api) => { api.render(res.line_items[key], true); }); }); // 更新底部按钮总价/总折扣价 const picked_qty = data.reduce((acc, item) => { return acc + item.quantity; }, 0); bottomBtnContainer && SPZ.whenApiDefined(bottomBtnContainer).then((api) => { const data = { setting: this.bundleConfig, ...{ ...res.total_price, picked_qty } } api.render(data, true); }); }).catch((err)=>{ this.handleRequestError_(err); }).finally(()=>{ }) }, 100); } // 还原商品价格 resetProductPrice_(data) { const {price, compare_at_price, id} = data; const currentProductPrice = SPZCore.Dom.scopedQuerySelector(document.body, `#appDiscountProductPrice-${id}`); currentProductPrice && SPZ.whenApiDefined(currentProductPrice).then((api) => { api.render({total_received_discounts: price, total_price: compare_at_price}, true); }); } //处理与selector组件的交互 handleProductOption_(productId, show) { const currentProductOption = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionSelectOption-${productId}`); if (!currentProductOption) { return; }; currentProductOption.toggleAttribute('show', show); const isSelected = currentProductOption.hasAttribute('selected'); // !show 取消选中 // !isSelected 选中商品 if (!show || !isSelected) { const productSelector = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionProductSelector`); productSelector && SPZ.whenApiDefined(productSelector).then((api) => { api.toggle_({ option: productId, value: show }); }); } } // 混搭弹窗内的前端库存校验 handleModalInventoryCheck_(data) { if(this.discountType == 'DT_MIX_MATCH_BUNDLE' || this.discountType == 'DT_CLASSIC_BUNDLE') { const currentVariantAddNum = this.modalVariantInfo.find((item) => item.variant_id == data.variant_id)?.quantity || 0; const quickShopBody = SPZCore.Dom.scopedQuerySelector(document.body, '#apps-discount-quick-shop-body'); if(!!data.variant && currentVariantAddNum == Number(data.variant.available_quantity)) { quickShopBody && quickShopBody.setAttribute('status', 'soldout'); } else { quickShopBody && quickShopBody.setAttribute('status', 'available'); } } else { return; } } // 添加商品子款式 renderVariantTag() { let variantInfo; const quickShopBody = SPZCore.Dom.scopedQuerySelector(document.body, '#apps-discount-quick-shop-body'); quickShopBody && SPZ.whenApiDefined(quickShopBody).then((api) => { variantInfo = api.getVariantsData(); const productId = variantInfo.product_id; const variantId = variantInfo.variant_id; const minPruchaseQtyRender = variantInfo.product.discount_min_purchase_qty || variantInfo.variant.discount_info.discount_min_purchase_qty; if(this.discountType === 'DT_MIX_MATCH_BUNDLE') { const index = this.productStyleInfo.findIndex((item) => item.variant_id == variantInfo.variant_id); if (index != -1) { this.productStyleInfo[index].quantity = Number(this.productStyleInfo[index].quantity) + Number(variantInfo.quantity); this.updateProductPrice_(this.productStyleInfo); } else { this.productStyleInfo.push(this.getFilteredVariants_(variantInfo)); // 若当前商品已选中,更新商品价格 const currentProductOption = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionSelectOption-${productId}`); const isSelected = currentProductOption && currentProductOption.hasAttribute('selected'); isSelected && this.updateProductPrice_(this.productStyleInfo); } const selectedVariantsFilter = this.productStyleInfo.filter((item) => item.product_id == productId); this.handleSpzVariantRender_(selectedVariantsFilter, productId); this.handleProductOption_(productId, true); } else { if(this.discountInfo.enable_min_purchase_qty == true && this.discountInfo.min_purchase_qty_type == 'spu' && minPruchaseQtyRender > 1) { const index = this.modalVariantInfo.findIndex((item) => item.variant_id == variantId); if (index != -1) { this.modalVariantInfo[index].quantity = Number(this.modalVariantInfo[index].quantity) + 1; } else { this.modalVariantInfo.push(this.getFilteredVariants_(variantInfo, 'classic_spu')); } const modalVariantTag = SPZCore.Dom.scopedQuerySelector(document.body, '#promotionModalVariantTagRender'); modalVariantTag && SPZ.whenApiDefined(modalVariantTag).then((api) => { api.render(this.modalVariantInfo, true); }); this.handleModalInventoryCheck_(variantInfo); const selectedVariantsNum = this.modalVariantInfo.reduce((acc, item) => { return acc + item.quantity; }, 0); if(selectedVariantsNum == minPruchaseQtyRender) { this.handleSpzVariantRender_([this.getFilteredVariants_(variantInfo)], productId); this.productStyleInfo = this.productStyleInfo.filter((item) => item.product_id != productId).concat(this.modalVariantInfo); const renderData = this.productStyleInfo.filter((item) => item.product_id == productId).map((item) => { return { ...item, is_classic_bundle_product_list_variant_tag: true } }); const classicSpuTag = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionClassicSpuTags-${productId}`); classicSpuTag && SPZ.whenApiDefined(classicSpuTag).then((api) => { api.render(renderData, true); }); this.updateProductPrice_(this.productStyleInfo); const quickView = SPZCore.Dom.scopedQuerySelector(document.body, '#apps-discount-quick-view'); quickView && SPZ.whenApiDefined(quickView).then((api)=>{ api.close(); }); this.modalVariantInfo = []; } else { return; } } // this.productStyleInfo 中已存在与productId, variantId都相同的商品 则直接return 关闭弹窗 const isExist = this.productStyleInfo.some((item) => item.product_id == productId && item.variant_id == variantId); if (isExist) { const quickView = SPZCore.Dom.scopedQuerySelector(document.body, '#apps-discount-quick-view'); quickView && SPZ.whenApiDefined(quickView).then((api)=>{ api.close(); }); return; } // 若 this.productStyleInfo 中已存在与productId相同的商品,则不再添加 否则替换 const index = this.productStyleInfo.findIndex((item) => item.product_id == productId); if (index != -1) { this.productStyleInfo[index] = this.getFilteredVariants_(variantInfo); } else { this.productStyleInfo.push(this.getFilteredVariants_(variantInfo)); } const selectedVariantsFilter = this.productStyleInfo.filter((item) => item.product_id == productId); this.handleSpzVariantRender_(selectedVariantsFilter, productId); this.handleMinPurchaseQtyUpdate_({discount_min_purchase_qty: minPruchaseQtyRender}, productId); this.updateProductPrice_(this.productStyleInfo); } const quickView = SPZCore.Dom.scopedQuerySelector(document.body, '#apps-discount-quick-view'); quickView && SPZ.whenApiDefined(quickView).then((api)=>{ api.close(); }); }); } // 单变体点击添加按钮 renderSingleVariant(data) { const { product_id } = data; const currentProduct = this.bundleProducts.find((product) => product.id == product_id); // 若当前商品已存在,则不再添加 而是更新数量 const index = this.productStyleInfo.findIndex((item) => item.product_id == product_id); if (index != -1) { this.productStyleInfo[index].quantity = Number(this.productStyleInfo[index].quantity) + 1; this.updateProductPrice_(this.productStyleInfo); } else { this.productStyleInfo.push(this.getFilteredVariants_(currentProduct, 'single')); } const renderProductArr = this.productStyleInfo.filter((item) => item.product_id == product_id); this.handleSpzVariantRender_(renderProductArr, product_id); this.handleProductOption_(product_id, true); } // 过滤选中商品的子款式 获取有用的信息 product_id,variant_id,price,compare_at_price,quantity,title,variant_title getFilteredVariants_(data, type = '') { const { id, title, variants, inventory_tracking, inventory_policy, inventory_quantity, product_type } = data; const { product_id, variant_id, variant, quantity, product, discount_min_purchase_qty } = data; const isSingle = type == 'single'; const variantData = isSingle ? (variants[0] || data) : variant; const productData = isSingle ? data : product; let item_quantity = 0; if (this.discountType === 'DT_MIX_MATCH_BUNDLE') { item_quantity = isSingle ? 1 : Number(quantity); } else if (type === 'classic_spu') { item_quantity = 1; } else { item_quantity = discount_min_purchase_qty || productData.discount_min_purchase_qty || variantData.discount_info.discount_min_purchase_qty || 1; } return { product_id: isSingle ? id : product_id, variant_id: variantData?.id || '', price: variantData?.price || '0.00', compare_at_price: variantData?.compare_at_price || '0.00', quantity: item_quantity, inventory_tracking: productData.inventory_tracking, inventory_policy: productData.inventory_policy, inventory_quantity: productData.inventory_quantity, product_type: productData.product_type || this.bundleProducts.find((item) => item.id == product_id)?.product_type || this.bundleProducts.find((item) => item.id == id)?.product_type || '', title: productData.title, variant_title: variantData?.options.map((option) => option.value).join('/') || '', is_multi_style: productData.variants.length > 1, } } handleLoading_ (event) { const { type, action } = event; const loadingElementId = type === 'product' ? '#discount-match-drawer-products_loading' : '#apps-discount-whole-loading'; const loadingElement = document.querySelector(loadingElementId); if (loadingElement) { SPZ.whenApiDefined(loadingElement).then((api) => { if (action === 'show') { api.show_(); } else { api.close_(); } }); } } handleSelectProduct(productArr) { // 从this.productStyleInfo 过滤出选中的商品 const selectedProducts = this.productStyleInfo.filter((item) => productArr.includes(item.product_id)); this.updateProductPrice_(selectedProducts); } // 渲染加购弹窗内容 async renderQuickShopModal(data){ this.handleLoading_({type: 'whole', action: 'show'}); this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product?product_id=${data.product_id}&discount_id=${this.discountId}&apply_scenario=1`, { method: "get", }).then(async(res)=>{ //flash主题放block有层级问题 if(/Flash/.test(window.C_SETTINGS.theme.merchant_theme_name) && document.querySelector(".productInfoSection")) { this.tempCss.zIndex = document.querySelector(".product-info-body").style.zIndex; document.querySelector('.product-info-body').style.zIndex="1048"; } this.handleLoading_({type: 'whole', action: 'close'}); const $quickShop = await SPZ.whenApiDefined(document.querySelector('#apps-discount-quick-view-render')); // 定义默认渲染的子款式 const selectedVariant = res.product.variants.find((v)=> (v.available && v.is_hit_discount)) || res.product.variants[0]; let selectedValues = {}; selectedVariant.options.length && selectedVariant.options.forEach(item => { selectedValues[item.name] = item.value; }) // 默认选中的 子款式、 options res.product.defaultSelectValues = selectedValues; let data = {...res.product, product:res.product, selectedVariant, show_classic_bundle_spu_style: this.show_classic_bundle_spu_style, discountType: this.discountType}; $quickShop.render(data); // 打开加购弹窗 SPZ.whenApiDefined(document.querySelector(`#apps-discount-quick-view`)).then((api)=>{ api.open(); }); }).catch((err)=>{ this.handleLoading_({type: 'whole', action: 'close'}); }) } // 获取选中的商品ids getDefaultSelectorOptions_() { try { const selectedOptions = SPZCore.Dom.scopedQuerySelectorAll(document.body, '[id^="promotionSelectOption-"][selected]'); return SPZCore.Types.toArray(selectedOptions).map((item) => item.getAttribute('option')); } catch (error) { return []; } } // 删除商品子款式 deleteVariantTag(data) { const { product_id, variant_id } = data; if(this.discountInfo.enable_min_purchase_qty == true && this.discountInfo.min_purchase_qty_type == 'spu') { const modalProductVariants = this.modalVariantInfo.filter((item) => item.product_id == product_id && item.variant_id != variant_id); const modalVariantTag = SPZCore.Dom.scopedQuerySelector(document.body, '#promotionModalVariantTagRender'); modalVariantTag && SPZ.whenApiDefined(modalVariantTag).then((api) => { api.render(modalProductVariants, true); }); this.handleModalInventoryCheck_(data); this.modalVariantInfo = modalProductVariants; return; } const currentProductVariants = this.productStyleInfo.filter((item) => item.product_id == product_id && item.variant_id != variant_id); this.handleSpzVariantRender_(currentProductVariants, product_id); // 更新selectedVariants this.productStyleInfo = this.productStyleInfo.filter((item) => item.variant_id != variant_id); if(currentProductVariants.length > 0) { // currentProductVariants 中只要有一项是多款式商品,就更新价格 const isMultiStyle = currentProductVariants.some((item) => item.is_multi_style); if (!isMultiStyle) return; this.handleProductOption_(product_id, true); const selected = this.getDefaultSelectorOptions_(); this.updateProductPrice_(this.productStyleInfo.filter((item) => selected.includes(item.product_id))); } else { this.handleProductOption_(product_id, false); this.resetProductPrice_(this.bundleProducts.find((item) => item.id == product_id)); } } // 加购弹窗未参与活动 加购按钮不可点击 TODO 拆出来 handleNotHitDiscount_(data) { const $quickShopBody = document.querySelector('#apps-discount-quick-shop-body'); //当前子框式未命中活动 if(data.variant.is_hit_discount == false) { $quickShopBody.setAttribute('variantstatus', 'notHitDiscount') } else { $quickShopBody.setAttribute('variantstatus', '') } } setupAction_() { // 子款式 未参与活动 this.registerAction('handleNotHitDiscount', (invocation) => { const data = invocation.args.data; this.handleNotHitDiscount_(data); }); // 渲染加购弹窗 this.registerAction('renderQuickShop', (invocation) => { const data = invocation.args; this.renderQuickShop_(data); }); this.registerAction('renderSingleVariant', (invocation) => { const data = invocation.args; this.renderSingleVariant(data); }); this.registerAction('getVariantInfo', (invocation) => { this.renderVariantTag(); }); this.registerAction('deleteVariantTag', (invocation) => { const data = invocation.args; this.deleteVariantTag(data); }); this.registerAction('getSelectedProduct', (invocation) => { const data = invocation.args.data; this.handleSelectProduct(data); }); //TODO 加购下单逻辑单独拆组件 this.registerAction('handleClick', (data) => { if(this.discountType == 'DT_CLASSIC_BUNDLE') { this.lineItems = this.productStyleInfo; } else { const selectedOptions = SPZCore.Dom.scopedQuerySelectorAll(document.body, '[id^="promotionSelectOption-"]'); const idArr = [...selectedOptions].reduce((acc, item) => { if (item.hasAttribute('selected')) { const optionValue = item.getAttribute('option'); if (optionValue) { acc.push(optionValue); } } return acc; }, []); this.lineItems = this.productStyleInfo.filter((item) => idArr.includes(item.product_id)); } const action = data.args.action === "cart"; if(action) { //add to cart this.xhr_ .fetchJson(this.batchAtcApi, { method: 'POST', body: { line_items: this.lineItems.map((item) => { return { product_id: item.product_id, variant_id: item.variant_id, quantity: Number(item.quantity) } }) } }) .then((data) => { setTimeout(() => { window.location.href = '/cart'; }); }) .catch(async (error) => { await error.then((data) => { this.handleRequestError_(data); }); }); } else { //checkout this.xhr_ .fetchJson(this.buyNowApi, { method: 'POST', body: { line_items: (this.lineItems || []).map((product) => { return { quantity: Number(product.quantity), variant_id: product.variant_id, note: product.note || '', properties: product.properties || {} } }), refer_info: { source: 'buy_now' } } }) .then(async (data) => { if (data.state === 'success') { window.location.href = data.data?.checkout_url; } this.handleRequestError_(data); }) .catch(async (error) => { await error.then((data) => { this.handleRequestError_(data); }); }); } }); this.registerAction('resetModalVariantInfo', () => { //flash主题放block有层级问题 if(/Flash/.test(window.C_SETTINGS.theme.merchant_theme_name) && document.querySelector(".productInfoSection")) { document.querySelector('.product-info-body').style.zIndex = this.tempCss.zIndex; } this.modalVariantInfo = []; }); this.registerAction('handleModalInventoryCheck', (invocation) => { const data = invocation.args.data; this.handleModalInventoryCheck_(data); }); }; }; SPZ.defineElement('spz-custom-discount-bundle-products', SpzCustomDiscountBundleProducts);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.variant_id = '27f2b0b1-b472-42ed-be0b-ec6fa0236a62'; this.discountCardApi = "\/api\/storefront\/promotion\/product_details_page\/card"; this.productsApi = "\/api\/storefront\/promotion\/product_page\/product\/list"; this.bundleRenderElement = "appDiscountProductBundle"; this.model = { loading: false, page: 2, limit: 20, params: { count: 0, has_more: false, sort: { by: "price", direction: "asc" } } } this.discountId = ""; this.discountType = ""; this.bundleProducts = []; //捆绑活动商品 this.buttomConfig = {};//总价及下方按钮配置 this.renderDiscount = this.win.SPZCore.Types.debounce(this.win, this.discountHandel.bind(this) , 500); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } async getDiscountCardList() { const productId = '02d1936f-d6aa-46eb-8837-ffe6624831b2'; const productType = ''; const variantId = this.variant_id; const reqBody = { product_id: productId, variant_id: variantId, discount_types: ["DT_CLASSIC_BUNDLE","DT_MIX_MATCH_BUNDLE"], discount_methods: ["DM_AUTOMATIC"], customer: { customer_id: '', email: '', }, product_type: productType } const data = await this.xhr_.fetchJson(this.discountCardApi, { method: "post", body: reqBody }).then(res => { return res; }).catch(err => { console.error(err); }) return data; }; async discountHandel() { const $bundle = document.querySelector(".app-discount-bundle-inner"); $bundle && SPZCore.Dom.removeElement($bundle); const data = await this.getDiscountCardList(); if(!data.discount_info || data.discount_info.discount_id === "0") { return; } //变量赋值 this.bundleProducts = data.product_info.product; this.buttomConfig = data.product_setting; this.discountId = data.discount_info.discount_id; this.discountType = data.discount_info.discount_type; this.model.params ={ count: data.product_info.count, has_more: data.product_info.has_more, sort: data.product_info.sort } //给捆绑组件传值 SPZ.whenApiDefined(document.getElementById("appDiscountBundleProductsFunc")).then((api) => { api.setBundleData(this.bundleProducts, this.buttomConfig, this.discountId, this.discountType, data.discount_info); }) document.querySelector(".app_discount_bundle").dataset.discountType = data.discount_info.discount_type; SPZ.whenApiDefined(document.getElementById(this.bundleRenderElement)) .then(apis => { apis.render(data,true).then(() => { SPZ.whenApiDefined(document.getElementById("bundleProductsRender")).then((api) => { api.render(data,true).then(() => { this.bindEvent_(); if(this.bundleProducts.length < 5) { document.querySelector(".app-discount-bundle-arrow-left").style.display="none"; document.querySelector(".app-discount-bundle-arrow-right").style.display="none"; } //经典捆绑渲染按钮 if(this.discountType === "DT_CLASSIC_BUNDLE") { SPZ.whenApiDefined(document.getElementById("promotionBottomContainer")).then((api) => { const buttonData = { setting: this.buttomConfig, ...data.product_info.total_price } api.render(buttonData, true); }) } }) }) }) .then(() => { document.querySelector(".app-discount-bundle-inner").classList.add("discount_bundle_" + data.product_setting.template_type || "vertical"); }); }); //本地调试 放商详block里 const isSection = document.querySelector( 'div[data-section-type^="shoplazza://apps/publicapp/blocks/discount_bundle/"] .app_discount_bundle' ); if(!isSection) { document.querySelector(".app_discount_bundle").classList.add("productInfoSection"); } }; // 获取加载的商品数据,拼接html模板 async loadData(cb) { // 请求数据 this.model.loading = true; //查询活动商品接口 const reqBody = { discount_id: this.discountId, page: this.model.page, limit: this.model.limit, "apply_scenario": "AS_ENTITLED_PRODUCT", sort: this.model.params.sort, sales_channel: { sale_channel_type: "online", sale_channel_id: '372868' }, product_id: '02d1936f-d6aa-46eb-8837-ffe6624831b2' } this.xhr_.fetchJson(this.productsApi, { method: "post", body: reqBody }).then(async(res)=>{ const count = res.count; this.model.params.has_more = res.has_more; if (count > 0) { this.model.page++; if (res.products && res.products.length > 0) { let products = res.products.map((product) => { return { ...product, url: appDiscountUtils.globalizePath(product.url), image_padding_bottom: appDiscountUtils.image_padding_bottom(product.image.width, product.image.height,'no-limit'), discount_type: this.discountType } }); // 获取商品列表渲染模板, dom挂载 const $content = document.querySelector(".app-discount-bundle-products"); this.templates_ = SPZServices.templatesForDoc(); this.templates_.renderTemplate(document.querySelector('#appDiscountBundleProductsTemplate'), products).then((el) => { const childNodes = el.querySelectorAll('.as-render-product-item'); if (childNodes && childNodes.length > 0) { $content.append(...childNodes); } }).then(() => { //重新渲染ljs-selector const productSelector = SPZCore.Dom.scopedQuerySelector(document.body, `#promotionProductSelector`); productSelector && SPZ.whenApiDefined(productSelector).then((api) => { api.init(); }); }); this.bundleProducts = [...this.bundleProducts, ...res.products]; SPZ.whenApiDefined(document.getElementById("appDiscountBundleProductsFunc")).then((api) => { api.setBundleData(this.bundleProducts); }) // 监听load去掉灰色背景 document.dispatchEvent(new CustomEvent('fire.load.img')); // 触发懒加载 cb && cb(products); window.lazyLoadInstance && window.lazyLoadInstance.update(); } } this.model.loading = false; }).catch((err)=>{ console.error(err); this.model.loading = false; }) }; setupAction_() { this.registerAction('shiftMove', (data) => { const $el = document.querySelector(".app-discount-bundle-products"); const action = data.args.direct === "right"; const scrollwidth = action ? $el.offsetWidth : -$el.offsetWidth; $el.scrollBy({ left: scrollwidth, behavior: 'smooth' }); }); }; bindEvent_() { // 监听子款式切换,重新渲染 document.addEventListener('dj.variantChange', async(event) => { const variant = event.detail.selected; if (variant.product_id == '02d1936f-d6aa-46eb-8837-ffe6624831b2') { this.variant_id = variant.id; } this.renderDiscount(); }); // 监听滚动,请求数据 const $el = document.querySelector(".app-discount-bundle-products"); if($el) { $el.addEventListener("scroll", this.win.SPZCore.Types.debounce( this.win, () => { const isLeft = $el.scrollLeft === 0; const isRightEnd = $el.scrollLeft + $el.offsetWidth + 10 >= $el.scrollWidth; const isBottomEnd = $el.scrollTop + $el.clientHeight + 10 >= $el.scrollHeight; const isEnd = isBottomEnd && isRightEnd; if(isEnd && this.model.params.has_more && !this.model.loading) { this.loadData(); } }, 50 )) }; }; buildCallback() { this.setupAction_(); }; mountCallback() { this.renderDiscount(); this.bindEvent_(); }; } SPZ.defineElement('spz-custom-discount-bundle', SpzCustomDiscountBundle);
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
1 / 13
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
32% OFF
ohiofog

✨Buy 5 Get 5 Free✨Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs

$10.95 $15.99
27 sold
Color
Size
Qty

Try It Today, Absolutely Risk-Free, With Your Money Back Guarantee

More than 98.97% of customers recommend this product.

After Sales Service>> If you are not satisfied with the goods received, please contact us within 30 days after receipt, and we will give you the best help! Please don't worry!

More than 98.97% of customers recommend this product.

Take it from consumers who achieved total relief with Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs!

Congrats on their successes! 

I heard about this product from my friend and she told me it helped her heal her irregular periods and vaginal inflammation issues and get rid of cellulite and edema within a few weeks. She assured me that it really works.I immediately ordered 4 PAIRS product on the website.Easy to change and use. After using it for a few weeks, my lower body dryness and odor have been completely resolved, my period is normal at the same time every month, and my pussy looks tight and tender!! and even more amazingly, it has helped me lose about 30 pounds and my hips are more tall and straight, and now I am is a big fan of it. This really is a game-changer!

-Hallie Holland—Oakland, California
⭐⭐⭐⭐⭐

“I had problems with my endocrine system, which caused me to develop obesity and irregular periods. I also often feel tired and have unexplained  pains somewhere.This annoyed me a lot. I have tried many products but none work all of them . A friend recommended it to me. I wear Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs.Stick with it for 5 weeks.The toxins in the body have been completely eliminated.I feel so much lighter now! My endocrine and menstrual periods are back to normal. I wear it every day now, I feel like the toxins are being flushed out of my body. I was amazed at the change in myself“

- Ashley Poole, Bangor, Maine

⭐⭐⭐⭐⭐

Obesity could be the result of the diseases of female reproductive system!

At present, getting fat is the most taboo thing for most women, and gynecological diseases will also lead to getting fat. Therefore, experts remind us to keep in good shape and keep in good health first.  Most types of obesity are associated with genetic and dietary habits. The obesity caused by no obvious pathological factors is called simple obesity, but gynecological diseases have a direct relationship with obesity.

Diseases of the female reproductive system are gynecological diseasesGynecological diseases include vulvar diseases, vaginal diseases, uterine diseases, fallopian tube diseases, ovarian diseases, etc. Gynecological diseases are common diseases in women, which can be treated by imperial foreign methods. Many people lack due awareness of gynecological diseases and lack health care for their bodies. Coupled with various bad living habits of some women, their physical health deteriorates, resulting in some women suffering from diseases that cannot be cured for a long time. These will bring great difficulties and inconvenience to their normal life and work.

Research and experiments have proved that: this product has a very dramatic preventive and therapeutic effects on gynecological diseases.

Toxins(body waste) are destroying your body!

The special body structure of women makes it easier for toxins to accumulate in the uterus and vagina, and some external factors (frequent sex, pregnancy, bacterial infection caused by inadequate cleaning) will make it worse, and it’s mainly characterized by vaginal odor, itching, dryness, Dull color, abnormal leucorrhea, and frequent inflammation. When too much body waste accumulates in the vagina and can not be discharged normally, human body would suffer from swelling and obesity.

Toxins cause abnormal fat storage and low metabolism by affecting hormonal balance, while our bodies retain water and fat to defend against visible threats. Thus, the result could be an abnormally swollen body and some insidious diseases.

What is Graphene?

Graphene has a lower resistance than copper or silver and is the thinnest and toughest nanomaterial known to date. Compared to all other materials, graphene is the best conductor of heat and electricity and can heat up quickly in 1-2 seconds. It has good medical and physical therapy effects.

The infrared wave spectrum of graphene is similar to the infrared spectrum of the human body. It can resonate with the body and generate heat from the inside out, causing the temperature of deep subcutaneous tissues to rise, promoting blood circulation, strengthening blood and cellular tissue metabolism, increasing cellular oxygen supply, and improving body microcirculation.

How do Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs Work?

You know what that is! That relaxing feeling you get every day when you can feel the toxins draining from your body. You've been working on yourself all day, now it's time to release those Body Toxins with Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs! This is how you feel.

Traditional panties mainly play a protective role and can be isolated from the outside world. Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs not only has the role of traditional underwear because the fabric contains graphene fibers, but also has anti-bacterial properties at the same time, Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs has a unique low temperature far infrared, can effectively promote the body's microcirculation, improve the system metabolism, the elimination of toxins, Vaginal Tightening.

Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs do not require preheating or electricity to create heat sensations. It builds up heat in the abdomen and keeps it warm without leaking. Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs are based on heat circulation and use multi-directional heat circulation to help users promote and unblock blood circulation These Graphene Honeycomb Vaginal Firming Shaping Briefs help to effectively stimulate blood and lymphatic circulation in the body, relieve gynecological disorders, reduce fluid accumulation in body tissues, lift buttocks and tighten the vagina. It also helps the body organs to expel harmful wastes, relieves physical fatigue and mental stress, and allows the body to fully relax.

The  Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs promote a healthy reproductive system and uterus aside from detoxifying the body and aiding in weight loss. Based on clinical studies, women who use this product for 20-days have a lower risk of getting vaginitis, pelvic inflammatory disease and effusion, cervical erosion, trichomonas vaginitis, fungal vaginitis, palace cold, and irregular menstruation.

The graphene fiber of the panties releases natural energy through thermal circulation, improving blood circulation throughout the body and eliminating toxins from the uterus. Together with the Tourmaline (a precious natural mineral)  in the middle of the panties, Infrared heat is absorbed by cells, causing a physical phenomenon called "resonance". Thus the cellular activities are instantly invigorated, resulting in better blood circulation and overall improved metabolism.improves various gynecological diseases, reduces body fat, tightens the vagina and lifts the buttocks.

Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs 6 Main Benefits

  1. Prevents Accumulation of Fats
  2. Tightens the vagina & restores the pinkness
  3. Controls Metabolism
  4. Drain the lymphatic system
  5. Buttock Lift
  6. Solve Gynecological diseases once and for all

This is why Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs is special:

  • Graphene fiber - Soft & Breathable,antibacterial
  • Effective in helping Gynecological diseases problems.
  • Proven Natural Mineral Thermal Circulation Therapy
  • Accelerate Metabolism & Improve Digestion
  • Tourmaline Infrared Benefits
  • Multiple benefits--Eliminates fat and toxins,Regular Menstruation,Buttock Lift,Improve Blood Circulation,Eliminated Itch&Vaginal Tightening
  • Overall Health Benefits

Chelsea’s 8-week journey with Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs:

WEEK 1

I am a family entrepreneur. Long-time sitting and irregular bedtime have affected my body. My period only comes once every two or three months. My lower body is deformed and loose, and it smells like fish. My tummy bulged like a water ball, my husband didn't even want to sleep with me, he always had excuses. I think I'm about to lose him.

I think it is time to change. I found this Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs online and after the first use, I can noticeably feel a lot less odor and I do feel a lot more comfortable.

WEEK 4

After 4 weeks of use, I feel a big difference. My period came on time and the smell was completely gone! My vagina looks like a new one. At the same time my tummy has cleared up a lot, and my arms are no longer swollen, you can see the difference in the photos, I will stick with it, and I am happy to see more difference in the next few weeks!

WEEK 8

I can not believe it! Such a big change can be achieved without resorting to surgery, my vagina is now firm and pink, and my edema and cellulite are completely gone! My husband was so amazed at my change that he now haunts me every night. This product is really amazing, you can feel the toxins actually being flushed out of your body after every use, such an effective and easy-to-use product, and I recommend it to everyone like me!

- Chelsea Palmer,Houston, Texas

⭐⭐⭐⭐⭐

“I wear it every day and everyone has been asking me if I had a BBL done.I bought 4 pairs Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs,Now worn for about 3 weeks,I now have to buy new clothes. I definitely recommend this Products especially for the non-believers because I was one of them too. Everywhere I go people admire my butt. It works 100%”
— Klein D--Nevada,Las Vegas
⭐⭐⭐⭐⭐

Packing List:

  • 1 PAIR Graphene Honeycomb Vaginal Tightening & Body Shaping Briefs
  • Color: pinkgreenblackSkin color
  • Material: Nylon,Spandex,Graphene fiber, Tourmaline