Środek do czyszczenia łańcuchów rowerowych
${function() {
const variantData = data.variant || {"id":"f7122bd8-cbfd-4de6-a0a5-c474fb964ddb","product_id":"704a71bf-0b1c-4243-a3db-94b49d566277","title":"","weight_unit":"kg","inventory_quantity":100,"sku":"nha3-1","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":105,"min_quantity":1}],"weight":"0","compare_at_price":"0","price":"105","retail_price":"0","available":true,"url":"\/products\/cycle-chain-cleaner?variant=f7122bd8-cbfd-4de6-a0a5-c474fb964ddb","available_quantity":999999999,"options":[],"off_ratio":0,"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
Narzędzie do czyszczenia łańcucha rowerowego
Rewolucyjne czyszczenie
Nasza pralka łańcucha rowerowego jest idealnym narzędziem konserwacji, zapewniającym czyszczenie pełnego widoku głębokiego oczyszczania każdego łącza łańcucha. Dzięki atrakcyjnej wizualnie projektu to zaawansowane rozwiązanie czyszczenia jest zmieniającym grę dla entuzjastów, którzy wymagają doskonałości.
Narzędzie do czyszczenia łańcucha rowerowego
Zaawansowane czyszczenie
Podnieś swoją grę konserwacyjną dzięki naszej pralce z łańcuchem rowerowym, która zapewnia czyszczenie pełnego widoku w celu dokładnej konserwacji. Nie tylko wygląda świetnie, ale pozwala także zobaczyć każdy link w łańcuchu podczas czyszczenia.
Użyj po prostu
Nasza pralka łańcucha rowerowego oferuje humanizowany konstrukcja, która ułatwia działanie, podczas gdy uchwyt szybkiego uwalniania pozwala na wydajne usuwanie brudu, dzięki czemu konserwacja jest szybkim i kłopotliwym procesem.
Kompaktowy i lekki
Oferując wygodny port napełniający, ta pralka łańcucha rowerowego pozwala bez wysiłku doładować detergent i wodę, zapewniając kłopotliwe utrzymanie i konsekwentną wydajność.
Scruber łańcucha rowerowego
Osiągnij czyszczenie pełnego widoku za pomocą naszego płuczki łańcucha rowerowego. Jego szybki uchwyt i wygodny port napełniający sprawiają, że czyszczenie jest dziecinnie proste. Projekt zapewnia bezpieczne pozycjonowanie i może wytrzymać codzienne zużycie. Pożegnaj się z brudnymi łańcuchami!
Specyfikacja:
Nazwa: myjka łańcucha rowerowego
Rozmiar produktu: około 15x7,2x3 cm/5.91x2.83x1.18 cali
Waga: 135G
Lista produktów:
Podkładka łańcucha rowerowego*1
Nasza gwarancja:
- Uważamy, że mamy jedne z najbardziej innowacyjnych produktów na świecie i chcemy się upewnić, że popieramy to z 15-dniową gwarancją bez ryzyka.
- Jeśli z jakiegokolwiek powodu nie masz pozytywnego doświadczenia, dołożymy wszelkich starań, aby upewnić się, że jesteś zadowolony z zakupu.
-
- Chcemy, abyś był pewny, że w zakupie i wypróbowaniu produktów istnieje absolutnie zerowe ryzyko. Jeśli ci się nie podoba i nie czujesz się źle, zrobimy to dobrze.
- Wysyłamy e -mailem wsparcie. Jeśli potrzebujesz pomocy, skontaktuj się z nami.
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.