feat(shop): wire storefront buy path to server cart
Connect product options/add-cart, server cart checkout payloads, favorite/rebuy/receipt REST, and order-center actions without localStorage dual-read or hardcoded cart/orders URL hacks.
This commit is contained in:
1 parent
2ed3ffe317
commit
50e3db85bb
6 files changed
+621
-304
No files matched your search
@@ -46,19 +46,27 @@
|
||||
}
|
||||
|
||||
/* ── REST helper ── */
|
||||
function request(path, body) {
|
||||
return fetch("/wp-json/aksrt/v1" + path, {
|
||||
method: "POST",
|
||||
function restRoot() {
|
||||
return ((aksrtData.siteUrl || "").replace(/\/$/, "")) + "/wp-json/aksrt/v1";
|
||||
}
|
||||
|
||||
function request(path, body, method) {
|
||||
return fetch(restRoot() + path, {
|
||||
method: method || "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"X-WP-Nonce": aksrtData.restNonce
|
||||
},
|
||||
body: JSON.stringify(body || {})
|
||||
body: body === undefined ? undefined : JSON.stringify(body || {})
|
||||
}).then(function (response) {
|
||||
return response.json();
|
||||
});
|
||||
}
|
||||
|
||||
function cartUrl() {
|
||||
return aksrtData.cartUrl || (aksrtData.routes && aksrtData.routes.cart) || "/";
|
||||
}
|
||||
|
||||
/* ── 扫码支付弹层(微信 Native code_url 等)── */
|
||||
function showPaymentQr(content, orderNumber) {
|
||||
var existing = document.getElementById("aksrt-pay-qr-overlay");
|
||||
@@ -118,12 +126,12 @@
|
||||
|
||||
function updateCardStatus(card, newStatus, statusLabel) {
|
||||
if (!card) return;
|
||||
var badge = card.querySelector(".aksrt-orders-page__item-badge");
|
||||
var badge = card.querySelector(".aksrt-orders-page__card-status, .aksrt-orders-page__item-badge");
|
||||
if (badge) {
|
||||
badge.textContent = statusLabel || newStatus;
|
||||
}
|
||||
// Hide action buttons that are no longer relevant
|
||||
var actions = card.querySelectorAll("[data-aksrt-order-pay], [data-aksrt-order-cancel], [data-aksrt-order-after-sale]");
|
||||
var actions = card.querySelectorAll("[data-aksrt-order-pay], [data-aksrt-order-cancel], [data-aksrt-order-after-sale], [data-aksrt-order-receipt], [data-aksrt-order-rebuy]");
|
||||
for (var i = 0; i < actions.length; i++) {
|
||||
actions[i].style.display = "none";
|
||||
}
|
||||
@@ -216,6 +224,75 @@
|
||||
|
||||
/* ── Event delegation ── */
|
||||
page.addEventListener("click", function (event) {
|
||||
// Timeline toggle
|
||||
var timelineToggle = event.target.closest("[data-aksrt-toggle-timeline]");
|
||||
if (timelineToggle) {
|
||||
var timeline = timelineToggle.closest("[data-aksrt-timeline]");
|
||||
var body = timeline ? timeline.querySelector(".aksrt-orders-page__timeline-body") : null;
|
||||
if (body) body.hidden = !body.hidden;
|
||||
return;
|
||||
}
|
||||
|
||||
// Confirm receipt
|
||||
var receiptBtn = event.target.closest("[data-aksrt-order-receipt]");
|
||||
if (receiptBtn) {
|
||||
var receiptOrder = receiptBtn.getAttribute("data-aksrt-order-receipt");
|
||||
if (!receiptOrder) return;
|
||||
if (!window.confirm("确认已收到货物?")) return;
|
||||
receiptBtn.disabled = true;
|
||||
request("/shop/frontend/orders/" + receiptOrder + "/confirm-receipt", {})
|
||||
.then(function (result) {
|
||||
receiptBtn.disabled = false;
|
||||
if (!result || !result.success) {
|
||||
showToast((result && result.message) || "确认收货失败");
|
||||
return;
|
||||
}
|
||||
showToast("已确认收货");
|
||||
updateCardStatus(findOrderCard(receiptOrder), "completed", "已完成");
|
||||
})
|
||||
.catch(function () {
|
||||
receiptBtn.disabled = false;
|
||||
showToast("网络错误");
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Rebuy
|
||||
var rebuyBtn = event.target.closest("[data-aksrt-order-rebuy]");
|
||||
if (rebuyBtn) {
|
||||
var rebuyOrder = rebuyBtn.getAttribute("data-aksrt-order-rebuy");
|
||||
if (!rebuyOrder) return;
|
||||
rebuyBtn.disabled = true;
|
||||
request("/shop/frontend/orders/" + rebuyOrder + "/rebuy", {})
|
||||
.then(function (result) {
|
||||
rebuyBtn.disabled = false;
|
||||
if (!result || !result.success) {
|
||||
showToast((result && result.message) || "再次购买失败");
|
||||
return;
|
||||
}
|
||||
showToast("已加入购物车");
|
||||
window.location.href = cartUrl();
|
||||
})
|
||||
.catch(function () {
|
||||
rebuyBtn.disabled = false;
|
||||
showToast("网络错误");
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Review — jump to product if possible
|
||||
var reviewBtn = event.target.closest("[data-aksrt-order-review]");
|
||||
if (reviewBtn) {
|
||||
var card = reviewBtn.closest("[data-aksrt-order-card]");
|
||||
var productLink = card ? card.querySelector("a[href*='product']") : null;
|
||||
if (productLink && productLink.href) {
|
||||
window.location.href = productLink.href + (productLink.href.indexOf("#") >= 0 ? "" : "#reviews");
|
||||
} else {
|
||||
showToast("请到商品详情页评价");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Pay
|
||||
var payButton = event.target.closest("[data-aksrt-order-pay]");
|
||||
if (payButton) {
|
||||
|
||||
Reference in new issue
Block a user