🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
1/22
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒
1/22

🎁Mini Keychain LED Flashlight - Fast Charging Bi-Directional Output Work Light with Emergency SOS⏰Promotion 49% OFF Limited Time🛒

🔦 Light Up Your Life Anywhere 🔦

$36.99
$0.00
Save $-36.99
Color🔥 Silver Black
Please select a color
Buy More Save More
Please select a buy more save more
Quantity
/** @private {string} */ class SpzCustomAnchorScroll extends SPZ.BaseElement { static deferredMount() { return false; } constructor(element) { super(element); /** @private {Element} */ this.scrollableContainer_ = null; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { this.viewport_ = this.getViewport(); this.initActions_(); } setTarget(containerId, targetId) { this.containerId = '#' + containerId; this.targetId = '#' + targetId; } scrollToTarget() { const container = document.querySelector(this.containerId); const target = container.querySelector(this.targetId); const {scrollTop} = container; const eleOffsetTop = this.getOffsetTop_(target, container); this.viewport_ .interpolateScrollIntoView_( container, scrollTop, scrollTop + eleOffsetTop ); } initActions_() { this.registerAction( 'scrollToTarget', (invocation) => this.scrollToTarget(invocation?.caller) ); this.registerAction( 'setTarget', (invocation) => this.setTarget(invocation?.args?.containerId, invocation?.args?.targetId) ); } /** * @param {Element} element * @param {Element} container * @return {number} * @private */ getOffsetTop_(element, container) { if (!element./*OK*/ getClientRects().length) { return 0; } const rect = element./*OK*/ getBoundingClientRect(); if (rect.width || rect.height) { return rect.top - container./*OK*/ getBoundingClientRect().top; } return rect.top; } } SPZ.defineElement('spz-custom-anchor-scroll', SpzCustomAnchorScroll); const STRENGTHEN_TRUST_URL = "/api/strengthen_trust/settings"; class SpzCustomStrengthenTrust extends SPZ.BaseElement { constructor(element) { super(element); this.renderElement_ = null; } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { this.xhr_ = SPZServices.xhrFor(this.win); const renderId = this.element.getAttribute('render-id'); SPZCore.Dom.waitForChild( document.body, () => !!document.getElementById(renderId), () => { this.renderElement_ = SPZCore.Dom.scopedQuerySelector( document.body, `#${renderId}` ); if (this.renderElement_) { this.render_(); } this.registerAction('track', (invocation) => { this.track_(invocation.args); }); } ); } render_() { this.fetchData_().then((data) => { if (!data) { return; } SPZ.whenApiDefined(this.renderElement_).then((apis) => { apis?.render(data); document.querySelector('#strengthen-trust-render-1539149753700').addEventListener('click',(event)=>{ if(event.target.nodeName == 'A'){ this.track_({type: 'trust_content_click'}); } }) }); }); } track_(data = {}) { const track = window.sa && window.sa.track; if (!track) { return; } track('trust_enhancement_event', data); } parseJSON_(string) { let result = {}; try { result = JSON.parse(string); } catch (e) {} return result; } fetchData_() { return this.xhr_ .fetchJson(STRENGTHEN_TRUST_URL) .then((responseData) => { if (!responseData || !responseData.data) { return null; } const data = responseData.data; const moduleSettings = (data.module_settings || []).reduce((result, moduleSetting) => { return result.concat(Object.assign(moduleSetting, { logos: (moduleSetting.logos || []).map((item) => { return moduleSetting.logos_type == 'custom' ? this.parseJSON_(item) : item; }) })); }, []); return Object.assign(data, { module_settings: moduleSettings, isEditor: window.self !== window.top, }); }); } } SPZ.defineElement('spz-custom-strengthen-trust', SpzCustomStrengthenTrust);


💝99.2% of Reviewers Recommends This Product.
🌎 Over $59.99 for free delivery worldwide
🛒 Tracking number for every order
💯 Payments Via PayPal® and Credit Card
⭐ Returns>>100% Money Back Guarantee

Our goods are authentic, with genuine patents, counterfeit must be investigated! Customers please identify our products

It will sell out fast, Enjoy a discount now!!⚡Please make sure to buy enough quantity before we increase the price!!!🔥


🔦 Ultimate Keychain Work Light – Power, Illumination, and Safety in One! 🔦

🌟 Get ready for the ultimate all-in-one tool for safety and convenience! This multifunctional keychain light is more than just a flashlight—it's your portable power source, emergency signal, and personal safety companion. Whether you're hiking, cycling, or in an emergency, this compact light has you covered. 🌟


1. 🔦 High-Powered Illumination

  • The mini flashlight uses high-quality LED lamp beads with a maximum output of 2000 lumens and a range of 100 meters. It's suitable for camping accessories, survival equipment and other outdoor activities.


2. 🚨 Multi-Mode Lighting

  • Adjust the light source mode by long-press or click the number of times of different. Soft COB sidelights for large flood lighting. The red and blue flashing lights can be used to call for help in an emergency.


3.  💪 Built for Toughness

  • Made of high-quality zinc alloy material, chrome-plated surface for anti-rust and anti-oxidation, waterproof, dustproof, impact-resistant, bearing about 165 lbs, it's suitable for adverse outdoor weather conditions.


4. 🔋 Bi-Directional Output

  • Equipped with TYPE-C fast charging interface and built-in 1500 mAh battery, it's battery life is up to about 15 hours. It can also be used as a mobile power supply when the mobile phone is powered off in an emergency.

5. 🎒 Small Size & Portable

  • It adopts ultra-mini design and comes with a carabiner, which can be attached to bags or placed in your pocket, making it an ultra-compact lighting that you can carry with you and meet your daily target easily. 

🔧 Built for Every Situation:

Whether you're camping, cycling, car maintenance, or need a reliable emergency tool, this keychain flashlight is ready. Small enough to fit in your pocket, but powerful enough to light up your way when it matters most. 🚴‍♂️🔧

📏 Specifications
Maximum Luminous Flux): 2000 LM
Maximum Range: ≤ 100m
Material: Zinc Alloy
Weight: 70g
Dimensions: 88×36×26mm
Gear: 8 Light Modes
Charging Mode: USB Charging

🌟 Why Choose This Keychain Light?

  • 🛡️ Durable & Waterproof: No fear of rain or drops. 
  • 🔋 Rechargeable: Say goodbye to disposable batteries. 
  • ⚡ Multi-Functional: Flashlight, power bank, and emergency signal all in one! 
  • 🔑 Easy to Carry: With a carabiner, it’s always by your side. 

📦 Get Yours Today!

Don’t miss out on this compact, powerful, and reliable tool that fits right in your pocket. Perfect for outdoor enthusiasts, adventurers, and anyone who values safety and convenience.

🌟 Order Now and be ready for anything! 🚨

🎁PACKAGE

  • 1* Mini Keychain LED Flashlight

⚡Click On "ADD TO CART" To Get Yours Now!

✨OUR GUARANTEE✨


✅We truly believe we make some of the most innovative products in the world, and we want to make sure we back that up with a risk-free ironclad 45-day guarantee.

✅If you don't have a positive experience for ANY reason, we will do WHATEVER it takes to make sure you are 100% satisfied with your purchase.

✅Buying items online can be a daunting task, so we want you to realize that there is an absolute ZERO risk in buying something and trying it out. If you don't like it, no hard feelings we'll make it right.

✅We have 24/7/365 Ticket and Email Support.

WHY US?👇

  • We work directly with manufacturers all over the world to ensure the best quality of our products. We have a Quality Control department which helps us to keep our promise!
  • Price is always competitive.
  • Awesome Customer Service
  • Amazing products along with High Quality
  • Read reviews from our lovely customers

🔥 The price is limited! 🔥 Grab yours as the limited promotion available!

✈ Worldwide Shipping ✈  

Please note that shipping is insured. However, you may receive your items earlier. Tracking Numbers will ALWAYS be sent so you can track it every step of the way! Cool things are worth waiting for! 😉

🔒 100% Risk-Free Purchase 🔥 

  • We truly offer stunning, trendy high-quality products in the world.
  • We will do WHATEVER it takes with outstanding customer service support to assist everyone.
  • If you are not satisfied with receiving the goods, you can apply for a refund.
  • You can pay with PayPal, which will protect your money.

✅Payments Via PayPal®, Credit and Debit cards.

If you want to checkout with a Credit and Debit Card, just enter your * Card No, * Expiration Date, and * CVV.
f34603c6042c7802af86fc595826003b48c8f721fa4f1ffa117ffea06bd06849.png
153a0932404b13aa72f600fa0f9237172d5147ac6302b2183812028339748e9c.png
class SpzSmartBlockComponent extends SPZ.BaseElement { constructor(element) { super(element); this.templates_ = null; this.container_ = null; this.i18n_ = {}; this.config_ = {}; this.show_type_ = 3; this.product_resource_id_ = ''; this.collection_resource_id_ = ''; this.cart_items_ = []; this.customer_id_ = ''; this.order_id_ = ''; } static deferredMount() { return false; } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { const template_type = window.SHOPLAZZA.meta.page.template_type; if (template_type === 1) { this.show_type_ = 3; this.product_resource_id_ = window.SHOPLAZZA.meta.page.resource_id; } else if (template_type === 2) { this.show_type_ = 4; this.collection_resource_id_ = window.SHOPLAZZA.meta.page.resource_id; } else if (template_type === 15){ this.show_type_ = 5; } else if (template_type === 13){ this.show_type_ = 6; } else if (template_type === 20){ this.show_type_ = 7; this.customer_id_ = window.SHOPLAZZA.customer.customer_id; } else if (template_type === 35){ this.show_type_ = 8; this.order_id_ = window.location.pathname.split('/').pop(); } this.templates_ = SPZServices.templatesForDoc(this.element); this.setAction_(); } mountCallback() { console.log('appzebu smart mounted'); const that = this; const themeName = window.SHOPLAZZA.theme.merchant_theme_name; const isGeek = /Geek/.test(themeName); this.fetchRules().then((res) => { if (res && res.rules && res.rules.length) { const blockEl = document.getElementById('smart_recommend_block'); SPZ.whenApiDefined(blockEl).then((api) => { api.render({data: res}, true).then(() => { if (isGeek && that.show_type_ === 6) { blockEl.querySelector('.plugin_container_wrpper').style.padding = '30px 0'; } const recommendStyle = document.createElement('style'); recommendStyle.innerHTML = ` .plugin__recommend_container,.app-recommend-card { display: none !important; } `; document.head.appendChild(recommendStyle); const fetchList = []; res.rules.forEach((rule) => { fetchList.push(this.fetchRuleProductList(rule.id)); }); const fetchAll = Promise.all(fetchList); fetchAll.then((p_res) => { res.rules.forEach((rule, index) => { rule.products = p_res[index] && p_res[index].products; const ruleEl = document.getElementById('smart_recommend_rule_' + rule.id); SPZ.whenApiDefined(ruleEl).then((api) => { api.render({data: rule}, true).then(() => { that.impressListen(`#smart_recommend_rule_ul_${rule.id}`, function(){ that.trackRuleImpress(rule); }); const btnElList = document.querySelectorAll(`#smart_recommend_rule_ul_${rule.id} button`); btnElList.forEach((btnEl) => { if (btnEl && rule.config && rule.config.quick_shop_button_bg_color && rule.config.quick_shop_button_text_color) { btnEl.style.backgroundColor = rule.config.quick_shop_button_bg_color; btnEl.style.color = rule.config.quick_shop_button_text_color; } }) }); }); }); }); }) }) } else { if (window.top !== window.self) { const template_type = window.SHOPLAZZA.meta.page.template_type; const holderEl = document.getElementById('smart_recommend_preview_no_data_placeholder'); SPZ.whenApiDefined(holderEl).then((api) => { api.render({data: { isCart: template_type === 13, isCollection: template_type === 2, isProduct: template_type === 1, isIndex: template_type === 15 }}, true); }); } } }); } setAction_() { this.registerAction('quickShop', (data) => { const that = this; const product_id = data.args.product_id; const productIndex = data.args.productIndex; const rule_id = data.args.rule_id; const ssp = data.args.ssp; const scm = data.args.scm; const cfb = data.args.cfb; const ifb = data.args.ifb; const modalRender = document.getElementById('smart_recommend_product_modal_render'); if (product_id) { this.fetchProductData(product_id).then((res) => { const product = res.products && res.products.length && res.products[0] || {}; product.cfb = cfb; product.ifb = ifb; SPZ.whenApiDefined(modalRender).then((api) => { api.render({product: product, productIndex: productIndex, rule_id: rule_id, ssp: ssp, scm: scm, show_type: that.show_type_}, true).then(() => { const modalEl = document.getElementById('smart_recommend_product_modal'); SPZ.whenApiDefined(modalEl).then((modal) => { that.impressListen('#smart_recommend_product_modal', function(){ that.trackQuickShop({ rule_id: rule_id, product_id: product_id }); }); modal.open(); }); const formEl = document.getElementById('smart_recommend_product_form'); SPZ.whenApiDefined(formEl).then((form) => { form.setProduct(product); }); const variantEl = document.getElementById('smart_recommend_product_variants'); SPZ.whenApiDefined(variantEl).then((variant) => { variant.handleRender(product); }); }); }) }); } }); this.registerAction('handleScroll', (data) => { this.directTo(data.args.rule_id, data.args.direction); }); this.registerAction('handleProductChange', (data) => { const variant = data.args.data.variant; const product = data.args.data.product; const imageRenderEl = document.getElementById('smart_recommend_product_image'); SPZ.whenApiDefined(imageRenderEl).then((api) => { api.render({ variant: variant, product: product }, true); }); }); this.registerAction('handleAtcSuccess', (detail) => { const data = detail.args; data.data.product = data.data.product || {}; data.data.variant = data.data.variant || {}; const product_id = data.data.product.id; const product_title = data.data.product.title; const variant_id = data.data.variant.id; const price = data.data.variant.price; const rule_id = data.rule_id; const aid = `smart_recommend.${this.show_type_}.${rule_id}`; const ifb = data.data.product.ifb; const cfb = data.data.product.cfb; const ssp = data.ssp; const scm = data.scm; const spm = `smart_recommend_${this.show_type_}.${data.spmIndex}`; const params = { id: product_id, product_id: product_id, number: 1, name: product_title, variant_id: variant_id, childrenId: variant_id, item_price: price, source: 'add_to_cart', _extra: { aid: aid, ifb: ifb, cfb: cfb, scm: scm, spm: `..${window.SHOPLAZZA.meta.page.template_name}.${spm}`, ssp: ssp, } }; this.tranckAddToCart(params); }); this.registerAction('addATCHook', (data) => { const params = data.args; const spm = `smart_recommend_${this.show_type_}.${params.spmIndex}`; this.myInterceptor_ = window.djInterceptors && window.djInterceptors.track.use({ event: 'dj.addToCart', params: { aid: `smart_recommend.${this.show_type_}.` + params.rule_id, ssp: params.ssp, scm: params.scm, cfb: params.cfb, spm: `..${window.SHOPLAZZA.meta.page.template_name}.${spm}`, }, once: true }); }); } tranckAddToCart(detail) { if (window.$) { window.$(document.body).trigger('dj.addToCart', detail); } } fetchRules() { const payload = { show_type: this.show_type_, }; let that = this; if (this.show_type_ === 6) { let line_items = []; return this.fetchCart().then((res) => { if (res && res.cart && res.cart.line_items) { line_items = res.cart.line_items.map((item) => { return { product_id: item.product_id, variant_id: item.variant_id, quantity: item.quantity, price: item.price } }); } payload.line_items = line_items; that.cart_items_ = line_items; return that.fetchRulesRequest(payload); }); } else { if (this.show_type_ === 3) { payload.line_items = [{ product_id: this.product_resource_id_ }]; } else if (this.show_type_ === 4) { payload.collection_id = this.collection_resource_id_; } else if (this.show_type_ === 7) { payload.customer_id = this.customer_id_; } else if (this.show_type_ === 8) { payload.order_id = this.order_id_; } return this.fetchRulesRequest(payload); } } fetchRulesRequest(payload) { return fetch(window.SHOPLAZZA.routes.root + "/api/possum/recommend_query", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }).then(function(res){ if(res.ok){ return res.json(); } }); } fetchCart() { return fetch(`/api/cart/cart-select?r=${Math.random().toString(36).slice(-4)}`) .then((res) => { if (res.ok) { return res.json(); } }); } fetchRuleProductList(rule_id) { const payload = { page: 1, limit: 100, fields: ["title", "url", "image", "min_price_variant.price", "min_price_variant.compare_at_price"], rule_id: rule_id, }; if (this.show_type_ === 3) { payload.line_items = [{ product_id: this.product_resource_id_ }]; } else if (this.show_type_ === 4) { payload.collection_id = this.collection_resource_id_; } else if (this.show_type_ === 6) { payload.line_items = this.cart_items_; } else if (this.show_type_ === 7) { payload.customer_id = this.customer_id_; } else if (this.show_type_ === 8) { payload.order_id = this.order_id_; } return fetch(window.SHOPLAZZA.routes.root + "/api/possum/recommend_products", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }).then(function(res){ if(res.ok){ return res.json(); } }).catch(function(err){ console.log(err); }); } fetchProductData(product_id) { return fetch(window.SHOPLAZZA.routes.root + "/api/possum/products", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ product_ids: [product_id], fields: [ "images", "options", "min_price_variant", "variants"] }) }).then(function(res){ if(res.ok){ return res.json(); } }).catch(function(err){ console.log(err); const loadingEl = document.getElementById('smart_recommend_loading'); if (loadingEl) { loadingEl.style.display = 'none'; } }); } getStyle(ele, style) { if (!ele) return; if (window.getComputedStyle) { return window.getComputedStyle(ele)[style]; } return ele.currentStyle[style]; } directTo(id, direction) { const scrollElement = document.getElementById(`smart_recommend_rule_ul_${id}`); const blockWidth = parseInt(this.getStyle(scrollElement, 'width')); const scrollLength = (blockWidth * 0.19 - 12) * 5; const scrollPoint = scrollElement.scrollWidth - scrollElement.clientWidth; if (!scrollElement) return; if (direction === 'left') { if (document.dir === 'rtl') { scrollElement.scrollTo({ left: Math.abs(scrollElement.scrollLeft) >= scrollPoint - 100 ? 0 : scrollElement.scrollLeft - scrollLength, behavior: 'smooth' }); return; } scrollElement.scrollTo({ left: Math.max(scrollElement.scrollLeft - scrollLength, 0), behavior: 'smooth' }); } else { if (document.dir === 'rtl') { scrollElement.scrollTo({ left: Math.abs(scrollElement.scrollLeft) >= scrollPoint + 100 ? 0 : scrollElement.scrollLeft + scrollLength, behavior: 'smooth' }); return; } scrollElement.scrollTo({ left: scrollElement.scrollLeft >= scrollPoint - 100 ? 0 : scrollElement.scrollLeft + scrollLength, behavior: 'smooth' }); } } trackRuleImpress(rule) { if (window.sa && window.sa.track) { window.sa.track("plugin_common", { plugin_name: "upsell", event_type: "impressions", rule_id: rule.id, ssp: rule.ssp, scm: rule.scm, show_type: this.show_type_, support_app_block: window.SHOPLAZZA.theme.support_app_block }); window.sa.track("module_impressions", { aid: `smart_recommend.${this.show_type_}.${rule.id}`, support_app_block: window.SHOPLAZZA.theme.support_app_block }); } } trackQuickShop(data) { window.sa && sa.track && sa.track("plugin_common", { plugin_name: "upsell", event_type: "quick_shop", rule_id: data.rule_id, product_id: data.product_id, show_type: this.show_type_, }); } impressListen(selector, cb) { const el = document.querySelector(selector); const onImpress = (e) => { if (e) { e.stopPropagation(); } cb(); }; if (el && !el.getAttribute('imprsd')) { el.addEventListener('impress', onImpress) } else if (el) { onImpress(); } } } SPZ.defineElement('spz-custom-smart-block', SpzSmartBlockComponent);