🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
4/22
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!
4/22

🎁Promotion 49% OFF Limited Time⛄🔔 Drone with 8K camera for adults, v196 rc quadcopter with auto return, follow me, brushless motor, circular flight, waypoint, altitude hold, headless mode, 28 minutes long flight time!!

$99.99
$188.99
Save $89.00
Battery Expansion - (Increasing 21 minutes of flight range)
Please select a battery expansion - (increasing 21 minutes of flight range)
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);

V196 Pro is our flagship aerial drone, designed for professional filmmaking and high-end photography. It integrates the industry's most advanced technology and unparalleled flight performance to create a new image creation experience.

MAIN FEATURES 

                                                                                                 Excellent Image Quality
Equipped with a new 4K camera, it presents unprecedented image quality and color details, suitable for high-end film and television production, advertising shooting and commercial creative needs. Whether it is the bright sunshine during the day or the bright lights at night, V196 Pro can perfectly capture every detail and present a real and natural picture.

Powerful Flight Performance
Equipped with a new flight system, it has a longer flight time (up to 28 minutes) and stronger flight stability, which can maintain stable shooting even in complex environments. Its omnidirectional obstacle avoidance system can monitor surrounding obstacles in real time to ensure flight safety and avoid collisions.

Innovative design, ultimate portability
The design of V196 Pro combines aesthetics and practicality. It adopts a streamlined body, which not only enhances flight stability but also is easy to carry. Its innovative folding wing design makes this professional drone more compact when stored, convenient for transportation and storage.

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);