MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
2/41
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】
2/41

MyLoveCustom™ Personalized Photo Bracelet/Necklace/Keychain【BUY 2 GET FREE SHIPPING】

$28.99
$0.00
Save $-28.99
Type
Please select a type
ColorSilver
Please select a color
Style
Please select a style
Quantity
Weight: 0kg

Limited quantity!!! We sell out often. Once it reaches 50 pieces. We will restore the original price. Enjoy the discount now!

Surprise her with a unique and meaningful gift. A gift that will always remind her how special she is to you.

Our  Necklace / Bracelet / Keychain will keep a special memory always close to the heart of Your loved one. 

 Makes the Perfect Gift

Our  Necklace / Bracelet / Keychain makes the perfect gift for any occasion to make your loved one always remember a special situation or just carry you close by their hearts

  • Custom Circle Pendant – A custom  Necklace / Bracelet / Keychain for anything you love in life. Each necklace is made to order and has been designed and handcrafted by skilled artisans. 
  • Wonderful Gift Choice – Our  Necklace / Bracelet / Keychain makes for a great birthday, anniversary, holiday, or “just because gift for a special woman or man in your life.  Buy 2 is a perfect choice because you can keep one and gift another one for someone you love.  

  • Each Necklace / Bracelet / Keychain has a custom picture inside. Look inside or use your phone's camera to reveal the picture


A Picture Inside - Carry a special moment close to Your Heart

Each  Necklace / Bracelet / Keychain has a custom picture inside.3 ways of viewing it:

  1. Just simply hold it close to your eyes and look through the circle
  2. Hold it close to the lens of your camera to see it on the screen of your phone
  3. Shine the flashlight of your phone through the back of the circle and project it onto a wall in the dark.

Great Photo Ideas to put inside the Pendant

  • Upload Your Favorite Picture Now - and make an unforgettable Gift 

 Necklace / Bracelet / Keychain Details

  • Material: Titanium Steel / Sterling Silver
  • Sizes:
  • Pendants: 18mm x 13mm
  • Necklace Chain: 40cm/16-inch adjustable by 2 inches
  • Bracelet / Ring: Stretchable (The size of the ring is adjustable, so any size can be worn)
 
 
 
 
const isSpecialHeroTheme = window.SHOPLAZZA?.theme?.merchant_theme_name == 'Hero' && window.SHOPLAZZA?.theme?.merchant_theme_c_version == '2.2.19'; const specialHeroThemeClassName = 'hero_2_2_19_smart_recommend_block'; 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.C_SETTINGS.meta.page.template_type; if (template_type === 1) { this.show_type_ = 3; this.product_resource_id_ = window.C_SETTINGS.meta.page.resource_id; } else if (template_type === 2) { this.show_type_ = 4; this.collection_resource_id_ = window.C_SETTINGS.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.C_SETTINGS.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() { const that = this; const themeName = window.C_SETTINGS.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'); this.initBlockClass(blockEl); this.initItemClass(blockEl); 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; if (rule.products && rule.products.length) { const modalRender = document.getElementById('smart_recommend_js_root'); const $dest = document.getElementById('cart'); const isLifeStyle = /Life.*Style/.test(window.C_SETTINGS.theme.merchant_theme_name); if (modalRender && isLifeStyle && $dest.clientWidth > 767) { modalRender.classList.add('zb-mt-[-180px]') } } 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; } }); if (isSpecialHeroTheme) { ruleEl.querySelectorAll(`.smart_recommend_title`).forEach(dom=>{ dom.classList.add('type-title-font-family'); }); document.querySelectorAll(`.${specialHeroThemeClassName} #smart_recommend_rule_ul_${rule.id} .zb-recommend-price-line-through .money`).forEach(dom=>{ dom.classList.add('type-body-font-family'); }); }; }); }); }); }); }) }) } else { if (window.top !== window.self) { const template_type = window.C_SETTINGS.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); }); } } }); } initBlockClass(blockEl) { if (!blockEl) return; if (blockEl.parentElement && blockEl.parentElement.offsetWidth === document.body.clientWidth) { blockEl.classList.add('smart_recommend_block_fullscreen'); }; if (isSpecialHeroTheme) { blockEl.classList.add(specialHeroThemeClassName); }; } initItemClass(blockEl) { if (blockEl) { const containerWidth = blockEl.offsetWidth; let itemWidth = ''; if (containerWidth > 780) { itemWidth = '16%'; } else if (containerWidth > 600) { itemWidth = '20%'; } else { itemWidth = '24%'; } const itemStyleEl = document.createElement('style'); itemStyleEl.innerHTML = `.zb-recommend-li-item{ width: ${itemWidth}; }`; document.body.appendChild(itemStyleEl); } } 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 (modalRender) { document.body.appendChild(modalRender); } 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 }); }); }); 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.C_SETTINGS.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.C_SETTINGS.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.C_SETTINGS.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.C_SETTINGS.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.C_SETTINGS.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.C_SETTINGS.theme.support_app_block }); window.sa.track("module_impressions", { aid: `smart_recommend.${this.show_type_}.${rule.id}`, support_app_block: window.C_SETTINGS.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);