5️% Rabattcode: DEPBE5 | Kaufen 4 Erhalten 1 Gratis | Kostenloser Versand €69+
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
2 / 55
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger
Verwandte Produkte Mag diese nicht?
0% OFF
DE.Peggybuy

Alphabet Blumen doppelseitig - 5d DIY Handwerk Schlüsselanhänger

987867.01

€4.99
220 Volumen der Verkäufe
Stil - A
Anzahl 999Bestand

Spezifikation:
Herkunft: Festlandchina
Stil: Moderner Stil
Material: Harz
Größe: 6x7cm/2.36x2.76in
Diamantform: Speziell geformt

DIY Diamant Malerei Schritte:
Öffnen Sie die Verpackung und überprüfen Sie die Diamant-Malwerkzeuge.
Überprüfen Sie die Farben der Harzdiamanten und ordnen Sie sie gemäß den Codes an.
Ziehen Sie die Schutzfolie ab, um Symbole freizulegen, die den Farbcodes entsprechen.
Heben Sie mit dem entsprechenden Werkzeug die Harzdiamanten auf und platzieren Sie sie entsprechend dem Farbcode auf dem Symbol.
Es wird empfohlen, jeweils einen Satz Harzdiamanten fertigzustellen, um das Gemälde schneller fertigzustellen.
Um ein perfektes Diamantgemälde zu erstellen, sollten Sie das Muster auf einer ebenen Fläche platzieren und keine Diamanten auf jeder Symbolreihe hinterlassen.
Um eine gute Form auf das Papier zu schneiden, montieren Sie das Klassifizierungsarray auf der Oberfläche des Materials.
Achten Sie beim Zusammensetzen darauf, dass keine Lücken oder Risse vorhanden sind und alles flach liegt.
Nachdem Sie die Diamantmalerei fertiggestellt haben, füllen Sie die verbleibenden Lücken mit Kleber aus, damit sie zu den Diamantsymbolen passen.

Anmerkung:
Aufgrund des unterschiedlichen Monitor- und Lichteffekts kann die tatsächliche Farbe des Artikels geringfügig von der auf den Bildern gezeigten Farbe abweichen. Vielen Dank!
Bitte rechnen Sie mit einer Messabweichung von 1-2 cm aufgrund der manuellen Messung.



Lieferumfang: 1 x Diamant Malerei Schlüsselanhänger
1 x Diamant-Malwerkzeug (Bohrstift und Beschleunigungsplatte)

Lieferumfang: 1 x Diamant Malerei Schlüsselanhänger
1 x Diamant-Malwerkzeug (Bohrstift und Beschleunigungsplatte)

Verwandte Produkte Mag diese nicht?
Kundenrezensionen

Das sagen unsere Kunden.

Kommentare veröffentlichen
Bewertungen der Kunden
Wow, du bist ganz unten angekommen
Neueste
Am meisten gemocht
Höchste Bewertungen
Niedrigste Bewertungen
×
class SpzCustomFileUpload extends SPZ.BaseElement { constructor(element) { super(element); this.uploadCount_ = 0; this.fileList_ = []; } buildCallback() { this.action = SPZServices.actionServiceForDoc(this.element); this.registerAction('upload', (data) => { this.handleFileUpload_(data.event?.detail?.data || []); }); this.registerAction('delete', (data) => { this.handleFileDelete_(data?.args?.data); }); this.registerAction('preview', (data) => { this.handleFilePreview_(data?.args?.data); }); this.registerAction('limit', (data) => { this.handleFileLimit_(); }); this.registerAction('sizeLimit', (data) => { this.handleFileSizeLimit_(); }); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } setData_(count, file) { this.uploadCount_ = count; this.fileList_ = file; } handleFileUpload_(data) { data.forEach(i => { if(this.fileList_.some(j => j.url === i.url)) return; this.fileList_.push(i); }) this.uploadCount_++; sessionStorage.setItem('fileList', JSON.stringify(this.fileList_)); this.triggerEvent_("handleFileUpload", { count: this.uploadCount_, files: this.fileList_}); if(this.fileList_.length >= 5){ document.querySelector('#review_upload').style.display = 'none'; } if(this.fileList_.length > 0){ document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '8px'; } } handleFileDelete_(index) { this.fileList_.splice(index, 1); this.uploadCount_--; sessionStorage.setItem('fileList', JSON.stringify(this.fileList_)); this.triggerEvent_("handleFileDelete", { count: this.uploadCount_, files: this.fileList_}); document.querySelector('#review_upload').style.display = 'block'; if(this.fileList_?.length === 0){ document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '132px'; } } handleFilePreview_(index) { const finalPreviewData = this.fileList_[index]; const filePreviewModal = document.getElementById('filePreviewModal'); const fullScreenVideo = document.getElementById('fullScreenVideo'); const fullScreenImage = document.getElementById('fullScreenImage'); const previewModalClose = document.getElementById('previewModalClose'); const previewLoading = document.getElementById('previewLoading'); filePreviewModal.style.display = 'block'; previewLoading.style.display = 'flex'; if(finalPreviewData?.type === 'video'){ const media = this.mediaParse_(this.fileList_[index]?.url); fullScreenVideo.addEventListener('canplaythrough', function() { previewLoading.style.display = 'none'; }); fullScreenImage.src = ''; fullScreenImage.style.display = 'none'; fullScreenVideo.style.display = 'block'; fullScreenVideo.src = media.mp4 || ''; } else { fullScreenImage.onload = function() { previewLoading.style.display = 'none'; }; fullScreenVideo.src = ''; fullScreenVideo.style.display = 'none'; fullScreenImage.style.display = 'block'; fullScreenImage.src = finalPreviewData.url; } previewModalClose.addEventListener('click', function() { filePreviewModal.style.display = 'none'; }); } handleFileLimit_() { alert(window.AppReviewsLocale.comment_file_limit || 'please do not upload files more than 5'); this.triggerEvent_("handleFileLimit"); } handleFileSizeLimit_() { alert(window.AppReviewsLocale.comment_file_size_limit || 'File size does not exceed 10M'); } clear(){ this.fileList_ = []; this.uploadCount_ = 0; sessionStorage.setItem('fileList', JSON.stringify(this.fileList_)); this.triggerEvent_("handleClear", { count: this.uploadCount_, files: this.fileList_}); document.querySelector('#review_upload').style.display = 'block'; } mediaParse_(url) { var result = {}; try { url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (str, key, value) { try { result[key] = decodeURIComponent(value); } catch (e) { result[key] = value; } }); result.preview_image = url.split('?')[0]; } catch (e) {}; return result; } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, name, data); this.action.trigger(this.element, name, event); } } SPZ.defineElement('spz-custom-file-upload', SpzCustomFileUpload);
The review would not show in product details on storefront since it does not support to.
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('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);