From 90c998f06d0e9edb2299b829448828c062025fc0 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Tue, 17 Mar 2026 13:57:44 +0800 Subject: [PATCH] feat: Introduce account center with subscription management and contract-based payment integration. --- frontend/components/account/AccountCenter.tsx | 62 ++++++++++++++++--- src/payments/contract_checkout.py | 1 + 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/frontend/components/account/AccountCenter.tsx b/frontend/components/account/AccountCenter.tsx index a9cd4b0f..ac3590ac 100644 --- a/frontend/components/account/AccountCenter.tsx +++ b/frontend/components/account/AccountCenter.tsx @@ -764,12 +764,42 @@ export function AccountCenter() { const walletsJson = (await walletsRes.json()) as { wallets?: BoundWallet[]; }; - const wallets = Array.isArray(walletsJson.wallets) - ? walletsJson.wallets - : []; + const wallets = ( + Array.isArray(walletsJson.wallets) ? walletsJson.wallets : [] + ) + .filter((row) => { + const status = String(row?.status || "active").toLowerCase(); + const address = String(row?.address || ""); + return status === "active" && address.startsWith("0x"); + }) + .map((row) => ({ + ...row, + address: String(row.address || "").toLowerCase(), + })); setBoundWallets(wallets); - if (wallets.length && !selectedWallet) - setSelectedWallet(wallets[0].address); + if (wallets.length) { + const currentSelected = String(selectedWallet || "").toLowerCase(); + const hasCurrent = wallets.some( + (row) => String(row.address || "").toLowerCase() === currentSelected, + ); + const fallback = + wallets.find((row) => Boolean(row.is_primary))?.address || + wallets[0].address; + if (!currentSelected || !hasCurrent) { + setSelectedWallet(fallback); + } + const currentWalletAddress = String(walletAddress || "").toLowerCase(); + const hasWalletAddress = wallets.some( + (row) => + String(row.address || "").toLowerCase() === currentWalletAddress, + ); + if (!currentWalletAddress || !hasWalletAddress) { + setWalletAddress(fallback); + } + } else { + setSelectedWallet(""); + setWalletAddress(""); + } } } catch { // ignore @@ -779,6 +809,7 @@ export function AccountCenter() { buildAuthedHeaders, selectedPlanCode, selectedWallet, + walletAddress, ]); const loadSnapshot = useCallback(async () => { @@ -1302,12 +1333,19 @@ export function AccountCenter() { data = {}; } const newPrimary = String(data?.new_primary || "").toLowerCase(); - if (selectedWallet === target) { + const selectedWalletNorm = String(selectedWallet || "").toLowerCase(); + const walletAddressNorm = String(walletAddress || "").toLowerCase(); + if (selectedWalletNorm === target) { setSelectedWallet(newPrimary || ""); } - if (walletAddress === target) { + if (walletAddressNorm === target) { setWalletAddress(newPrimary || ""); } + setBoundWallets((prev) => + prev.filter( + (row) => String(row.address || "").toLowerCase() !== String(target), + ), + ); await loadPaymentSnapshot(); setPaymentInfo( newPrimary @@ -1899,6 +1937,16 @@ export function AccountCenter() {
diff --git a/src/payments/contract_checkout.py b/src/payments/contract_checkout.py index badf9396..d1faed5e 100644 --- a/src/payments/contract_checkout.py +++ b/src/payments/contract_checkout.py @@ -918,6 +918,7 @@ class PaymentContractCheckoutService: "select": "chain_id,address,status,is_primary,verified_at", "user_id": f"eq.{user_id}", "chain_id": f"eq.{self.chain_id}", + "status": "eq.active", "order": "is_primary.desc,verified_at.desc", }, allowed_status=[200],