🤣Ręcznie wykonany zabawny uchwyt na ręczniki papierowe
${function() {
const variantData = data.variant || {"id":"27c60353-a0d7-4a6c-9d15-13d0cfabb659","product_id":"2585b674-49ce-4ea7-b186-7c0dde490d76","title":"","weight_unit":"kg","inventory_quantity":100,"sku":"mq45-","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":115,"min_quantity":1}],"weight":"0","compare_at_price":"229","price":"115","retail_price":"229","available":true,"url":"\/products\/porte-mouchoirs-drole-fait-a-la-main?variant=27c60353-a0d7-4a6c-9d15-13d0cfabb659","available_quantity":999999999,"options":[],"off_ratio":50,"flashsale_info":[],"sales":0};
const saveType = "amount";
const productLabelDiscountOn = true;
return `
-
${saveType == 'percentage'
? `-${variantData.off_ratio}%`
: `-`
}
`;
}()}
Produkt był niedostępny.
Produkt niedostępny.
DHL Płatność gotówką przy odbiorze
Masz prawo zwrócić produkt w ciągu 14 dni
Zapłać online i zyskaj 10% rabatu
Dodaj humoru do wystroju swojego domu dzięki temu fantazyjnemu, ręcznie robionemu uchwytowi na ręczniki papierowe! Jego ciekawy projekt obejmuje szerokie usta i nos przypisany do twarzy, co z pewnością będzie tematem rozmów. Idealny do dodania odrobiny fantazji każdemu pomieszczeniu, szczególnie dla gości, którzy uśmiechają się za każdym razem, gdy sięgają po chusteczkę. Każdy element został zaprojektowany z dbałością o szczegóły, dzięki czemu jest dziełem sztuki, które jest zarówno funkcjonalne, jak i niepowtarzalne. Idealny dla miłośnika fantazyjnych dekoracji wnętrz lub jako zabawny prezent!
funkcja
-
Wykonane ręcznie z najwyższej jakości materiałów
-
Zabawny i funkcjonalny projekt
-
Idealnie nadaje się do łazienki, salonu czy biura
Wysyłka na cały świat ✈
Należy pamiętać, że przesyłka jest ubezpieczona. Możesz jednak otrzymać swój przedmiot wcześniej. Zawsze zostanie wysłany numer śledzenia, dzięki czemu będziesz mógł śledzić każdy etap procesu! Fajne rzeczy, na które warto czekać!
nasza gwarancja
-
Globalna ubezpieczona wysyłka: każde zamówienie zawiera szczegóły śledzenia w czasie rzeczywistym i ubezpieczenie na wypadek zagubienia lub kradzieży paczki w transporcie.
-
Gwarancja zwrotu pieniędzy: Jeśli Twój przedmiot dotrze uszkodzony lub wadliwy w ciągu 60 dni od normalnego użytkowania, chętnie wymienimy lub zwrócimy Twój zakup.
-
✉️ Całodobowa obsługa klienta: Mamy zespół agentów gotowych do pomocy i odpowiedzi na wszystkie pytania w ciągu 24 godzin. 7 dni w tygodniu.
-
Bezpieczne płatności: Używamy wiodącego w branży szyfrowania SSL, aby w 100% chronić Twoje dane osobowe i finansowe.
Oto, co mówią nasi klienci.
Najnowsza
Najbardziej lubiany
Najwyższe oceny
Najniższe oceny
Najbardziej lubiany
Najwyższe oceny
Najniższe oceny
×
${function(){
const limit = typeof data === 'number' ? data : 0;
return `
Zdjęcia/wideo (${limit || 0}/5)
` }()}
${(function(){
const closeIcon =
'
';
if (item.type === 'image') {
return `
${closeIcon}
`
}
return `
${closeIcon}
`
})()}
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.