feat(mall): live points mall with address-aware redemption

The points page loads the published catalog and the customer's live points
through the shared client, redeems with a chosen saved address, refreshes the
balance, and lists the customer's redemption history with its fulfilment state.
The INTEGRAL_PRODUCTS and USER_STATS imports leave the page; the fixed-data
adapter still serves the points domain as the rollback path.
This commit is contained in:
2026-09-18 12:43:00 +00:00
parent 9c2b705880
commit 059572f6f3
2 changed files with 244 additions and 25 deletions
+36
View File
@@ -37,6 +37,24 @@ export default {
login: "Sign in",
register: "Create account",
noIntegralProducts: "No rewards available right now.",
addressLabel: "Ship to",
noAddress: "No saved address.",
addAddress: "Add one in your account",
addressRequired: "Add a shipping address before redeeming.",
qty: "Qty",
redeemSuccess: "Redeemed as {no}.",
redeemConflict: "Unable to redeem: not enough points or stock.",
redeemFailed: "Unable to redeem right now.",
redemptionHistory: "My redemptions",
orderNo: "Order no.",
reward: "Reward",
pointsCost: "Points",
createdAt: "Date",
redemptionStatus: {
pending_fulfillment: "Pending",
fulfilled: "Fulfilled",
cancelled: "Cancelled",
},
},
},
zh: {
@@ -77,6 +95,24 @@ export default {
login: "登录",
register: "注册",
noIntegralProducts: "当前暂无积分商品。",
addressLabel: "收货地址",
noAddress: "暂无收货地址。",
addAddress: "前往账户添加",
addressRequired: "请先添加收货地址。",
qty: "数量",
redeemSuccess: "兑换成功,订单号 {no}。",
redeemConflict: "兑换失败:积分或库存不足。",
redeemFailed: "兑换失败,请稍后重试。",
redemptionHistory: "我的兑换",
orderNo: "订单号",
reward: "兑换商品",
pointsCost: "积分",
createdAt: "日期",
redemptionStatus: {
pending_fulfillment: "待发货",
fulfilled: "已发货",
cancelled: "已取消",
},
},
},
} as const;