لعبة تدريب تركيز الأطفال: عروض رمضان الخاصة متوفرة الآن 🌙🎮
عروض رمضان - دفع نقدي
${function() {
const variantData = data.variant || {"id":"12835a7d-1fee-4b46-8120-0b58d6bca1e8","product_id":"03fb63b9-ae15-4e67-80ce-d52c484dae50","title":"","weight_unit":"kg","inventory_quantity":0,"sku":"ZZL0126-01","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":95,"min_quantity":1}],"weight":"0.35","compare_at_price":"189","price":"95","retail_price":"189","available":true,"url":"\/products\/concentration-toys-discount?variant=12835a7d-1fee-4b46-8120-0b58d6bca1e8","available_quantity":999999999,"options":[],"off_ratio":50,"flashsale_info":[],"sales":2254};
const saveType = "percentage";
const productLabelDiscountOn = false;
return `
-
${saveType == 'percentage'
? `-${variantData.off_ratio}%`
: `- `
}
`;
}()}
أضف إلى السلة
﷼95.00
${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":"12835a7d-1fee-4b46-8120-0b58d6bca1e8","product_id":"03fb63b9-ae15-4e67-80ce-d52c484dae50","title":"","weight_unit":"kg","inventory_quantity":0,"sku":"ZZL0126-01","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":95,"min_quantity":1}],"weight":"0.35","compare_at_price":"189","price":"95","retail_price":"189","available":true,"url":"\/products\/concentration-toys-discount?variant=12835a7d-1fee-4b46-8120-0b58d6bca1e8","available_quantity":999999999,"options":[],"off_ratio":50,"flashsale_info":[],"sales":2254};
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 variantData = data.variant || {"id":"12835a7d-1fee-4b46-8120-0b58d6bca1e8","product_id":"03fb63b9-ae15-4e67-80ce-d52c484dae50","title":"","weight_unit":"kg","inventory_quantity":0,"sku":"ZZL0126-01","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":95,"min_quantity":1}],"weight":"0.35","compare_at_price":"189","price":"95","retail_price":"189","available":true,"url":"\/products\/concentration-toys-discount?variant=12835a7d-1fee-4b46-8120-0b58d6bca1e8","available_quantity":999999999,"options":[],"off_ratio":50,"flashsale_info":[],"sales":2254};
return `
وزن : ${variantData && variantData.weight}${variantData && variantData.weight_unit}
`
}()}
Enjoy shopping discounts🎁
Deliver the goods to you on time🚚
Support mainstream payment methods💵
Customer service provides 12-hour online service🤵🏻♀
The current produc does not participate any Rebate. Switch the participating product to check the design.
(This prompt will not be displayed on the client-side.)
${function() {
const show = rebate.format_rules.length > data.maxShowCount;
return `
${rule}
${function() {
if(!show) return "";
return `
`;
}()}
`;
}()}
${originData.rebate.format_rules.join(", ")}
if(window.self === window.top) {
(window.disabled_exts ||=[]).push('product_detail_rebate');
}
class SpzRebateComponent extends SPZ.BaseElement {
constructor(element) {
super(element);
}
xhr_ = SPZServices.xhrFor(this.win);
viewport_ = this.getViewport();
action_ = null;
lang = document.documentElement.lang || 'en-US';
i18n = {"ar-SA":{"special_offer":"عرض خاص","close":"إغلاق"},"de-DE":{"special_offer":"Sonderangebot","close":"Schließen"},"en-US":{"special_offer":"SPECIAL OFFER","close":"CLOSE"},"es-ES":{"special_offer":"Oferta especial","close":"Cerrar"},"fr-FR":{"special_offer":"Offre spéciale","close":"Fermer"},"id-ID":{"special_offer":"Penawaran istimewa","close":"Tutup"},"it-IT":{"special_offer":"Offerta speciale","close":"Chiudi"},"ja-JP":{"special_offer":"特別なオファー","close":"閉じる"},"ko-KR":{"special_offer":"특별 메뉴","close":"닫기"},"nl-NL":{"special_offer":"Speciale aanbieding","close":"sluiten"},"pl-PL":{"special_offer":"Oferta specjalna","close":"blisko"},"pt-PT":{"special_offer":"Oferta especial","close":"Fechar"},"ru-RU":{"special_offer":"Специальное предложение","close":"Закрыть"},"th-TH":{"special_offer":"ข้อเสนอพิเศษ","close":"ปิด"},"zh-CN":{"special_offer":"特价","close":"关闭"},"zh-TW":{"special_offer":"特價","close":"關閉"}};
landPage = "\/promotions\/rebate\/";
pageType = 1;
cart = [];
initData = null;
rebateInfo = null;
renderData = null;
footerImage = `${this.win.SHOPLAZZA["image_domain"]}oss/operation/e8ebb03dbb710457ca3b4b6a70898ab2.svg`;
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
buildCallback() {
this.initData = this.getProduct();
this.action_ = SPZServices.actionServiceForDoc(this.element);
this.registerAction("triggerGetRenderData", () => {
const event = SPZUtils.Event.create(this.win, "triggerGetRenderData", this.renderData);
this.action_.trigger(this.element, "getRenderData", event);
});
this.registerAction("bindPropagation", () => {
document.querySelector(".product_detail_rebate_list").addEventListener("click", e => {
e.stopPropagation();
this.win.sa &&
this.win.sa.track("plugin_rebate_promotion_click", {
plugin_timestamp: Date.now(),
plugin_location: "info",
product_id: this.initData.product.id,
discount_id: this.rebateInfo.discount_list.map((item) => item.discount_id)[0],
});
});
});
}
async mountCallback() {
document.addEventListener("dj.variantChange", e => {
const data = e.detail;
if (document.querySelector("#product-select-modal.show")) return;
if (this.initData && this.initData.product && data.product && this.initData.product.id === data.product.id) {
this.initData = data;
this.initRebate(this.initData, true);
} else {
this.initData = data;
this.getRebateInfo();
}
});
document.addEventListener("dj.addToCart", e => {
const v = e.detail;
this.rebateInfo &&
this.win.sa &&
this.win.sa.track("plugin_rebate_atc", {
variant_discount_id: this.getVariantDiscountId(v.variant_id).map(item => item.discount_id),
discount_ids: this.rebateInfo.discount_list.map(item => item.discount_id),
variant_id: v.variant_id,
product_id: v.product_id,
price: v.item_price,
number: v.number,
});
});
await this.getRebateInfo();
if (document.querySelector(".plugin-container__bottom-fixed")) {
this.showDiscountPopupsInfoBar();
} else {
this.win.addEventListener("extloaded", () => {
this.showDiscountPopupsInfoBar();
});
}
}
getProduct = (() => {
document.addEventListener("dj.variantChange", e => {
if (!e.detail || !e.detail.product) return;
const productJson = document.querySelector("#product-json");
if (productJson && productJson.textContent && JSON.parse(productJson.textContent)) {
productJson.textContent = JSON.stringify(e.detail);
}
if (this.win.jQuery && this.win.jQuery.fn && this.win.jQuery(document).data("djproduct")) {
this.win.jQuery(document).data("djproduct", e.detail);
}
});
return () => {
let productData = null;
if (this.win.jQuery && this.win.jQuery.fn) {
try {
let product = this.win.jQuery(document).data("djproduct");
if (product) {
productData = JSON.parse(JSON.stringify(product));
} else {
productData = null;
}
} catch (error) {
productData = null;
}
}
if (!productData) {
const productJson = document.querySelector("#product-json");
productData = (productJson && productJson.textContent && JSON.parse(productJson.textContent)) || null;
}
return productData;
};
})();
initRebate = this.win.SPZCore.Types.debounce(
this.win,
((data, variantChange) => {
let discount_list = Object.assign([], this.rebateInfo.discount_list);
/* 按子商品的多少对优惠信息进行排序 */
discount_list &&
discount_list.sort((a, b) => {
return b.variant_ids.length - a.variant_ids.length;
});
/* 选中子商品时 筛选子商品的优惠信息 */
if (data.selected && data.selected.id) {
discount_list = this.getVariantDiscountId(data.selected.id);
}
/* 无满减信息 */
if (!(discount_list && discount_list.length)) {
return;
}
const isSection = !!document.querySelector(
`div[data-section-type^="shoplazza://apps/publicapp/blocks/rebate"] #rebate_custom_component`
);
if (
(this.rebateInfo.rebate_type == "sku" && data && data.selected && data.selected.id) ||
this.rebateInfo.rebate_type == "spu"
) {
if (discount_list[0]) {
this.landPage += discount_list[0].discount_id || "";
}
const info = {
rebate: discount_list[0],
maxShowCount: this.win.innerWidth > 768 ? 3 : 1,
landPage: this.landPage,
modalFooterImg: `url(${`${this.win.SHOPLAZZA["image_domain"]}oss/operation/e8ebb03dbb710457ca3b4b6a70898ab2.svg`})`,
i18n: this.i18n[this.lang]
};
this.renderData = info;
SPZ.whenApiDefined(
document.getElementById(isSection ? "app_rebate_section" : "app_rebate_block")
).then(apis => {
apis.render(info, true);
});
}
this.insertSlideTag(this.rebateInfo.tag, variantChange);
var pluginCurrencyEvent = new CustomEvent("plugin_currency_update");
document.dispatchEvent(pluginCurrencyEvent);
}).bind(this),
10
);
getRebateInfo = async () => {
if (this.initData && this.initData.product && this.initData.product.id) {
var variant_ids = this.initData.product.variants.map(variant => variant.id);
const res = await this.xhr_.fetchJson(
"\/api\/discount-rebate\/product-discount",
{
method: "POST",
body: {
product_id: this.initData.product.id,
product_type: this.initData.product.product_type,
variant_ids: variant_ids,
},
}
);
if (!SPZCore.Types.isEmptyObject(res.rebate_info)) {
res.rebate_info.tag = res.tag;
res.rebate_info.rebate_type = res.rebate_type;
this.rebateInfo = res.rebate_info;
this.initRebate(this.initData);
} else {
if (this.win.top !== this.win.self) {
const noActivity = document.getElementById("no-rebate-activity");
noActivity && (noActivity["style"].display = "block");
}
}
}
};
getVariantDiscountId = (variant_id) => {
if (!variant_id || !this.rebateInfo) return [];
var rebateId = this.rebateInfo.variant_discount_map[variant_id];
return this.rebateInfo.discount_list.filter(item => item.discount_id == rebateId) || [];
};
insertSlideTag = (tag, variantChange) => {
setTimeout(() => {
if (tag) {
var tag_container;
var modal = document.getElementById("product-select-modal");
if (modal && modal.classList.contains("show")) {
if (!variantChange && modal.querySelector(".slider-discount-tag")) return;
if (
variantChange &&
modal.querySelector(".slider-discount-tag:not(.rebate-tag)")
)
return;
tag_container = modal;
} else {
var product_detail_card = document.querySelector(
'.page_container > [data-section-type="product_detail"], .page_container > [data-section-type="product-template"]'
);
if(!product_detail_card) return;
if (!variantChange && product_detail_card.querySelector(".slider-discount-tag")) return;
if (variantChange && product_detail_card.querySelector(".slider-discount-tag:not(.rebate-tag)"))
return;
tag_container = product_detail_card;
}
if (tag_container.matches("#product-select-modal") && this.pageType === 13 && document.documentElement.clientWidth < 768)
return;
const tagDom = `<div class="slider-discount-tag dj_skin_product_title rebate-tag">${tag}</div>`
if (document.querySelector(".sep-loaded-slider")) {
var loadedSlider = tag_container.querySelector(".sep-loaded-slider");
loadedSlider.querySelectorAll(".slider-discount-tag").forEach(function(element) {
element.remove();
});
loadedSlider.insertAdjacentHTML("beforeend", tagDom);
} else {
if (tag_container.querySelector(".support-slick")) {
var supportSlick = tag_container.querySelectorAll(".support-slick, .sep-slider");
supportSlick.forEach((element) => {
element.querySelectorAll(".slider-discount-tag").forEach((element) => {
element.remove();
});
element.insertAdjacentHTML("beforeend",tagDom);
});
} else {
var sepSlider = tag_container.querySelector(".sep-slider");
sepSlider.querySelectorAll(".slider-discount-tag").forEach(function(element) {
element.remove();
});
sepSlider.insertAdjacentHTML("beforeend",tagDom);
}
}
if (document.documentElement.clientWidth < 768) {
const sliderDiscountTagHeight = tag_container.querySelector(".slider-discount-tag").offsetHeight || 0;
document.querySelector(".product-image__swiper_bullets").style.bottom = `${sliderDiscountTagHeight + 15}px`;
}
}
}, 1000);
};
fetchInfoBar = () => {
let discount_ids = [];
if (this.pageType === 1) {
discount_ids = this.rebateInfo && this.rebateInfo.discount_list.map(item => item.discount_id);
} else if (this.pageType === 38) {
discount_ids = [this.win.rebateObj.rebateCollection_id] || [];
}
const productObj = this.getProduct();
return this.xhr_.fetchJson("\/api\/discount-rebate\/global-text", {
method: "POST",
body: {
product_type: productObj && productObj.product && productObj.product.product_type,
line_items: (this.cart.line_items || []).map(item => ({
variant_id: item.variant_id,
product_id: item.product_id,
quantity: item.quantity,
price: item.price,
selected: !item.unchecked,
})),
discount_ids: discount_ids,
},
});
};
renderBottomBanner = res => {
if (!res.tips) return;
if (document.querySelector(".discount__info-bar")) return;
var bar_style = `background:linear-gradient(90deg,${res.config.background_color_start},${res.config.background_color_end}); color:${res.config.color};`;
let data = { tips: res.tips, landPage: this.landPage + res.id, bar_style };
const html = SPZCore.Dom.htmlFor(this.element);
const banner = html([
`<a impr="1" imprevt="1" id="rebate_bottom_bar" href=${data.landPage} class="discount__info-bar text-truncate" data-activity-type="rebate" style="${data.bar_style}">${data.tips}</a>`,
]);
document.querySelector(".plugin-container__bottom-fixed").appendChild(banner);
const pluginCurrencyEvent = new CustomEvent("plugin_currency_update");
document.dispatchEvent(pluginCurrencyEvent);
if (res.id) {
var trackParams = {
page: this.pageType,
discount_id: res.id,
product_id: this.getProduct()?.product.id,
};
banner.addEventListener("click", () => {
this.win.sa &&
this.win.sa.track("plugin_rebate_promotion_click", {
plugin_timestamp: Date.now(),
plugin_location: "bottom_bar",
product_id: trackParams.product_id,
discount_id: trackParams.discount_id,
});
});
this.win.sa && this.win.sa.track("plugin_rebate_banner_pv", trackParams);
}
};
showDiscountPopupsInfoBar = () => {
if ([13, 14, 19, 30, 31].includes(this.pageType)) return;
if (document.querySelector(".plugin-container__bottom-fixed .discount__info-bar")) return;
this.fetchInfoBar().then(this.renderBottomBanner);
document.addEventListener("dj.cartChange", () => {
this.fetchInfoBar().then(this.renderBottomBanner);
});
};
}
SPZ.defineElement("spz-custom-rebate", SpzRebateComponent);
try {
const main = (coreEvent) => {
try {
const {
ecGlobalVarEnums,
getProduct,
getProductFormData,
getOrderFetchParams,
multiply,
removeChildrenDOM,
addChildrenDOM,
loadScript,
getAttributeConfig,
getBlockChannel,
ecEvent,
req,
containerDomId,
channel2ProviderEnums,
showChannelNotOpenTips,
channelEnums,
track,
isPreview,
getExtUrl
} = coreEvent.detail;
window.PaymentEC = {};
let ecConfig;
const shopCurrencyCode = "SAR";
let productDetail = getProduct();
let productPrice = productDetail?.selected?.price
|| 95;
const requiresShipping = productDetail?.product?.requires_shipping;
const expressCheckoutList = {
sdkErrorList: [],
paymentChannelList: [],
disabledChannelList: [],
showChannelList: [],
blockChannelList: [],
extraChannelList: [],
}
const moreButtonConfig = {
firstClick: true,
maxSize: isNaN(1) ? 1 : 1
}
const setBlockChannel = () => {
expressCheckoutList.blockChannelList = getBlockChannel();
track('setBlockChannel', expressCheckoutList);
}
const filterECButton = ({type, domID}) => {
const showChannelList = expressCheckoutList.paymentChannelList.filter((ecName) =>
!expressCheckoutList.sdkErrorList.includes(ecName) && !expressCheckoutList.disabledChannelList.includes(ecName) &&
!expressCheckoutList.extraChannelList.includes(ecName)) || [];
expressCheckoutList.showChannelList = showChannelList.filter((ecName) => ecName !== type) || [];
removeChildrenDOM(domID);
track('filterECButton', expressCheckoutList);
};
const showECButton = () => {
const showChannelList = expressCheckoutList.paymentChannelList.filter((ecName) =>
!expressCheckoutList.sdkErrorList.includes(ecName) && !expressCheckoutList.disabledChannelList.includes(ecName) &&
!expressCheckoutList.extraChannelList.includes(ecName)) || [];
expressCheckoutList.showChannelList = showChannelList;
track('showECButton', expressCheckoutList);
expressCheckoutList.showChannelList.forEach((ecName, index) => {
const disableShow = moreButtonConfig.firstClick && index >= moreButtonConfig.maxSize;
addChildrenDOM(containerDomId[channel2ProviderEnums[ecName]], !disableShow);
showMoreButton();
});
if (expressCheckoutList.showChannelList.length === 0) {
showMoreButton();
}
}
const disabledChannelListEvent = (checkoutData = {}) => {
expressCheckoutList.disabledChannelList = expressCheckoutList.paymentChannelList.filter(ecName => {
let mustDisable = false;
if (!requiresShipping && ecName !== channelEnums.PAYPAL) {
mustDisable = true;
}
if (!productDetail?.selected?.available) {
mustDisable = true;
}
const {payment_due} = checkoutData?.prices;
const paymentDueNum = Number(payment_due || 0) * 100;
const showFlag = paymentDueNum > 0;
if (mustDisable || !showFlag) {
filterECButton({type: ecName, domID: containerDomId[channel2ProviderEnums[ecName]]})
}
return mustDisable || !showFlag;
})
track('disabledChannelListEvent', expressCheckoutList);
}
const showMoreButton = () => {
const dom = document.getElementById('pm-payment-express-more-button-1539149753700-13');
if (!dom) {
return;
}
const showLength = expressCheckoutList.showChannelList.length;
const {firstClick, maxSize} = moreButtonConfig;
dom.style.display = (firstClick && showLength > 0 && showLength > maxSize) ? 'block' : 'none';
dom.onclick = moreButtonEvent;
}
const moreButtonEvent = () => {
const dom = document.getElementById('pm-payment-express-more-button-1539149753700-13');
if (!dom) {
return;
}
dom.style.display = 'none';
moreButtonConfig.firstClick = false;
showECButton();
}
const loadErrorEvent = (type) => {
if (!containerDomId[type]) {
return;
}
filterECButton({type: type, domID: containerDomId[type]});
expressCheckoutList.sdkErrorList.push(type);
showMoreButton();
};
const getECConfig = async () => {
if (window.PaymentEC?.settings) {
return window.PaymentEC?.settings;
}
const result = await req.get('/api/payment/settings');
ecConfig = result?.settings?.express_checkout_config || {};
expressCheckoutList.paymentChannelList = expressCheckoutList.blockChannelList.filter(ecName =>
ecConfig?.express_channels?.includes(ecName)) || [];
window.PaymentEC.settings = {...ecConfig, currencyCode: shopCurrencyCode};
return window.PaymentEC.settings;
}
async function renderEC(data = {}) {
ecConfig = await getECConfig();
track('renderEC', expressCheckoutList);
if (data?.detail?.selected?.price) {
productDetail = data?.detail;
productPrice = data?.detail?.selected?.price;
}
// 初始化时没有事件推送
const formData = getProductFormData(data?.detail || productDetail);
const totalPrice = multiply(productPrice, formData?.[0]?.quantity || 0);
if (ecConfig) {
const checkoutData = {
prices: {payment_due: totalPrice, subtotal_price: totalPrice},
orderParams: getOrderFetchParams(formData),
containerDOMIdEnums: containerDomId,
ecGlobalVarEnums
}
const notOpenChannel = expressCheckoutList.blockChannelList.filter(ecName =>
!expressCheckoutList.paymentChannelList.includes(ecName));
showChannelNotOpenTips(notOpenChannel);
disabledChannelListEvent(checkoutData);
showECButton();
window.PaymentEC.handleEcPluginsLoad = ({
channelInfos = [],
loadedCbFn = () => {
}
}) => {
const expressCheckoutLoadList = [];
channelInfos.map((channelInfo) => {
const {ecGlobalVar, ecName = '', sdkPath = '', datasets} = channelInfo;
if (!document.getElementById(containerDomId[ecName])) {
return;
}
const attributeConfig = getAttributeConfig(channelInfo) || {};
expressCheckoutLoadList.push(
loadScript(() => window[ecGlobalVar], ecGlobalVar, sdkPath, datasets, () => {
loadErrorEvent(ecName);
}, attributeConfig)
);
});
Promise.all(expressCheckoutLoadList).then(() => {
loadedCbFn(checkoutData);
});
};
// 通知外部数据变更
ecEvent.emit('tc_payment_ec_data_change', {
ecGlobalVarEnums,
containerDOMIdEnums: containerDomId
});
}
}
const extraFilterEvent = (e) => {
const {channel, domId, allowShow} = e?.detail || {};
if (channel && domId) {
if (allowShow) {
expressCheckoutList.extraChannelList = expressCheckoutList.extraChannelList.filter(ecName => ecName !== channel);
track('extraFilterEvent_show', expressCheckoutList);
showECButton();
} else {
expressCheckoutList.extraChannelList.push(channel);
filterECButton({type: channel, domID: domId});
track('extraFilterEvent_hide', expressCheckoutList);
showECButton();
}
}
}
const init = () => {
ecEvent.on('shoplazza_express_channels_change', extraFilterEvent, isPreview() ? {once: true} : false);
ecEvent.on('shoplazza_express_channels_change_ready', extraFilterEvent, isPreview() ? {once: true} : false);
document.addEventListener('dj.variantChange', renderEC);
renderEC();
}
const loadFilly = (tag) => {
if (!tag) {
return
}
const script = document.createElement('script');
script.type = 'text/javaScript';
script.src = `//static.staticdj.com/${tag}`;
script.onload = init;
document.getElementsByTagName('head')[0].appendChild(script);
}
const callback = () => {
const fillyTag = getExtUrl('filly');
if (fillyTag) {
setBlockChannel();
loadFilly(fillyTag);
}
}
const delayCallback = () => {
window.requestIdleCallback ? requestIdleCallback(callback, {timeout: 50}) : setTimeout(callback, 50);
}
if (document.readyState === 'complete') {
delayCallback();
return;
}
window.addEventListener('load', delayCallback, false);
} catch (e) {
console.error('payment-sdk-express-checkout:', e)
}
}
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-13');
containerDOM.addEventListener('paymentChannelList', main, false);
} catch (e) {
}
try {
const core = (coreEvent) => {
try {
const {isChrome, isSafari, isPreview, channelEnums} = coreEvent?.detail;
const {getPluginI18nMessages} = window?.payment_plugin_message || {};
/**
* 获取script标签自定义参数
* @param channelInfo 渠道信息
* @return {object|{}}
*/
const getAttributeConfig = (channelInfo) => {
const {ecGlobalVar, ecName} = channelInfo;
const config = {
paypal: {
'data-namespace': ecGlobalVar
}
};
return config[ecName] || {};
};
const getBlockChannel = () => {
const block_googlePay = false &&
"shoplazzagoogle";
const block_applePay = true &&
"shoplazzaapple";
const block_credit = false &&
"paypal";
const blockChannel = {
googlepay: isChrome() && block_googlePay,
applepay: isSafari() && block_applePay,
credit: block_credit
};
const sortList = ['credit', 'googlepay', 'applepay'];
const methodSort = Object.keys(blockChannel).filter(key => blockChannel[key] && key).sort((a, b) => {
const indexA = sortList.indexOf(a);
const indexB = sortList.indexOf(b);
return indexA - indexB;
}).map(key => blockChannel[key]);
return methodSort;
}
const showChannelNotOpenTips = (channelList) => {
const tipsDom = document.getElementById('pm-payment-express-error-tips-1539149753700-13');
if (!isPreview()) {
return;
}
if (!tipsDom) {
return;
}
tipsDom.style.display = channelList.length > 0 ? 'block' : 'none';
const channelName = {
[channelEnums.SHOPLAZZA_GOOGLE]: "ShoplazzaPayments - GooglePay",
[channelEnums.SHOPLAZZA_APPLE]: "ShoplazzaPayments - ApplePay",
[channelEnums.PAYPAL]: "PayPal",
}
channelList.forEach(ecName => {
const id = `pm-payment-express-error-tips-1539149753700-13-${ecName}`;
const hasDom = document.getElementById(id)
if (!hasDom) {
const dom = document.createElement('div');
dom.id = id;
dom.innerHTML = getPluginI18nMessages('ec.not_active_channel', {channelName: channelName[ecName]});
tipsDom.appendChild(dom);
}
})
}
const isAllowTheme = () => {
const allowThemeList = ['Nova 2023', 'Dropshiping', 'Geek', 'Wind', 'Flash'];
const currentTheme = window?.C_SETTINGS?.theme?.merchant_theme_name;
return allowThemeList.includes(currentTheme);
}
const disabledThemTips = () => {
const tipsDom = document.getElementById('pm-payment-express-error-tips-1539149753700-13');
if (!isPreview()) {
return;
}
if (!tipsDom) {
return;
}
tipsDom.style.display = 'block';
const id = 'pm-payment-express-error-tips-1539149753700-13-theme';
const hasDom = document.getElementById(id);
if (!hasDom) {
const dom = document.createElement('div');
dom.id = id;
dom.innerHTML = getPluginI18nMessages('ec.not_support_theme');
tipsDom.appendChild(dom);
}
}
const coreMethod = {
...coreEvent.detail,
getAttributeConfig,
getBlockChannel,
showChannelNotOpenTips,
isAllowTheme,
disabledThemTips
};
if (!isAllowTheme()) {
disabledThemTips();
} else {
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-13');
const moreButtonDOM = document.getElementById('pm-payment-express-more-button-1539149753700-13');
moreButtonDOM.innerHTML = getPluginI18nMessages('ec.more_button');
containerDOM.dispatchEvent(new CustomEvent('paymentChannelList', {detail: coreMethod}));
}
} catch (e) {
}
}
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-13');
containerDOM.addEventListener('Payment_EC_Core_first', core, false);
} catch (e) {
}
try {
const core = () => {
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-13');
if (containerDOM?.getPluginI18nMessages && !window?.payment_plugin_message?.getPluginI18nMessages) {
return;
}
containerDOM.getPluginI18nMessages = window?.payment_plugin_message?.getPluginI18nMessages
try {
const domIDSuffix = '-express-button-container';
const prefix = 'pm-';
const ecGlobalVarEnums = {
paypal: 'pluginPaypalEC'
};
const providerEnums = {
SHOPLAZZA: 'shoplazza',
STRIPE: 'stripe',
PAYPAL: 'paypal'
};
const channelEnums = {
SHOPLAZZA_GOOGLE: 'shoplazzagoogle',
SHOPLAZZA_APPLE: 'shoplazzaapple',
PAYPAL: 'paypal'
}
const containerDomId = {
paypal: `${prefix}${providerEnums.PAYPAL}${domIDSuffix}-1539149753700-13`,
stripe: `${prefix}${providerEnums.STRIPE}${domIDSuffix}-1539149753700-13`,
shoplazza: `${prefix}${providerEnums.SHOPLAZZA}${domIDSuffix}-1539149753700-13`,
};
const channel2ProviderEnums = {
[channelEnums.PAYPAL]: providerEnums.PAYPAL,
[channelEnums.SHOPLAZZA_GOOGLE]: providerEnums.SHOPLAZZA,
[channelEnums.SHOPLAZZA_APPLE]: providerEnums.SHOPLAZZA,
stripegoogle: providerEnums.STRIPE,
stripeapple: providerEnums.STRIPE,
};
const getProduct = () => {
const productJson = document.querySelector('#product-json');
if (productJson?.textContent) {
return JSON.parse(productJson.textContent);
}
if (window.jQuery) {
const $product = window.jQuery?.(document)?.data('djproduct');
const productData = JSON.parse(JSON.stringify($product || {}));
return productData || {};
}
return {};
};
const isChrome = () => {
return navigator?.userAgent?.indexOf('Chrome') > -1 || navigator?.userAgent?.indexOf('CriOS') > -1;
};
const isSafari = () => {
let userAgentString = navigator.userAgent;
let chromeAgent = userAgentString.indexOf('Chrome') > -1 || navigator?.userAgent?.indexOf('CriOS') > -1;
let safariAgent = userAgentString.indexOf('Safari') > -1;
if (chromeAgent && safariAgent) {
safariAgent = false;
}
return safariAgent;
};
const isPreview = () => {
return !!window?.C_EDITING_SETTINGS?.oseid;
}
const getProductFormData = (data) => {
const product_id = data?.product_id || data?.product?.id;
const variant_id = data?.variant_id || data?.variant?.id || data?.selected?.id;
const quantity = data?.quantity || 1;
return [{
product_id,
variant_id,
quantity
}];
}
const getOrderFetchParams = (data) => {
if (!data) {
return {};
}
return {
line_items: data.map((item) => ({
note: '',
quantity: item.quantity || 1,
product_id: item?.product_id,
variant_id: item?.variant_id,
properties: item?.properties,
})),
refer_info: {
source: 'buy_now',
},
customer_note: '',
};
}
const multiply = (a, b) => {
const precision = 2; // 保留两位小数
return Number((a * b).toFixed(precision));
}
/**
* 移除EC节点
* @param id EC容器-div的id
*/
const removeChildrenDOM = (id) => {
if (!id) {
return;
}
const paymentEl = document.querySelector(`#pm-payment-express-button-container-1539149753700-13`);
const childrenEL = document.getElementById(id);
if (paymentEl && childrenEL) {
// childrenEL.remove();
childrenEL.style.display = 'none';
}
};
const addChildrenDOM = (id, allowShow) => {
if (!id) {
return;
}
const paymentEl = document.querySelector(`#pm-payment-express-button-container-1539149753700-13`);
const childrenEL = document.getElementById(id);
if (paymentEl && childrenEL) {
childrenEL.style.display = allowShow ? 'block' : 'none';
return;
}
if (paymentEl && !childrenEL) {
const dom = document.createElement('div');
dom.id = id;
dom.style.display = allowShow ? 'block' : 'none';
paymentEl.appendChild(dom);
}
}
const loadScript = (fnReady, id, src, datasets, onError, attributeConfig = {}) => {
const sdkDomId = id + '-sdk';
if (fnReady() || document.getElementById(sdkDomId)) {
return Promise.resolve({id: true});
}
return new Promise((resolve) => {
const s = document.createElement('script');
s.id = sdkDomId;
s.src = src;
s.defer = true;
if (datasets) {
Object.keys(datasets).map((item) => {
s.dataset[item] = datasets[item];
});
}
s.onload = function () {
window.dispatchEvent(new CustomEvent(`${id}-loaded`));
resolve({id: true});
};
s.onerror = function () {
resolve({id: false});
onError && onError();
};
Object.keys(attributeConfig).forEach((key) => {
s.setAttribute(key, attributeConfig[key]);
});
document.head.appendChild(s);
});
};
const track = (eventName, data) => {
window.sa && window?.sa?.track('pm_' + eventName, data);
}
const eventListeners = {};
const ecEvent = {
on: (eventName, listener, useCapture) => {
eventListeners[eventName] = listener;
window.addEventListener(eventName, listener, useCapture);
},
emit: (eventName, data) => window.dispatchEvent(new CustomEvent(eventName, {detail: data})),
};
const req = {
ROOT_URL: (C_SETTINGS && C_SETTINGS.routes && C_SETTINGS.routes.root) || '',
post: async (url, data = {}) => {
try {
const response = await fetch(req.ROOT_URL + url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
...data,
body: JSON.stringify(data.body),
});
const result = await response.json();
return result
} catch (error) {
throw new Error('post request error' + error);
}
},
get: async (url, data = {}) => {
try {
const response = await fetch(req.ROOT_URL + url);
const result = await response.json();
return result
} catch (error) {
throw new Error('get request error' + error);
}
}
};
const getExtUrl = (name) => {
const url = document.cookie.match(new RegExp('\\b' + name.replace(/_/g, '-') + '-(v[s0-9]+)'));
if (url && url[1]) {
return `${name}.${url[1]}.js`;
} else {
return window?.exts?.filly;
}
}
const coreMethod = {
domIDSuffix,
prefix,
ecGlobalVarEnums,
providerEnums,
channelEnums,
containerDomId,
channel2ProviderEnums,
getProduct,
isChrome,
isSafari,
isPreview,
getProductFormData,
getOrderFetchParams,
multiply,
removeChildrenDOM,
addChildrenDOM,
loadScript,
track,
eventListeners,
ecEvent,
req,
getExtUrl
}
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-13');
if (containerDOM) {
containerDOM.dispatchEvent(new CustomEvent('Payment_EC_Core_first', {detail: coreMethod}));
}
} catch (e) {
}
}
document.addEventListener('payment_plugin_message_reader', core, {once: true});
} catch (e) {
}
const getPluginI18nMessages = (message, replaceObj = {}) => {
const lang = document.documentElement.lang || "en-US";
const [form, key] = message.split('.')
let text = window.payment_plugin_message['en-US'][form][key];
if (window.payment_plugin_message[lang][form].hasOwnProperty(key)) {
text = window.payment_plugin_message[lang][form][key];
}
Object.keys(replaceObj).forEach(key => {
text = text.replace(new RegExp(`\{${key}\}`, 'gi'), replaceObj[key]);
})
return text;
}
const zhCN = {
ec: {
not_active_channel: "请到收款设置中{channelName}或在「快捷支付按钮」设置中选择其他的服务提供方,否则按钮将无法展示",
not_support_theme: "当前主题不支持添加「快捷支付按钮」",
more_button: "更多支付方式",
}
};
const zhTW = {
ec: {
not_active_channel: "请到收款设置中{channelName}或在「快捷支付按钮」设置中选择其他的服务提供方,否则按钮将无法展示",
not_support_theme: "当前主题不支持添加「快捷支付按钮」",
more_button: "更多付款方式",
}
};
const arSA = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "المزيد من خيارات الدفع",
}
};
const deDE = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Weitere Bezahlmöglichkeiten",
}
};
const esES = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Más opciones de pago",
}
};
const frFR = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Plus d'options de paiement",
}
};
const idID = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Opsi pembayaran lainnya",
}
};
const itIT = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Altre opzioni di pagamento",
}
};
const jaJP = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "その他の支払いオプション",
}
};
const koKR = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "더 많은 결제 옵션",
}
};
const enUS = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "More payment options",
}
};
const nlNL = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Meer betalingsmogelijkheden",
}
};
const plPL = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Więcej Opcji Płatności",
}
};
const ptPT = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Mais opções de pagamento",
}
};
const ruRU = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Другие варианты оплаты",
}
};
const thTH = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "ตัวเลือกการชำระเงินเพิ่มเติม",
}
};
window.payment_plugin_message = {
getPluginI18nMessages,
"zh-CN": zhCN,
"zh-TW": zhTW,
"ar-SA": arSA,
"de-DE": deDE,
"es-ES": esES,
"fr-FR": frFR,
"id-ID": idID,
"it-IT": itIT,
"ja-JP": jaJP,
"ko-KR": koKR,
"en-US": enUS,
"nl-NL": nlNL,
"pl-PL": plPL,
"pt-PT": ptPT,
"ru-RU": ruRU,
"th-TH": thTH,
}
document.dispatchEvent(new CustomEvent('payment_plugin_message_reader'));
${function() {
const postageFreeAmount = 200;
const custom_text = "Buy {amount} more to enjoy FREE Shipping";
const totalPrice = +data.total_price;
const diffPrice = postageFreeAmount - totalPrice;
const percentDiff = (diffPrice > 0 ? (totalPrice / postageFreeAmount * 100) : 100) + '%';
let tipText = "\u062a\u0648\u0635\u064a\u0644 \u0645\u062c\u0627\u0646\u064a";
if (diffPrice > 0) {
tipText = custom_text.replace('{amount}', `
`);
}
return `
`;
}()}