Free Shipping on orders over $69
السلة

Women's Abstract Pattern Art Print Casual Stylish Cotton Dress

$43.99 USD $0.00 USD
color
Orange
size
S
M
L
XL
2XL
3XL
الكمية
المخزون المتبقي 100
التسعير بالجملة
الكمية
السعر
1+
$43.99 USDكل

Product Details:

Product ID:DW05659ELG

Gender: For Women

Style: Casual

Fit Type:FIt

ShirtLength: Regular

Sleeves Length:

Collar: Stand Collar

Material: 70%Cotton+30%Linen

Material Stretch: No Stretch

Weight: 0.300kg

Package: 1 x Dress

Size Guide For Women

SizeUKUSEURLengthChestWaistHip
S8~104~634~361299696174
M12~148~1038~40130102102180
L161242~44131.5108108186
XL181446133114114192
2XL2016~1848134.5124124202
3XL2620~2250~52136134134212

Product Details:

Product ID:DW05659ELG

Gender: For Women

Style: Casual

Fit Type:FIt

ShirtLength: Regular

Sleeves Length:

Collar: Stand Collar

Material: 70%Cotton+30%Linen

Material Stretch: No Stretch

Weight: 0.300kg

Package: 1 x Dress

Size Guide For Women

SizeUKUSEURLengthChestWaistHip

Shipping Policy

Where can JUNTRIP deliver the package to?

JUNTRIP can ship to most countries in the world, covering North and South America, Europe, Asia, Africa, Oceania, and more, over 200 countries & regions.

Countries not shipped to include: Aland Island, Ascension, Azores, Balearic Islands, Bouvet Island, Caroline Islands, China Mainland, Eritrea, Northern Mariana Islands, Somalia, Somaliland, Spanish Territories of N.Africa, Yemen, YUGOSLAVIA, Zaire.

How does JUNTRIP ship your order?

After placing an order, you will receive a product information confirmation e-mail; After the payment, you will receive a successful payment confirmation e-mail; After the order is shipped, you will receive a shipping information confirmation e-mail, contains a tracking number, you can check the shipping state with the tracking number in https://www.17track.net/en or http://www.track718.com/en

What shipping methods are offered? And how long does it take to ship?

About delivery time:
Delivery services are subject to government restrictions and flight cancellations. This means that the estimated time to receive the package should be 7-28 business days on average. Hope you can understand.

Receipt time = processing time + delivery time
Processing time: 3-8 working days (quality control/picking and sorting/packing...)
Shipping time:
Standard Shipping: 10-20 business days
Premium Shipping: 7-12 business days
ZONE SHIPPING METHOD PROCESSING TIME DELIVERY TIME
EUROPE Standard 3-8 Business Days 5-15 Business Days
USA Standard 3-8 Business Days 7-15 Business Days
UK Standard 3-8 Business Days 5-12 Business Days
AU Standard 3-8 Business Days 5-12 Business Days
CA Standard 3-8 Business Days 7-15 Business Days
Global Standard 3-8 Business Days 7-20 Business Days

How much is the shipping cost? 

The price depends on the weight of the product, the destination, the shipping method, and other considerations. Detailed pricing information is visible when placing an order. Choose the correct destination, then select the shipping method, to obtain an accurate shipping cost.

Standard Shipping - $9 USD

Free Shipping on Order over $79.99 USD

What is customs tax?

Taxes apply for imported goods/services and are regulated by the country's law. JUNTRIP is not responsible for any tax charged on its products. The amount of customs taxes depends on policies and tax rates applied per country. Please contact local customs for clear information.

Important Notes:

1. Certain items are prohibited by some shipping carriers. If your order contains these items for the shipping carrier you selected, we will re-route your order via another carrier to ensure it arrives safely. This may require additional shipping time.

2. All estimated/typical delivery times are derived from real-world data collected from past orders. They are approximate times for reference only.

3. JUNTRIP ships all packages from our warehouse and distribution center.

Return & Refund

WE CARE ABOUT YOUR SATISFACTION

Thank you for shopping at JUNTRIP. Our store features unique fashion products designed by independent creators, made with high-quality materials and reliable craftsmanship. Every item is carefully inspected by our QA team before shipping to ensure your satisfaction.
Please note: original shipping fees and return shipping costs are non-refundable.

🕒 Return Policy – Timeframe & Fees

Not satisfied with your order? No worries — you can request a return within 30 days of receiving your items.
Please note that return shipping costs are the responsibility of the customer.

🔄 Return Process

  1. Receive your order

  2. Not satisfied? Contact customer service

  3. If eligible, our team will provide a return address

  4. Send back the items

  5. Email us a screenshot of the return shipping receipt

  6. Once we confirm receipt, your refund will be processed

🚫 Non-returnable Items

The following cannot be returned:

  • Underwear, swimwear, beauty tools, jewelry/accessories, and promotional gifts

  • Items that are worn, washed, damaged, or missing tags

  • Products that affect secondary sales due to artificial damage

⚠️ If you receive a defective, damaged, or incorrect item, please contact customer service first and provide clear photos of the issue.

📌 Important Notes

  • Items must be unused, in original packaging, and in resalable condition

  • All exchange requests are processed as refunds. If you'd like to exchange, please return the original item for a refund and place a new order

  • We do not accept COD (Cash on Delivery) returns. If a return is sent using COD, we will refuse the package

  • Please double-check your return items — we only handle returns for products sold on our official website

Order Cancellation

  • You may cancel your order within 24 hours of successful payment for a full refund

  • If the order has already been shipped, we cannot cancel it

  • To request cancellation, please email us first

💰 Refund Timeline

  • Refunds are arranged within 1 business day of receiving your returned package

  • For order cancellations, refunds are issued within 1 business day of your request

  • PayPal refunds: 3–7 business days depending on your payment method

  • Credit/debit card refunds: 5–10 business days, depending on your bank or card issuer

📬 Contact Us

Have questions? Feel free to reach out to us at: juntripservice@gmail.com

You may also like

Recently Viewed

© 2026 juntrip

Cart

Your shopping bag is empty
Continue shopping
  • ${item.product_title}
    • ${item.options.map(option => option.value).join('/')}
    • ${propertie.name}/${propertie.isImage ? `View image` : propertie.value}
    Free gift
    Mixed Lot
    *${item.quantity}
    ${item.item_text}
    ${discount_item.title}
    (-)
${(function(){ var total_price = data.total_price; var postageFreeAmount = 80; var freeAmount = postageFreeAmount - total_price; var isFreeShipping = freeAmount <= 0; var rate = Math.min(total_price / postageFreeAmount * 100, 100).toFixed(2); const textArray = ("Spend {{ amount }} more and get free shipping!").split(/\{\{\s*amount\s*\}\}/); const textArrayHtml = textArray.map((text, index) => { if (index == 0) { return `${text}`; } return `${text}`; }).join(''); return `
${textArrayHtml}
You've got free shipping
${rate}%
` })()}
Total:
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `${text}`; } return ` ${text} `; }).join(''); }()}
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `${text}`; } return ` ${text} `; }).join(''); }()}
  • ${discount_application.title}: -
${data.invalid_msg}
Check out
Taxes and shipping calculated at checkout
${(function(){ var total_price = data.total_price; var postageFreeAmount = 80; var freeAmount = postageFreeAmount - total_price; var isFreeShipping = freeAmount <= 0; var rate = Math.min(total_price / postageFreeAmount * 100, 100).toFixed(2); const textArray = ("Spend {{ amount }} more and get free shipping!").split(/\{\{\s*amount\s*\}\}/); const textArrayHtml = textArray.map((text, index) => { if (index == 0) { return `${text}`; } return `${text}`; }).join(''); return `
${textArrayHtml}
You've got free shipping
${rate}%
` })()}
${data.invalid_msg}
Total: 
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `${text}`; } return ` ${text} `; }).join(''); }()}
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `${text}`; } return ` ${text} `; }).join(''); }()}
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `${text}`; } return ` ${text} `; }).join(''); }()}
  • ${discount_application.title}: -
Check out
${data.invalid_msg}
Check out
Taxes and shipping calculated at checkout
  • Subtotal:
  • ${discount_application.title}: -
Total:
Check out
Taxes and shipping calculated at checkout
const summaryStickyRender = document.querySelector('#cart-drawer-summary-sticky-render'); if (summaryStickyRender) { document.body.style.setProperty('--cart-drawer-summary-sticky-height', summaryStickyRender.clientHeight + 'px'); }
${function(){ console.log('quick-shop-render',data); const productData = data.product; let product_change_event = '', mouse_over_event = ' '; mouse_out_event = ''; const product_options = productData.options.filter(Boolean) || []; const selectedVariant = productData.variants.find(v => v.available) || productData.variants[0]; const statusLan = ((selectedVariant && !selectedVariant.available) || (!selectedVariant && !productData.available)) ? "Sold out" : "Add to cart"; return `
${statusLan}
` }()}
${function(){ const currentSelectVariant = data.variant; const defaultVariant = (data.product && data.product.variants && data.product.variants[0]); const variantData = currentSelectVariant || defaultVariant || data; const retail_price = variantData.retail_price || 0; return `
Retail
` }()} ${function(){ const wholesale_enabled = false; const qty = data.quantity || 1; const currentSelectVariant = data.variant; const defaultVariant = (data.product && data.product.variants && data.product.variants[0]); const productVariant = {"id":"e62e5247-08fa-4e30-a499-7bd88911ecf1","product_id":"08c6871e-78f7-4270-83a0-3230f1af7cd8","title":"Orange-S","weight_unit":"kg","inventory_quantity":999,"sku":"131-260320-15-DW05659ELG-Orange-S","barcode":"","position":1,"option1":"Orange","option2":"S","option3":"","note":"","image":{"src":"\/\/img.staticdj.com\/449364fe550c96fa2b31818cab037d99.webp","path":"449364fe550c96fa2b31818cab037d99.webp","width":900,"height":1200,"alt":"","aspect_ratio":0.75},"wholesale_price":[{"price":43.99,"min_quantity":1}],"weight":"0","compare_at_price":"0","price":"43.99","retail_price":"0","available":true,"url":"\/products\/womens-abstract-pattern-art-print-casual-stylish-cotton-dress48fd72c6-ab6e-43a0-888c-3e258d0d0ad8?variant=e62e5247-08fa-4e30-a499-7bd88911ecf1","available_quantity":999999999,"options":[{"name":"color","value":"Orange"},{"name":"size","value":"S"}],"off_ratio":"0","flashsale_info":{"variant_id":"e62e5247-08fa-4e30-a499-7bd88911ecf1","product_id":"","quantity":0,"discount_id":"","limit_time":0,"limit_buy":0,"user_limit_buy":0,"discount_sales":0,"discount_sales_rate":"","discount_stock":0,"ends_at":0,"starts_at":0,"allow_oversold":"","allocation_method":"","price":"43.99","compare_at_price":"","discount_price":"43.99","customary_saved_price":"","customary_off_ratio":"","discount_saved_price":"","discount_off_ratio":"0","use_before_price":false,"before_price":"","title":"","properties":"","color_setting_promotional_copy":"","discount_quantity":0,"is_need_split":false},"sales":2}; const variantData = currentSelectVariant || defaultVariant || productVariant; const wholesale_price = variantData.wholesale_price || []; if(wholesale_enabled && wholesale_price.length > 0) { let wholesaleIndex = wholesale_price.findIndex(item => { return item.min_quantity > qty; }); if(wholesaleIndex < 0){ wholesaleIndex = wholesale_price.length - 1; }else if(wholesaleIndex > 0){ wholesaleIndex = wholesaleIndex - 1; } const wholesalePrice = wholesale_price[wholesaleIndex] || ''; return `
` }else { const price = variantData && variantData.price; return price != undefined ? `
` : ''; } }()}
${function(){ const optionName = option.name || ''; const optionId = option.id || ''; let isThumbImage = !!option.showThumbImage; const thumbStyle = "image_with_text"; const variantType = "button"; const isSelected = (value) => { const selected = (data.selectedOptions || []).find(v => v.name === optionName); return selected && selected.value.length && selected.value[0] == value; }; const getThumbImage = (value) => { const options = data.product.options || []; const option = options.find(o => o.name === optionName); if (option.thumbImages) { const thumbImage = option.thumbImages.find(t => t.value === value); if (thumbImage && thumbImage.image) { return { src: thumbImage.image.src, alt: thumbImage.image.alt }; } } return {src: '', alt: ''}; }; return ` ${optionName}:  ${data.selectedOptions && data.selectedOptions.length && data.selectedOptions.find(v => v.name === optionName).value[0]}
${value}
${optionName}
${value} ${value}
` }()}
${data.value}
${function() { const price = data.variant?.price || data.product.selectedVariant?.price; const compare_at_price = data.variant?.compare_at_price || data.product.selectedVariant?.compare_at_price; return ` ` }()}
${function() { return data.product.options.length > 0 ? data.product.options.map((option, index) => { return `
${option.name}:
${function() { if(data.product.config.isMobile === false) { return `
${item.value}
` } else { return `
${option.name}
${item.value} 编组 27
` } }()} ` }).join('') : ``; }()}
${function() { const value = (data.originData && data.originData.value) || data.value; const isHasValue = value ? true : false; return ` ${value ? value : "" } ` }()} ${data.product.selectedSkuText ? data.product.selectedSkuText : ''}
${function() { return (data.product.options || []).map((option, index) => { return `
${option.name}: 
${option.values.map((value,idx) => { let selectedOptions = data.product.selectedVariant.options; let selected = ''; if(selectedOptions.length) { for(const key in selectedOptions) { if(selectedOptions[key].value == value) { selected = 'checked' } } } return `
${value}
`; }).join('')}
`; }).join('') }()}
${data.value ? data.value : ''}
${function() { let dropdownCloseEvent = ''; if(!data.config.isMobile && (data.config.style == 'circle' || data.config.style == 'square')) { data.product.options?.forEach((item, index) => { dropdownCloseEvent += `app-atc-popover-${index}.close;`; }) } return ` `; }()}
${function(){ let product_change_event = ''; const product_options = data.product.options?.filter(Boolean) || []; for (let opt of product_options) { const nameEscape = opt.name.replace(/\/|\\|\s|\'|\"|`|\<|\>/g, ''); product_change_event = product_change_event + `add-cart-selected-variant-${opt.id}.rerender(data=event.selectedValues.${opt.name});`; } return `
${function() { const isDarkBg = data.isDarkBg; const textColor = isDarkBg ? '#ffffff' : '#212B36'; const delPriceColor = isDarkBg ? '#E0E0E2' : '#9CA0B0'; const variantColor = isDarkBg ? '#ffffff' : '#939393'; const config = data.config; return ` ` }()}
${function(){ if(data.is_button_click_info) { return ` ${data.config.button_text || 'Add to cart'}
${data.product.title}
${data.config.button_text || 'Add to cart'}
` } else { return `
${product.title}
${function() { if(data.is_button_click_info) { return ` ` } else { return ` ` } }()}
Quantity
${function() { const product_unavailable_text = 'Unavailable' || data.i18n.product_unavailable; if(data.isFollowThemeQty && !data.is_button_click_info) { return `
${data.config.button_text || 'Add to cart'} ${product_unavailable_text} ${data.i18n.sold_out} ${product_unavailable_text}
${data.config.button_text || 'Buy now'} ${product_unavailable_text} ${data.i18n.sold_out} ${product_unavailable_text}
` } else { return ` ${data.config.button_text || 'Add to cart'} ${data.config.button_text || 'Add to cart'}
${data.config.button_text || 'Buy now'} ${product_unavailable_text} ${data.i18n.sold_out} ${product_unavailable_text}
` } }()}
` } }()}
${function() { if(data.is_button_click_info) { return ` ${function(){ let product_change_event = ''; const product_options = data.product.options?.filter(Boolean) || []; for (let opt of product_options) { const nameEscape = opt.name.replace(/\/|\\|\s|\'|\"|`|\<|\>/g, ''); product_change_event = product_change_event + `add-cart-selected-variant-${opt.id}.rerender(data=event.selectedValues.${opt.name});`; } return `
${product.title}
${function() { if(data.is_button_click_info) { return ` ` } else { return ` ` } }()}
Quantity
${function() { const product_unavailable_text = 'Unavailable' || data.i18n.product_unavailable; if(data.isFollowThemeQty && !data.is_button_click_info) { return `
${data.config.button_text || 'Add to cart'} ${product_unavailable_text} ${data.i18n.sold_out} ${product_unavailable_text}
${data.config.button_text || 'Buy now'} ${product_unavailable_text} ${data.i18n.sold_out} ${product_unavailable_text}
` } else { return ` ${data.config.button_text || 'Add to cart'} ${data.config.button_text || 'Add to cart'}
${data.config.button_text || 'Buy now'} ${product_unavailable_text} ${data.i18n.sold_out} ${product_unavailable_text}
` } }()}
` }()} ` } else { return `` } }()}
` }()} const TAG = 'spz-custom-add-to-cart'; class SpzCustomAddToCart extends SPZ.BaseElement { constructor(element) { super(element); this.plugin_timestamp = Date.now(); this.defaultColorConfig = { module_bg: "#FFFFFF", button_bg: "#E84926", button_color: "#FFFFFF", text_color: "#202020", price_color: "#E84926", border_color: "#E6E6E6", border_bg: "#FFFFFF", round_size: '4' }; this.config = this.defaultColorConfig; this.originStickyTop = 0; this.qty = 1; this.variantId = this.element.getAttribute('variant-id'); this.trackMap = { qty: this.trackQty.bind(this), variant: this.trackVariant.bind(this), addToCart: this.trackAddtoCart.bind(this), atcView: this.trackAtcView.bind(this), } this.isHasView = false; this.isFirstUpdateVariant=false; } static deferredMount() { return false; } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.locale_ = SPZServices.localeFor(this.win); this.hasGlobalAtcListener = !!document.querySelector('#add-cart-event-proxy'); this.setupAction_(); } mountCallback() { // 初始化 this.init(); } async init() { // 如果不是详情页,不需要执行后面js if (window.SHOP_PARAMS.template_type !== '1') return; await this.setLocale(); this.handleIsRender(); this.bingEvents(); } bingEvents() { // 设备切换 重新渲染 window.addEventListener('resize', SPZCore.Types.debounce( this.win, (invocation) => { // 关闭弹窗, 解决切换屏幕尺寸不能滚动的问题 this.triggerEvent_('closeShopModal'); this.config = { ...this.config, isMobile: window.innerWidth < 768 ? true : false, position: window.innerWidth < 768 ? 'down' : this.config.display_position }; this.renderAddToCart(); }, 200 )) } // 获取多语言 async setLocale() { let data; try { //多语言 data = await this.locale_.i18n(['product', 'products']); } catch (error) { console.error(error); } this.i18n = { 'sold_out': 'Sold out', 'add_to_cart': 'Add to cart', 'unavailable': 'Unavailable', 'product_unavailable': 'Product is unavailable.', ...data?.product?.product_detail, ...data?.products?.product, } } getProductData() { let pJson = document.querySelector('#product-json'); if (pJson) { return JSON.parse(pJson.innerHTML)?.product; } else if (typeof $ === 'function') { return $(document).data('djproduct')?.product; } return undefined; } getAddCartBtn() { return document.querySelector('[data-section-type="product_detail"] [data-click="addToCart"], [data-section-type="product_detail"] [role="addToCart"], [data-section-type="product_detail"] [data-click="buyNow"], [data-section-type="product_detail"] [role="buyNow"], [data-section-type="product"] [data-click="addToCart"], [data-section-type="product"] [role="addToCart"], [data-section-type="product"] [data-click="buyNow"], [data-section-type="product"] [role="buyNow"]'); } handleObserver() { if(this.config.trigger_condition == 'theme_hidden') { const $addCartBtn = this.getAddCartBtn(); if($addCartBtn) { // 配置了加购/购买按钮; 设置按钮为observer观察目标 $addCartBtn.setAttribute('id', 'app-atc-need-sticky-buttons') } } } findAncestor(node, selector) { while (node) { if (node.querySelector(selector)) { return node; } node = node.parentElement; } return null; } getThemeProductInfoForm() { let $themeForm = ''; const $themeProductInfo = document.querySelector('[data-section-type="product_detail"], [data-section-type="product"]'); $themeForm = $themeProductInfo?.querySelector('form'); return $themeForm; } // 获取主题商品加购数量 getThemeQuantity() { let $themeForm = this.getThemeProductInfoForm(); if($themeForm) { const formData = new FormData($themeForm); const quantity = formData.get('quantity'); return quantity; } else { return null; } } getThemeInitVariantsData() { const $themeForm = this.getThemeProductInfoForm(); const formData = new FormData($themeForm); } // 获取主题初始表单数据 getThemeProductFormData = () => { const $themeForm = this.getThemeProductInfoForm(); if($themeForm) { const form_data = new FormData($themeForm); const form_data_format = {} for (const [key, value] of form_data) { form_data_format[key] = value; } return form_data_format; } else { return null; } } brightnessByColor(c) { let color = '' + c, isHEX = c.indexOf('#') == 0, isRGB = c.indexOf('rgb') == 0; let r, g, b; if (isHEX) { var m = color.substr(1).match(color.length == 7 ? /(\S{2})/g : /(\S{1})/g); if (m) { (r = parseInt(m[0], 16)), (g = parseInt(m[1], 16)), (b = parseInt(m[2], 16)); } } if (isRGB) { const m = color.match(/^rgba\((\d+),\s*(\d+),\s*(\d+),(\d+)\)$/); if (m) { (r = m[1]), (g = m[2]), (b = m[3]); } } if (typeof r != 'undefined') return (r * 299 + g * 587 + b * 114) / 1000; }; getSelectedVariant() { const product = this.getProductData(); return product.variants.find(item => item.id == this.variantId); } setSelectedOption(product) { const selectedVariant = this.getSelectedVariant(); const productData = Object.assign({}, product); // 处理下拉选项 productData?.options?.forEach(option => { option.selectList = []; option.values?.forEach(value => { let selectStatus = ''; selectedVariant?.options?.forEach(item => { if(item.name == option.name && item.value == value) { selectStatus = 'checked'; } }) option.selectList.push({name: option.name, value: value, checked: selectStatus}); }) }) return productData; } getSelectedSkuText() { const selectVariant = this.getSelectedVariant(); if(!selectVariant) { return ''; } const selectList = selectVariant.options; for (var i = 0; i < selectList.length; i++) { selectList[i].value = selectVariant[`option${i + 1}`]; } const selectedSkuText = selectList .map( item => { return item.value; }) .join('/'); return selectedSkuText; } // 是否展示 加购弹窗 getIsButtonClickInfo() { const product = this.getProductData(); const isMultipleProduct = product.available && !product.has_only_default_variant; // 多款式商品 const isButtonClickInfo = this.config.isMobile && (this.config.style_mobile === "mb_simple" || this.config.style_mobile === "mb_circle") && this.config.button_click_mobile === 'info' && isMultipleProduct; return isButtonClickInfo; } // 是否跟随主题的加购数量 isFollowThemeQty (移动端 simple、circle模版、 PC端 simple模版加购数量从主题获取) getIsFollowThemeQty() { const followThemeQtyMobile = (this.config.style_mobile === "mb_simple" || this.config.style_mobile === "mb_circle") && this.config.isMobile; const followThemeQtyPc = this.config.style === "simple" && !this.config.isMobile; const isFollowThemeQty = (followThemeQtyPc || followThemeQtyMobile) ? true : false; return isFollowThemeQty; } getBannerRenderData() { const product = this.getProductData(); // 当前选中变体 const selectedVariant = this.getSelectedVariant(); // 变体options下拉列表数据处理 const productData = this.setSelectedOption(product); // 选中的sku文案 const selectedSkuText = this.getSelectedSkuText(); // 是否展示 加购弹窗 const is_button_click_info = this.getIsButtonClickInfo(); // 主题是否有配置加购/购买按钮 const isHasAddCartBtn = this.getAddCartBtn() ? true : false; // 加购数量是否跟随主题 const isFollowThemeQty = this.getIsFollowThemeQty(); // 浅色背景颜色配置 const brightness = this.brightnessByColor(this.config.module_bg); const isDarkBg = brightness < 115; const renderData = { product: { ...productData, config: {...this.config}, selectedVariant, selectedSkuText, }, config: this.config, qty: this.qty, variant: selectedVariant, selectedVariant, selectedSkuText, is_button_click_info, isDarkBg, isHasAddCartBtn, isFollowThemeQty, i18n: this.i18n, hasGlobalAtcListener: this.hasGlobalAtcListener }; return renderData; } // render add_to_cart async renderAll() { const renderData = this.getBannerRenderData(); this.triggerEvent_('renderBanner', renderData); } getConfigData() { return fetch(`/api/add-to-cart-config`).then(res => { return res.json(); }); } async getConfig() { if(!this.config.hasOwnProperty('open_status')) { const res = await this.getConfigData(); if (res.state === 0 && res.data.open_status) { // config数据转化 this.transConfigData(res.data); } } return this.config; } transConfigData(data) { const resConfig = data; this.config = { ...this.config, ...resConfig, isMobile: window.innerWidth < 768 ? true : false, position: window.innerWidth < 768 ? 'down' : resConfig.display_position }; // 颜色跟随系统时 if(resConfig.color_setting === 'default' || resConfig.color_setting === 'theme') { this.config = { ...this.config, ...this.defaultColorConfig } } } // 是否应用到商店 async handleIsRender() { const res = await this.getConfigData(); if (res.state === 0 && res.data.open_status) { // config数据转化 this.transConfigData(res.data); this.handleObserver(); // 渲染加购内容 this.renderAddToCart(); } } renderAddToCart() { const product = this.getProductData(); if (product.product_type === 'gift_card') return ; if (!product.available) return; this.renderAll(); } // 选择变体 上报 trackVariant() { const product = this.getProductData(); window.sa && sa.track('plugin_atc_variant_click', { product_id: product.id, style: this.config.style, style_mobile: this.config.style_mobile }); } // 更改数量上报 trackQty() { const product = this.getProductData(); window.sa && sa.track('plugin_atc_qty_click', { product_id: product.id, style: this.config.style, style_mobile: this.config.style_mobile }); } // 加购上报 trackAddtoCart() { const product = this.getProductData(); let properties = ''; let source = 'atc'; if (this.config.button_action === 'checkout') { source = 'buy_now'; } const obj = { product_id: product.id, style: this.config.style, style_mobile: this.config.style_mobile, button_action: this.config.button_action, plugin_timestamp: this.plugin_timestamp }; const options = { product_id: product.id, variant_id: this.variantId, quantity: this.qty, source, variant: this.getSelectedVariant(), product: product, process: (window.SHOP_PARAMS.product_settings || {}).add_to_cart_process, properties: properties } // 注册曝光参数到add_to_cart事件 window.spzutm && window.spzutm.registerParams('add_to_cart', { add_to_cart: JSON.stringify(obj) }); window.sa && sa.track('plugin_atc_button_click', obj); this.trackHookAddTocart(); } trackAtcView() { const product = this.getProductData() if(!this.isHasView) { sa.track('plugin_atc_view', { product_id: product.id, button_action: this.config.button_action, style: this.config.style, style_mobile: this.config.style_mobile, plugin_timestamp: this.plugin_timestamp }); this.isHasView = true; } } trackHookAddTocart(options) { //FLASH及之后主题trigger事件上报采用HOOK window.djInterceptors && window.djInterceptors.track && window.djInterceptors.track.use({ event: 'dj.addToCart', params: { id: options.product_id, number: options.quantity, childrenId: options.variant.id, item_price: options.variant.price, name: options.product.title, type: options.variant.type ? options.variant.type : options.product.type, properties: properties, quantity: options.quantity, variant_id: options.variant.id, product_id: options.product_id, source: 'atc', process: options.process }, once: true }); } // 加购弹窗 renderShopModal_() { const renderData = this.getBannerRenderData(); this.triggerEvent_('showAddToCartModal', renderData); } showSuccessToast() { this.triggerEvent_('showAddToCartToast'); } updateSelectVariant = async(selectedVariant, product) => { const configData = await this.getConfig(); const productData = this.setSelectedOption(product); const selectedSkuText = this.getSelectedSkuText(); const renderData = { ...productData, selectedVariant, config: configData, selectedSkuText }; this.triggerEvent_('variantChange', renderData); const renderBannerData = this.getBannerRenderData(); if(renderBannerData.is_button_click_info && this.config.style_mobile === "mb_circle") { this.triggerEvent_('renderBannerClickInfo', renderBannerData); } } getUrlVariantId() { const urlParams = new URLSearchParams(window.location.search); const variantId = urlParams.get('variant'); return variantId; } // 商详页变体切换 djVariantChange(detail) { const product = this.getProductData(); // 是否为商详页当前商品 const isDetailProduct = product?.id === detail?.product?.id; if(!detail || !isDetailProduct) { return; } const selectVariant = detail.selected; // 更新变体id const variantId = selectVariant.id; const oldVariantId = this.variantId; if(variantId) { this.triggerEvent_('renderSelectedVariant'); if(oldVariantId !== variantId || !this.isFirstUpdateVariant) { this.isFirstUpdateVariant = true; this.variantId = variantId; this.updateSelectVariant(selectVariant, detail.product); } } else if(!variantId){ // 主题未选中变体 const isDisabledAtc = this.disabledAtc(); if(isDisabledAtc) { this.triggerEvent_('renderBannerNoSelectedVariant', { product: detail.product }); } } } // 不展示变体的模版 isHiddenVariantsTemplate() { return ((this.config.style_mobile === 'mb_circle' || this.config.style_mobile === 'mb_simple') && this.config.isMobile) || (this.config.style === 'simple' && !this.config.isMobile); } // 主题未选中变体 isUnSelectedThemeVariants() { // 不展示变体的模版 const formData = this.getThemeProductFormData(); return (formData && formData.hasOwnProperty('variant_id') && (!formData.variant_id || formData.variant_id === 'undefined')); } // 禁用加购 disabledAtc() { // 不展示变体的模版 const isHiddenVariantsTemplate = this.isHiddenVariantsTemplate(); const isUnSelectedThemeVariant = this.isUnSelectedThemeVariants(); return isHiddenVariantsTemplate && isUnSelectedThemeVariant; } // 滚动至主题变体处 scrollToThemeVariant() { const themeFormEl = this.getThemeProductInfoForm(); if(themeFormEl) { this.triggerEvent_('showUnSelectedVariantTips'); setTimeout(() => { themeFormEl.scrollIntoView({ behavior: 'smooth' }); }, 1000); } } async setupAction_() { // 上报处理 this.registerAction('saTrack', async(invocation) => { const data = invocation.args; // this.trackMap[data.type]?.(); }) // 更新variantId this.registerAction('updateVriantId', async(invocation) => { const data = invocation.args.data; if(data.variant_id && data.variant_id != 'undefined') { this.variantId = data.variant_id; } }) // 渲染弹窗加购&购买按钮 this.registerAction('renderShopModal', async(invocation) => { this.renderShopModal_(); }) this.registerAction('bannerExtraRender', async(invocation) => { const renderData = this.getBannerRenderData(); if(renderData.is_button_click_info && this.config.style_mobile === "mb_circle") { this.triggerEvent_('renderBannerClickInfo', renderData); } }) // 加购数量同步 this.registerAction('handleAddToCart', async(invocation) => { // 主题未选中变体 const isDisabledAtc = this.disabledAtc(); if(isDisabledAtc) { this.scrollToThemeVariant(); return; } const quantity = this.getThemeQuantity(); if(this.config.button_action === "checkout" ) { this.triggerEvent_('updateQty', { quantity: Number(quantity) || this.qty }); this.triggerEvent_('handleBuyNow'); } else { this.triggerEvent_('updateQty', { quantity: Number(quantity) || this.qty }); this.triggerEvent_('handleAtc'); } }) // 渲染弹窗加购&购买按钮 this.registerAction('handleFixedBanner', async(invocation) => { // 固定定位时, 触发ljs-sticky 组件showSticky方法,展示banner if(this.config.trigger_condition == 'fixed') { this.triggerEvent_('showBanner'); // this.trackAtcView(); } }) this.registerAction('handleVariantsRender', async(invocation) => { const data = invocation.args.data; // 主题未选中变体 const isDisabledAtc = this.disabledAtc(); if(isDisabledAtc) { this.triggerEvent_('renderBannerNoSelectedVariant', { product: data }); return; } this.triggerEvent_('renderSelectedVariant', { product: data }); this.triggerEvent_('variantChange', data); }) this.registerAction('handleShowErrorToast', async(invocation) => { const data = invocation.args.data; if(data?.message) { this.triggerEvent_('showAtcErrorToast', data); } }) } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${TAG}.${name}`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } } SPZ.defineElement(TAG, SpzCustomAddToCart)