2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure
1 / 22

2025 Rose Thrusting Dildo with Clitoral Sucking and 10 Vibrating Modes for Deep Pleasure

Color -
Please select a color
Price
$69.99-$109.99
1552 sold

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

Have G-Gasms, Clit-Gasms, & Pleasure Galore!

Experience the magic of blended O's with this fabulously sexy dual stimulator. The Suck & Thrust Rose Rechargeable Vibrator targets your clit with a rose with 10 sucking modes that feel just like oral. Or please your G-Spot or booty with a slim 10 vibration thruster! A flexible silicone cord connects the two, making it easy to have full-body O’s or share the fun with a playmate.

Key Features:

  • Rose Toy with sucking, thrusting &vibrating
  • Stimulates your clitoral in 10 different modes, from gentle to wild
  • 10 different thrusting modes, with 6 inches insertable length and 5 inches girth
  • Made with Body-Friendly Silicone, Waterproof & Rechargeable
  • Interesting Intimate Gift Option - Share this surprising gift with your lovers, wife or friends
  • Use this couple's sex toys on your neck, back, ears, nipples, anal and all the other hotspots

Description:


  • 2025 Upgraded Rose Toy with sucking, thrusting &vibrating - Looking for something new, more interesting and more pleasure? Meet the upgraded rose vibrator with sucking and thrusting vibrator. The suction vibrator stimulates your clitoral for external fun. Thrusting dildo works on your g spot with thrusting and vibrations for dual internal stimulation. This rose sex toy is for beginners and experts because the functions are controlled by different buttons, you can choose one function or both freely!
  • Sucking Vibrator Stimulates 10000+ Cells on whole clitoral for unlimited pleasure - The soft rose sex toy stimulates your clitoral in 10 different modes, from gentle to wild! Normal wand vibrators or dildos, only stimulate your hotspot surface. This women's sex toy wraps around and stimulate the hotspot with air pressure, into deep tissue around the whole clitoral that includes 10000+ cells for deeper quicker pleasure!
  • Thrusting Function for G Spots and Satisfy All Internal HotSpots - With 5 inches insertable length and 5 inches girth, the thrusting dildo makes sure nerves around your g spot and vaginal muscles enjoy a good massage. The motors inside deliver power to satisfy your g spot, a spot and o spot! There are 10 different thrusting modes. Feel free to find out the best one for your body!
  • Made with Body-Friendly Silicone, Waterproof & Rechargeable - The adult toys for women are made of body-friendly silicone with a velvety touch, feel like soft silk on your skin. You can use this couple's sex toys on your neck, back, ears, nipples, anal and all the other hotspots! The adult toy is waterproof which makes it easy to clean and you can use under shower or a bath! No more fumbling in the dark for batteries, this female sex toys is rechargeable!
  • Interesting Intimate Gift Option - Share this surprising gift with your lovers, wife or friends. Taking any occasion: holidays, birthdays and bachelorette parties to spoil everyone you know. For self-care, whether you’re building out your collection of the favourite vibrators or looking for an extra-special sex toy for couples, you should have this rose sex toy.

RELATED: >>> Usage Guide for Upgraded Rose Vibrator With G-spot Vibrator

>>> Learn about Rose Toy for Women and Some Tips of Rose Sex Toy Maintenance

Specifications:

Brand Rosetoy-official
Colors Red, purple, black
Insertable Length 5 inches
Length 5 inches, 8 inches
Material Silicone
Power Source Rechargeable
Width 1.5 inches, 2 inches

Free Standard Shipping orders $59+, couriers available: USPS, DHL, FEDEX

Delivery Time=Processing Time+Shipping Time
The time frame for order delivery is divided into two parts:

Processing time: Order verification, quality check, and packaging. All orders are sent to the fulfillment center for dispatch in 1-5 business days after the order is placed.

Shipping time: This refers to the time it takes for items to be shipped from our fulfillment center to the destination.

The following delivery time does not include processing time:

*Please note that Shipping time is estimated and commences from the date of shipping, rather than the date of order.

Country/region Shipping Time Cost
United States(except Puerto Rico, Virgin Islands, Guam, Alaska, Hawaii, and the Northern Mariana Islands ), United Kingdom, Germany, France, Australia, Canada, Singapore, Japan, New Zealand, Ireland 9-12 Days Standard Shipping:

US $9.99(Orders 0.00 - 29.99USD)

Standard Shipping:

US $6.99(Orders 30.00 - 58.99USD)

Free Shipping:

US $0(Orders over 59.00USD)
5-8 Days Expedited Shipping:
US $9.99(Orders over 30.00USD)
Kenya, nigeria, South Africa, armenia, Azerbaijan, Bahrain, Bengal, Bhutan, Brunei, Cambodia, India, Indonesia, Israel, South Korea, Laos, Malaysia, the Philippines, Qatar, Thailand, Türkiye, Uzbekistan, Vietnam, Albania, andorra, Austria, Belarus, Belgium, Bulgaria, croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, Hungary, Iceland, Italy, latvia, Liechtenstein, Lithuania, Luxembourg, Malta, moldova, monaco, Montenegro, Netherlands, Norway, Poland, Portugal, Romania, san marino, Serbia, Slovakia, slovenia, Spain, Sweden, Switzerland, Anguilla, Bahamas, barbados, Belize, costa rica, cuba, Curacao, dominica, El Salvador, grenada, Guadeloupe, Mexico, Montserrat, nicaragua, Panama, saint lucia, Niue, Norfolk, Argentina, Bolivia, Brazil, Chile, Colombia, ecuador, Guyana, Paraguay, Peru, Suriname, Uruguay 5-25 Work Days Standard Shipping:
US $8.99(Orders 0.00 - 29.99USD)
US $7.99(Orders 30.00 - 58.99USD)
Free Shipping:
US $0(Orders over 59.00USD)

Please note that your tracking information might not be visible on your account once your order leaves our warehouse since we need to receive this information from the courier and upload it to our system. However, if you cannot see your tracking number within 48 hours of placing your order, please contact us an email at service@the-rose-toy-official.com

Note: We currently don't support shipping anywhere except the countries mentioned above.


ABOUT TAX

Shipments from all of our warehouses are delivery duty unpaid. Therefore, any and all customs or import duties are charged once the package reaches its destination country. If any, these charges must be paid by the customers. Customers take full liability for all return shipment costs, customs charges and handling fees should they refuse to accept a package due to import duties or taxes.

We charge taxes and fees for the following EU countries:


Taxes and fees charged shall be interpreted by the EU organizations

Sales Tax Rates in the United States:

Region Sales Tax Rate
Oklahoma 4.50%
Arkansas 6.50%
California 7.25%
Montana 0.00%
Colorado 2.90%
Puerto Rico 5.00%
Nebraska 5.50%
New York 4.00%
New Hampshire 0.00%
Washington, D.C. 6.50%
Indiana 7.00%
Idaho 6.00%
Kansas 6.50%
Mississippi 7.00%
Alabama 4.00%
Ohio 5.75%
North Dakota 5.00%
Florida 6.00%
Maine 5.50%
American Samoa 5.00%
Rhode Island 7.00%
Iowa 5.00%
Louisiana 4.45%
Kentucky 6.00%
South Dakota 4.50%
New Jersey 6.63%
U.S. Armed Forces – Americas 5.00%
U.S. Armed Forces – Europe 5.00%
Hawaii 4.00%
Arizona 5.60%
New Mexico 5.13%
Oregon 0.00%
Michigan 6.00%
Georgia 4.00%
Guam 5.00%
U.S. Armed Forces – Pacific 5.00%
North Carolina 4.75%
South Carolina 6.00%
Massachusetts 6.25%
Illinois 6.25%
Missouri 4.23%
Minnesota 6.88%
Delaware 0.00%
Nevada 6.85%
Northern Mariana Islands 5.00%
Pennsylvania 6.00%
Maryland 6.00%
Tennessee 7.00%
Alaska 0.00%
Connecticut 6.35%
Texas 6.25%
U.S. Minor Outlying Islands 5.00%
Utah 6.10%
Vermont 6.00%
U.S. Virgin Islands 5.00%
Virginia 5.30%
Washington 6.50%
West Virginia 6.00%
Wisconsin 5.00%
Wyoming 4.00%

Tips

Affected by shipping peak, there will be some delays in the delivery. The product is still on the way. Any questions, please click to contact us, and we will reply within 24 hours.
Thank you for your patience and understanding.

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);
  • 100% Secure

  • Always Discreet

  • Free Shipping at $59

  • Customer Support