7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt
7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt

7oz Cotton Herringbone Oversized Patch Pocket Short Sleeve Shirt

Color
Please select a color
Size
Please select a size
4 sold
Price
$0.00
$29.99
Save  0%
Quantity
Free shipping on order $79
Fast delivery
Sustainably made
Secure payments
SKU: xtjx52024022814-8-a
/** @private {string} */ class SpzCustomAnchorScroll extends SPZ.BaseElement { static deferredMount() { return false; } constructor(element) { super(element); /** @private {Element} */ this.scrollableContainer_ = null; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { this.viewport_ = this.getViewport(); this.initActions_(); } setTarget(containerId, targetId) { this.containerId = '#' + containerId; this.targetId = '#' + targetId; } scrollToTarget() { const container = document.querySelector(this.containerId); const target = container.querySelector(this.targetId); const {scrollTop} = container; const eleOffsetTop = this.getOffsetTop_(target, container); this.viewport_ .interpolateScrollIntoView_( container, scrollTop, scrollTop + eleOffsetTop ); } initActions_() { this.registerAction( 'scrollToTarget', (invocation) => this.scrollToTarget(invocation?.caller) ); this.registerAction( 'setTarget', (invocation) => this.setTarget(invocation?.args?.containerId, invocation?.args?.targetId) ); } /** * @param {Element} element * @param {Element} container * @return {number} * @private */ getOffsetTop_(element, container) { if (!element./*OK*/ getClientRects().length) { return 0; } const rect = element./*OK*/ getBoundingClientRect(); if (rect.width || rect.height) { return rect.top - container./*OK*/ getBoundingClientRect().top; } return rect.top; } } SPZ.defineElement('spz-custom-anchor-scroll', SpzCustomAnchorScroll); const STRENGTHEN_TRUST_URL = "/api/strengthen_trust/settings"; class SpzCustomStrengthenTrust extends SPZ.BaseElement { constructor(element) { super(element); this.renderElement_ = null; } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { this.xhr_ = SPZServices.xhrFor(this.win); const renderId = this.element.getAttribute('render-id'); SPZCore.Dom.waitForChild( document.body, () => !!document.getElementById(renderId), () => { this.renderElement_ = SPZCore.Dom.scopedQuerySelector( document.body, `#${renderId}` ); if (this.renderElement_) { this.render_(); } this.registerAction('track', (invocation) => { this.track_(invocation.args); }); } ); } render_() { this.fetchData_().then((data) => { if (!data) { return; } SPZ.whenApiDefined(this.renderElement_).then((apis) => { apis?.render(data); document.querySelector('#strengthen-trust-render-1539149753700').addEventListener('click',(event)=>{ if(event.target.nodeName == 'A'){ this.track_({type: 'trust_content_click'}); } }) }); }); } track_(data = {}) { const track = window.sa && window.sa.track; if (!track) { return; } track('trust_enhancement_event', data); } parseJSON_(string) { let result = {}; try { result = JSON.parse(string); } catch (e) {} return result; } fetchData_() { return this.xhr_ .fetchJson(STRENGTHEN_TRUST_URL) .then((responseData) => { if (!responseData || !responseData.data) { return null; } const data = responseData.data; const moduleSettings = (data.module_settings || []).reduce((result, moduleSetting) => { return result.concat(Object.assign(moduleSetting, { logos: (moduleSetting.logos || []).map((item) => { return moduleSetting.logos_type == 'custom' ? this.parseJSON_(item) : item; }) })); }, []); return Object.assign(data, { module_settings: moduleSettings, isEditor: window.self !== window.top, }); }); } } SPZ.defineElement('spz-custom-strengthen-trust', SpzCustomStrengthenTrust);

SKU:xtjx52024022814

DESCRIPTION

Fabric: Cotton

Pattern: Plain

Collar Type: Lapel

Placket: Single-Breasted

Sleeve Type: Regular

Subdivision Style: American Casual

Basic Style: Other

Sleeve Length: Short Sleeve

Thickness: Regular

Applicable Scene: Leisure

Category:Shirt

Product Size:


PleaseNote:There may be 1-2 cm deviation in different sizes, locations and stretch of fabrics.

PromiseIf the product has any quality problems, please feel free to contact us, we will help you solve the problem as quickly as possible.

care

Machine wash gently at 30°C with similar coloured garments.

Do not use bleach or softener.

Do not iron or dry.

Dry as much as possible.

1.How long does it take to ship?

Once we received your order. The item will be processed within 3-10days from the day you made your order, and after that, it may take 7-15 business days to be delivered normally.

 

2.How do I choose my size?

Each product has a corresponding size chart, you can choose the right size according to the size chart

Each product detail is accompanied by a corresponding Size Guide (How to check the Size Guide--👉Click in) you can choose the right size according to the size chart!

If you still have questions about sizing, please contact our online customer service.

 

3. About the material

At the bottom of each product detail page there will be a product description which contains the product fabric and material. If you would like to know more about materials and product care, click the link to learn more! 👉Click in

 

4. What payment methods do you support?

As for payment methods, Paypal,klarna,Visa,Maestro,MasterCard and American Express are all acceptable.

 

5. What is your location?

We are located in Hong Kong. All the items will be shipped out from it.

 

6. Is your website trustworthy? What countries does the logistics deliver to?

We understand your concern and can assure you of lawful operation of our company.

We provide qualified products and attentive service.We provide worldwide shipping on a global scale including America, Europe, Australia, Africa, etc. You will get what you buy.

If you are interested in our products, please visit our website to place the order.

If there is any further question, please feel free to contact us.

 

7.Does your company have a local store?

We are sorry for the inconvenience, but we solely sell online. If you are interested in our products, please view our website: XXXX. You can directly choose items and place orders there.

 

8.Is there a quality issue with the relatively low pricing of the products on your site?

Whatever the item is cheap or expensive, the most important thing is that you like it. Also we need to tell you, there might be some difference between the expensive items and the cheap items in every aspects, there are some cheap items in our websites but also have a good quality .

 

So please believe in us and in our product. Thanks.

 

9.There are some bad messages on your site, are these real?

We are sorry to hear that. Even if you saw some bad reviews about our websites, it doesn't rule out that someone is doing it on purpose. And everything has two sides, as the saying goes "Ten thousand people have ten thousand different views on Hamlet." You can have a try by yourself.

Also, we guarantee the good quality of our products. Please contact us if you have received damaged product. It will be solved timely till your satisfaction.

 

10.With regard to tariffs, who pays the tariffs?

We usually mark the parcel as‘gift’ with estimated value of $10, so you might not need to pay the customs duties. But, it also depends on the customs rules of your country. Please note that customers are responsible for paying the tax their countries charge.

Shopping:

Sell Out ? What If The Item I’m Interested In Is No Longer Available In My Size ?

New items can be sold out rather quickly, but we may get more soon!Please contact our customer care department via New items can be sold out

rather quickly, but we may get more soon!

Please contact our customer care department via email and we will do our best to notify you if the item becomes available again. Please include the

best email address for reaching you when the item becomes available.

What Should Do If The Size On The Tag Is Different From What I Ordered ?

The size show on the website will be converted into international size before products are put on sale, which is standard and regular. Therefore, if

you find that the size you get is not the same as shown on the website, don’t panic and worry. That size we sent you is right. Put them on first and see how it turns out. If they don't fit you well, you could return them definitely. (Please check our return policy)

Why The Color Of Received Clothing Is A Little Different From What I Saw Online ?

The camera's perspective and the extent of lighting may cause a little color difference. Hope you could understand us. If it does not affect the

appearance and mood about your favorite clothing, we hope you can keep clothing. We will give you promotion code as the compensation for the future purchase. However, we will try our best to avoid the matter happens.

How Do I Use A Discount Code ?

If you have a discount coupon, when you go to “check out” page, you may find an option where you need to input the number, that’s how you use it.

Why Was My Order Canceled ?

Due to an unforeseen event, the item you ordered suddenly became out of stock and is no longer available. We promise these cases are rare. However, if an item in your order does become unavailable, you will be contacted within 24 to 48 hours about the cancellation. If your order contains additional items, these items will still be shipped to you and the unavailable item will be removed from your order for refund.

Need To Change Something On My Order, How Can I Do That ?

If you need to change or cancel your order, please contact us immediately. We process and ship orders quickly (we’re fast!). Once the parcel was processed and sent to the post office, we will be unable to make any changes.

Can I Get More Information On A Product ?

We try to publish as much useful info as we can about all our products, to help you buy the things that will suit you best.

The product page for every item includes sizing, a detailed description, care instructions, and most importantly, plenty of images.

If there is anything further information you feel we need to put on there to help you, just let us know what information you'd like to see and we'll do our best to include it.

Any Catalogues That I Can Buy From ?

With over so many new items every week, and hundreds of items on the site at any one time, plus constantly changing fashion news, trend features and advice, it would simply be impossible for a paper catalogue to keep up.

Instead we prefer to focus our energy on providing our customers with a website where you can buy what you want when you want, 24 hours, 7 days a week and we believe that the images and catwalk give you a much more realistic view of the items you want.

Payment:

How Do I Pay For My Order ?

We like to give you plenty of payment options: we accept Visa, MasterCard credit card as our secure payment method which accepts all kinds of credit or debit cards. We also take security very seriously indeed, so your details will be safe with us.

All credit and debit card holders are subject to validation and authorization by both us and the card issuer, to maintain security and prevent fraud.

What Currencies Can I Use ?

There are several currencies available as follows: US dollar, EURO, Great Britain Pound Sterling,Canada Dollar, Australia Dollar, Norwegian Krone, Switzerland Francs, Swedish Krona, Polish Zloty, Danish Krona, Japanese Yen, Hong Kong Dollar.

Is It Safe To Use My Credit Card On The Website ?

Please don’t worry; it is safe to order on our website.

We use industry-standard encryption technologies when transferring and receiving customer data exchanged with our site server. None of your credit-card details will be revealed.

During checkout, when you enter your credit card & personal information at our online store, you are passing the information securely to us, using secure socket layer technology (SSL).Welcome to choose your favorite items on our website.

Why Might My Credit Card Be Refused ?

Your credit card may be refused for any of the following reasons:

The card may have expired. Check that your card is still valid.

You may have reached your credit limit. Contact your bank to check that you have not exceeded the authorized purchase limit.

You may have entered some information incorrectly. Check that you have filled in all the required fields correctly.

Make sure you’re using the latest version of your web browser. Maybe because your browser is installed some kinds of plug-ins. Please clear the cookies restart the browser and then try again.

Was I Charged Twice ?

Your credit card will only be charged once after your order ships.

If you just placed your order, what you are seeing on your bank account is an authorization. This is a common bank practice handling credit card transactions to ensure sufficient funds and account authenticity. This authorization will clear (depending on your bank, usually within 48 – 72 hours.) If you need help speeding up the process, you can contact the issuing bank of your credit card.

WHAT DELIVERY OPTIONS DO I HAVE?

After you place the order, we will deliver it to you from the warehouse closest to you. The general processing time is about 3 days. After the order is processed, we will deliver it to you.

When your destination country is the United States or Canada, you can choose Standard Delivery.

STANDARD DELIVERY:

12-15 business days

$14.99 (FREE on orders over $69/€73)


When your destination country is the United Kingdom or Australia, you can choose Standard Delivery.

STANDARD DELIVERY:

5-12 business days

$19.99/€20.38 (FREE on orders over $69/€73)

Standard delivery is free for orders over $69/€73. The discount applies automatically at the checkout.

During peak seasons and promotional sales, delivery might take a little longer.


HOW CAN I TRACK MY ORDER?

Due to COVID-19, air travel has been restricted, which affects our ability to deliver products as quickly and efficiently as we do during normal times. International deliveries may take longer than usual and certain delivery destinations might see further restrictions.Our delivery time starts from the moment an order is accepted and includes a 24-hour period where your items will be processed and dispatched on business days. Please note: this can take longer during promotional sales.


As soon as your order is packed we will send you a shipment confirmation email with the delivery information and a link to track your order online. Please note, that it can take some days before the tracking information is available.


You will also be able to track your order in your account.


TAX AND DUTIES

The price includes tax, customers do not need to pay additional tax

We accept orders from users worldwide except in the following regions.

Customer Reviews

Here are what our customers say.

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.
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);