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:
kate522 committed 2026-07-12 09:15:45 +08:00
1 parent 2ed3ffe317
commit 50e3db85bb
6 files changed
+621 -304

No files matched your search

+83 -6
View File
@@ -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) {