fix: improve h5 payment return flow
This commit is contained in:
@@ -10,6 +10,7 @@ const orders = ref<OrderListItem[]>([]);
|
||||
const privacyMode = ref(getPrivacyMode());
|
||||
const orderHeroBackground = ref("");
|
||||
const defaultOrderHeroBackground = "/static/order/order-reference.jpg";
|
||||
let orderRefreshTicket = 0;
|
||||
|
||||
const orderHeroStyle = computed(() => ({
|
||||
backgroundImage: `url("${orderHeroBackground.value || defaultOrderHeroBackground}")`,
|
||||
@@ -67,17 +68,59 @@ async function fetchPageVisuals() {
|
||||
}
|
||||
}
|
||||
|
||||
function shouldSyncPaymentStatus(item: OrderListItem) {
|
||||
return item.order_status === "pending_payment" && item.payment_status !== "paid";
|
||||
}
|
||||
|
||||
async function syncPendingPaymentOrders(list: OrderListItem[]) {
|
||||
const pendingOrders = list.filter(shouldSyncPaymentStatus);
|
||||
if (!pendingOrders.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const results = await Promise.all(
|
||||
pendingOrders.map(async (item) => {
|
||||
try {
|
||||
const data = await appApi.getOrderPaymentStatus(item.order_id);
|
||||
return data.order_status !== item.order_status
|
||||
|| data.payment_status !== item.payment_status
|
||||
|| data.display_status !== item.display_status;
|
||||
} catch (error) {
|
||||
console.warn("order payment status sync skipped", error);
|
||||
return false;
|
||||
}
|
||||
}),
|
||||
);
|
||||
|
||||
return results.some(Boolean);
|
||||
}
|
||||
|
||||
async function refreshOrdersWithPaymentSync() {
|
||||
const ticket = ++orderRefreshTicket;
|
||||
const data = await appApi.getOrders();
|
||||
if (ticket !== orderRefreshTicket) return;
|
||||
|
||||
orders.value = data.list;
|
||||
const needsRefresh = await syncPendingPaymentOrders(data.list);
|
||||
if (!needsRefresh || ticket !== orderRefreshTicket) return;
|
||||
|
||||
const refreshed = await appApi.getOrders();
|
||||
if (ticket === orderRefreshTicket) {
|
||||
orders.value = refreshed.list;
|
||||
}
|
||||
}
|
||||
|
||||
onShow(async () => {
|
||||
privacyMode.value = getPrivacyMode();
|
||||
void fetchPageVisuals();
|
||||
if (!isLoggedIn()) {
|
||||
orderRefreshTicket += 1;
|
||||
orders.value = [];
|
||||
redirectToLogin("/pages/order/index");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const data = await appApi.getOrders();
|
||||
orders.value = data.list;
|
||||
await refreshOrdersWithPaymentSync();
|
||||
} catch (error) {
|
||||
orders.value = [];
|
||||
showErrorToast(error, "订单加载失败");
|
||||
|
||||
Reference in New Issue
Block a user