Free shipping worldwide over $50
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
3 / 9
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
Waterproof Soap Dish With Drainage Box  🎅 Christmas Must Have🎅
50% OFF
spainho

Waterproof Soap Dish With Drainage Box 🎅 Christmas Must Have🎅

$19.99 $39.78
1 sold
Color
Qty

If you are used to bathing with soap, whether the soap is often wet with water and becomes sticky, the use time is very short, and the soap has to be changed frequently. You need a waterproof soap dish with drainage box to help you solve this trouble.

DOUBLE-LAYER SOAP DISH: The soap bar holder has two layers, the upper layer drains water quickly, and the lower tray accumulates water, so the soapy water does not leak, keeping the table clean and tidy. Don't worry about the soap getting flooded or turning mushy.

STURDY AND DURABLE: The bar soap holder is made of thickened ABS material, which is sturdy and durable, ideal for use in the bathroom, shower or tub.

STRONG STICKINESS: you will get 3 self-adhesive tapes, very easy to install, no need to drill the wall. Strong stickiness, it will not fall easily even in wet environment.

EASY TO CLEAN: You can disassemble the whole soap box, disassemble the upper and lower layers, and perform a thorough cleaning, which is very convenient.

STYLISH LOOK: The wall mounted soap holder features smooth lines and luxurious colors to give your bathroom a more upscale and elegant look.

You May Also Like Don't Like These?

Write a Review
Customer Reviews
Wow you reached the bottom
Newest
Most liked
Highest ratings
Lowest ratings
×
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.