From 66422f92ce44d1de3bfc9d30a2445b6bee84dd51 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Mon, 13 Jul 2026 11:43:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(client):=20created=20=E5=8D=95=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E8=A1=A5=E3=80=8C=E5=8F=96=E6=B6=88=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E3=80=8D=E6=8C=89=E9=92=AE(=E5=8E=9F=E5=9E=8B=20pending=20?= =?UTF-8?q?=E5=8F=8C=E6=8C=89=E9=92=AE=E6=97=A9=E6=9C=89=E8=A7=84=E6=A0=BC?= =?UTF-8?q?,=E4=BB=A3=E7=A0=81=E6=BC=8F)+=20=E8=87=AA=E5=8A=A8=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=20toast=203s=E2=86=921.5s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - orders 详情 created 态:继续支付(主)+ 取消订单(ghost)——orders.html/ui-desktop 原型 pending 态早已登记双按钮,Flutter 侧漏实现(代码落后原型)。取消走远程 cancel, 失败(如其实已付,pay 409)不报错,统一 invalidate 刷新以最新状态为准。 - 自动连接「正在自动连接到 X」toast 缺省 3s 用户反馈偏长 → 1.5s(与「已复制」1.4s 同量级)。 Co-Authored-By: Claude Opus 4.8 (1M context) --- client/lib/main.dart | 6 +++++- client/lib/screens/orders_page.dart | 17 +++++++++++++++++ client/test/widget/orders_page_test.dart | 3 ++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/client/lib/main.dart b/client/lib/main.dart index 3262114..16fdc16 100644 --- a/client/lib/main.dart +++ b/client/lib/main.dart @@ -229,8 +229,12 @@ class _RootFlowState extends ConsumerState { logLine('AutoConnect', 'triggering connect → ${node.code}'); ref.read(connectionProvider.notifier).toggle(); // 自动连接 toast:「正在自动连接到 X」(主显示区内居中,见 pangolin_toast)。 + // 瞬态信息,1.5s 即可(默认 3s 用户反馈偏长;与「已复制」1.4s 同量级)。 final t = ref.read(appTextProvider); - if (mounted) showPangolinToast(context, t.autoConnectingTo(node.localizedName(t.lang))); + if (mounted) { + showPangolinToast(context, t.autoConnectingTo(node.localizedName(t.lang)), + duration: const Duration(milliseconds: 1500)); + } } else { logLine('AutoConnect', 'NOT connecting (autoConnect=${settings.autoConnect} phase=$phase)'); } diff --git a/client/lib/screens/orders_page.dart b/client/lib/screens/orders_page.dart index 351fbd9..f6fa9ce 100644 --- a/client/lib/screens/orders_page.dart +++ b/client/lib/screens/orders_page.dart @@ -275,6 +275,17 @@ class _OrderDetailView extends ConsumerWidget { } } + // 「取消订单」(created 单详情)——远程 cancel 后刷新列表/详情;失败(如已支付, + // pay 回 409)不报错,同样走刷新,以最新状态为准(已付单会显示已开通)。 + Future _cancelOrder(BuildContext context, WidgetRef ref) async { + try { + await ref.read(paymentApiProvider).cancel(order.orderNo); + } catch (_) {} + if (!context.mounted) return; + ref.invalidate(ordersProvider); + ref.invalidate(orderDetailProvider(order.orderNo)); + } + Future _copy(BuildContext context, String text) async { await Clipboard.setData(ClipboardData(text: text)); if (context.mounted) { @@ -346,6 +357,12 @@ class _OrderDetailView extends ConsumerWidget { switch (o.status) { case 'created': list.add(PangolinButton(label: t.orderContinuePay, expand: true, onPressed: () => _resumePay(context, ref))); + // 原型 pending 态为双按钮:继续支付(主)+ 取消订单(ghost)——orders.html/ui-desktop 均已登记。 + list.add(PangolinButton( + label: t.cancelOrder, + variant: PangolinButtonVariant.ghost, + expand: true, + onPressed: () => _cancelOrder(context, ref))); // 过期单 pay 会话已失效,点击是重新下单而非续付 → 用「重新购买」避免歧义。 case 'expired': case 'canceled': diff --git a/client/test/widget/orders_page_test.dart b/client/test/widget/orders_page_test.dart index f9a036a..5a9f152 100644 --- a/client/test/widget/orders_page_test.dart +++ b/client/test/widget/orders_page_test.dart @@ -78,7 +78,8 @@ void main() { // 点 created 那单(月付)进详情 await tester.tap(find.text(t.proMonthly)); await tester.pumpAndSettle(); - // 详情字段行 + created 态动作「继续支付」 + // 详情字段行 + created 态动作:继续支付(主)+ 取消订单(ghost,原型 pending 双按钮) + expect(find.text(t.cancelOrder), findsOneWidget); expect(find.text(t.orderNoLabel), findsOneWidget); expect(find.text(t.orderContinuePay), findsWidgets); });