feat(client): 购买页三档 + 支付页 render_type 多态(crypto/redirect/qr 预留)+ 导航接线

购买页三档 pro(月/季/年,金额来自 GET /v1/pay/catalog)选档 → 选支付方式 → 下单;
支付页按 session.render_type 多态渲染(crypto_address 地址+精确金额+复制、redirect
外链拉起、qr 预留复制兜底),轮询用 Task 6 的 paymentFlowProvider,409
CURRENCY_MISMATCH 走「换方式开新单」。同时收口 paymentFlowProvider 非 autoDispose
带来的轮询生命周期缺口——支付页 dispose 时停轮询(cancel() 延后到微任务执行,避免
在自身 unmount 期间同步改 state 炸 Riverpod 断言)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
This commit is contained in:
wangjia
2026-07-10 23:50:35 +08:00
parent e66f79fdf6
commit a5fff28134
15 changed files with 783 additions and 14 deletions
+55
View File
@@ -332,4 +332,59 @@ class StringsEn extends AppText {
String get ob3Title => 'Private by design';
@override
String get ob3Sub => 'End-to-end encrypted. We keep zero browsing logs.';
@override
String get purchaseTitle => 'Purchase';
@override
String get paymentTitle => 'Payment';
@override
String get buyNow => 'Buy now';
@override
String get payMethodAlipay => 'Alipay';
@override
String get payMethodCrypto => 'USDT (TRC20)';
@override
String get choosePayMethod => 'Choose payment method';
@override
String get proMonthly => 'Pro · Monthly';
@override
String get proQuarterly => 'Pro · Quarterly';
@override
String get proYearly => 'Pro · Yearly';
@override
String get perQuarter => '/quarter';
@override
String get perYear => '/year';
@override
String get payAmountLabel => 'Amount';
@override
String get payAddressLabel => 'Address';
@override
String get payNetworkLabel => 'Network';
@override
String get payExactAmountHint => 'Send the exact amount; activates automatically';
@override
String get copied => 'Copied';
@override
String get openAlipay => 'Pay with Alipay';
@override
String get openAlipayHint => 'Return after paying; this page refreshes automatically';
@override
String get awaitingPayment => 'Awaiting payment';
@override
String get paySucceeded => 'Activated';
@override
String get payExpiresAt => 'Valid until';
@override
String get payDone => 'Done';
@override
String get payFailed => 'Payment failed';
@override
String get payRetry => 'Retry';
@override
String get switchPayMethod => 'Switch payment method';
@override
String get cancelOrder => 'Cancel order';
@override
String get qrNotSupported => 'Copy and open in Alipay';
}