Livraison gratuite dès 50 € !
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
2 / 79
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
fr.everydayedeals Porte-clé - DIY Diamant Peinture - Lettres de fleurs
Tu pourrais aussi aimer Je n'aime pas ça?
0% OFF
Épargnez €-4.99
EDS

Porte-clé - DIY Diamant Peinture - Lettres de fleurs

€4.99
10 ventes
Style
Quantité 998 Stock

DIY diamant Ornement Décoration Double Face diamant Art Porte-clés Lettter Full Drill Pendentifs en diamants pour la décoration intérieure des débutants
Caractéristiques :
1. Unique et créatif : le porte-clés peinture au diamant est une façon unique et créative d'EXPRESS votre côté artistique grâce à l'utilisation de résine et de strass.
2. Finition brillante : peinture au diamant porte-clés, la résine offre une finition brillante qui ajoute de la brillance et éclat< span> à votre œuvre d'art, en la faisant ressortir et en attirant l'attention.
3. Effets éblouissants : décoration d'ornement en diamant, les strass en résine offrent une brillance et un éclat uniques qui créent des effets éblouissants et font vraiment ressortir vos décorations de bricolage.
4. Décoration de bricolage populaire : Résine strassLa peinture au diamant est une clé d'art populaire de bricolagediamant bague qui est facile à apprendre, ne nécessite aucune expérience préalable et est appréciée par des personnes de tous âges et niveaux de compétence.
5. Utilisation polyvalente : DIY La peinture au diamant peut être utilisée pour décorer une large gamme d'articles, des accessoires personnels à la décoration intérieure, en ajoutant une touche de personnalisation charme aux objets du quotidien.


Spécification :
Origine : Chine continentale
Style : Style moderne< Matériau : résine />Ouvrez l'emballage et vérifiez les outils de peinture au diamant.
Vérifiez les couleurs des diamants en résine et rangez-les dans l'ordre selon les codes.
Retirez le film protecteur pour révéler les symboles qui correspondent aux codes de couleur.
Utilisez l'outil correspondant pour ramasser les diamants en résine et placez-les sur le symbole selon le code couleur.
Il est recommandé de compléter un jeu de diamants en résine à la fois pour terminer la peinture plus rapidement.
/>Pour créer une peinture au diamant parfaite, vous devez placer le motif sur une surface plane et ne laisser aucun diamant sur chaque ligne de symboles.
Pour découper une bonne forme sur le papier, assemblez le tableau de classification sur la surface de le matériau.
Lors de l'assemblage, assurez-vous qu'il n'y a pas de lacunes ou de fissures et que tout est à plat.
Après avoir terminé la peinture au diamant, remplissez les lacunes restantes avec de la colle pour faire correspondre les symboles de diamant.

Remarque :
En raison des différents effets de moniteur et de lumière, la couleur réelle de l'article peut être légèrement différente de la couleur montrée sur les images. Merci !
Veuillez permettre un écart de mesure de 1 à 2 cm en raison d'une mesure manuelle.

Contenu de l'emballage :
1 x porte-clés de peinture au diamant
1 x outil de peinture au diamant (stylo de forage et plaque d'accélération)< /span>

Tu pourrais aussi aimer Je n'aime pas ça?
Avis des clients

Here are what our customers say.

émettre un commentaire
Commentaire de clients
tu as atteint le fond
Le plus récent
Le plus aimé
Meilleures notes
Notes les plus basses
×
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);