Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
11 / 11
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball
Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball

Not For Eat Multi Colors Anxiety Stress Relief Sensory Toy Malt Sugar Ball

Check Production Description for Details

277 sold
$9.90
Sugar Ball
Qty

Note: This toy is NOT FOR EATING

Material: TPR Rubber

Diameter: 6cm/ 2.36 inch

Shipment: 15-25 days

Attention: Kept away from kids below 3 years old

const TAG = 'spz-custom-painter-button-animation'; const MAX_ITERATION_COUNT = 99999999; const SITE = (window.C_SETTINGS && window.C_SETTINGS.routes && window.C_SETTINGS.routes.root) || ''; const ADD_TO_CART_ANIMATION_SETTING = `${SITE}/api/marketing_atmosphere_app/add_to_cart_btn_animation/setting`; class SpzCustomPainterButtonAnimation extends SPZ.BaseElement { /**@override */ static deferredMount() { return false; } /** @param {!SpzElement} element */ constructor(element) { super(element); /** @private {!../../src/service/xhr-impl.Xhr} */ this.xhr_ = SPZServices.xhrFor(this.win); /** @private {Object} */ this.data_ = null; /** @private {Element} */ this.addToCartButton_ = null; /** @private {boolean} */ this.productAvailable_ = true; /** @private {number} */ this.timerId_ = null; /** @private {number} */ this.animationExecutionCount_ = 0; /** @private {boolean} */ this.selectedVariantAvailable_ = true; /** @private {number} */ this.delay_ = 5000; /** @private {number} */ this.iterationCount_ = 5; /** @private {string} */ this.animationClass_ = ''; } /** @override */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** @override */ buildCallback() { this.productAvailable_ = this.element.hasAttribute('product-available'); this.selectedVariantAvailable_ = this.element.hasAttribute('selected-variant-available'); } /** @override */ mountCallback() { this.render_(); } /** @private */ render_() { if (!this.productAvailable_) { return; } this.fetch_().then((data) => { if (!data) { return; } this.data_ = data; this.animationClass_ = `painter-${data.animation_name}-animation`; this.iterationCount_ = data.animation_iteration_count === 'infinite' ? MAX_ITERATION_COUNT : data.animation_iteration_count; const animationDuration = 1; const animationDelay = data.animation_delay || 5; this.delay_ = (animationDuration + animationDelay) * 1000; this.handleButtonEffect_(); }); } /** * @param {JsonObject} data * @return {(null|Object)} * @private */ parseJson_(data) { try { return JSON.parse(data); } catch (e) { return null; } } /** * @return {Promise} * @private */ fetch_() { return this.xhr_.fetchJson(ADD_TO_CART_ANIMATION_SETTING).then((data) => { if (!data || !data.enabled) { return null; } return this.parseJson_(data.detail); }); } /** @private */ getAddToCartButton_() { this.addToCartButton_ = SPZCore.Dom.scopedQuerySelector( document.body, '[data-section-type="product"] [role="addToCart"], [data-section-type="product_detail"] [role="addToCart"], [data-section-type="product_detail"] [data-click="addToCart"], [data-section-type="product"] [data-click="addToCart"]' ); } /** @private */ restartAnimation_() { this.addToCartButton_.classList.remove(this.animationClass_); this.addToCartButton_./* OK */ offsetWidth; this.addToCartButton_.classList.add(this.animationClass_); this.animationExecutionCount_++; } /** @private */ clearTimer_() { this.win.clearInterval(this.timerId_); this.timerId_ = null; } /** @private */ setupTimer_() { this.timerId_ = this.win.setInterval(() => { this.restartAnimation_(); if (this.animationExecutionCount_ >= this.iterationCount_) { this.removeAnimationClass_(); this.clearTimer_(); } }, this.delay_); } /** @private */ restartTimer_() { if (this.animationExecutionCount_ >= this.iterationCount_) { this.removeAnimationClass_(); return; } this.setupTimer_(); } /** @private */ listenVariantChange_() { SPZUtils.Event.listen(self.document, 'dj.variantChange', (e) => { const selectedVariant = e.detail && e.detail.selected; if (!selectedVariant) { return; } const {available} = selectedVariant; if (this.selectedVariantAvailable_ !== available) { this.selectedVariantAvailable_ = available; this.clearTimer_(); if (available) { this.restartTimer_(); } } }); } /** @private */ removeAnimationClass_() { this.win.setTimeout(() => { this.addToCartButton_.classList.remove(this.animationClass_); }, 1000); } /** @private */ handleButtonEffect_() { this.getAddToCartButton_(); if (!this.addToCartButton_) { return; } if (this.selectedVariantAvailable_) { ++this.animationExecutionCount_; this.addToCartButton_.classList.add(this.animationClass_); if (this.iterationCount_ === 1) { this.removeAnimationClass_(); return; } this.setupTimer_(); } this.listenVariantChange_(); } } SPZ.defineElement(TAG, SpzCustomPainterButtonAnimation);