From 2416c943cb959fd63cc36e3172d92e78edb61e16 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Sun, 12 Jul 2026 18:53:10 +0800 Subject: [PATCH] =?UTF-8?q?refactor(client):=20=E5=88=A0=E9=99=A4=E6=AD=BB?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20PlansScreen=20+=20NavView.plans=20+=20choo?= =?UTF-8?q?sePlan=20l10n(Renew=E2=86=92Purchase=20=E7=9B=B4=E8=BE=BE?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E8=B0=83=E7=94=A8=E8=80=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- client/lib/l10n/app_text.dart | 1 - client/lib/l10n/strings_en.dart | 2 - client/lib/l10n/strings_es.dart | 2 - client/lib/l10n/strings_ja.dart | 2 - client/lib/l10n/strings_ko.dart | 2 - client/lib/l10n/strings_ru.dart | 2 - client/lib/l10n/strings_zh.dart | 2 - client/lib/shell/desktop_shell.dart | 4 -- client/lib/state/navigation_provider.dart | 6 +- client/lib/widgets/account_screens.dart | 61 ------------------ .../golden/desktop_pages_golden_test.dart | 1 - client/test/golden/goldens/desktop_plans.png | Bin 23684 -> 0 bytes 12 files changed, 3 insertions(+), 82 deletions(-) delete mode 100644 client/test/golden/goldens/desktop_plans.png diff --git a/client/lib/l10n/app_text.dart b/client/lib/l10n/app_text.dart index 0b7599c..842a5bd 100644 --- a/client/lib/l10n/app_text.dart +++ b/client/lib/l10n/app_text.dart @@ -473,7 +473,6 @@ abstract class AppText { String get updateCheckFailed; // 检查失败(网络异常) // ── 套餐选择 ── - String get choosePlan; String get freePlan; String get proPlan; String get teamPlan; diff --git a/client/lib/l10n/strings_en.dart b/client/lib/l10n/strings_en.dart index 3dbbf8e..eb4b2ac 100644 --- a/client/lib/l10n/strings_en.dart +++ b/client/lib/l10n/strings_en.dart @@ -250,8 +250,6 @@ class StringsEn extends AppText { @override String get updateCheckFailed => 'Update check failed, try again later'; - @override - String get choosePlan => 'Choose plan'; @override String get freePlan => 'Free'; @override diff --git a/client/lib/l10n/strings_es.dart b/client/lib/l10n/strings_es.dart index 95050ea..d25615b 100644 --- a/client/lib/l10n/strings_es.dart +++ b/client/lib/l10n/strings_es.dart @@ -250,8 +250,6 @@ class StringsEs extends AppText { @override String get updateCheckFailed => 'Falló la búsqueda de actualizaciones, inténtalo más tarde'; - @override - String get choosePlan => 'Elegir plan'; @override String get freePlan => 'Gratis'; @override diff --git a/client/lib/l10n/strings_ja.dart b/client/lib/l10n/strings_ja.dart index 6bde2d9..9163703 100644 --- a/client/lib/l10n/strings_ja.dart +++ b/client/lib/l10n/strings_ja.dart @@ -250,8 +250,6 @@ class StringsJa extends AppText { @override String get updateCheckFailed => 'アップデートの確認に失敗しました。後でもう一度お試しください'; - @override - String get choosePlan => 'プランを選択'; @override String get freePlan => '無料'; @override diff --git a/client/lib/l10n/strings_ko.dart b/client/lib/l10n/strings_ko.dart index f02e44c..dc3fd0d 100644 --- a/client/lib/l10n/strings_ko.dart +++ b/client/lib/l10n/strings_ko.dart @@ -250,8 +250,6 @@ class StringsKo extends AppText { @override String get updateCheckFailed => '업데이트 확인에 실패했습니다. 잠시 후 다시 시도하세요'; - @override - String get choosePlan => '요금제 선택'; @override String get freePlan => '무료'; @override diff --git a/client/lib/l10n/strings_ru.dart b/client/lib/l10n/strings_ru.dart index 4e254c8..9ee33ac 100644 --- a/client/lib/l10n/strings_ru.dart +++ b/client/lib/l10n/strings_ru.dart @@ -250,8 +250,6 @@ class StringsRu extends AppText { @override String get updateCheckFailed => 'Не удалось проверить обновления, попробуйте позже'; - @override - String get choosePlan => 'Выбор тарифа'; @override String get freePlan => 'Бесплатный'; @override diff --git a/client/lib/l10n/strings_zh.dart b/client/lib/l10n/strings_zh.dart index c05af4c..b1f0327 100644 --- a/client/lib/l10n/strings_zh.dart +++ b/client/lib/l10n/strings_zh.dart @@ -249,8 +249,6 @@ class StringsZh extends AppText { @override String get updateCheckFailed => '检查更新失败,请稍后重试'; - @override - String get choosePlan => '选择套餐'; @override String get freePlan => '免费版'; @override diff --git a/client/lib/shell/desktop_shell.dart b/client/lib/shell/desktop_shell.dart index 94b031a..7c6370d 100644 --- a/client/lib/shell/desktop_shell.dart +++ b/client/lib/shell/desktop_shell.dart @@ -49,7 +49,6 @@ class DesktopShell extends ConsumerWidget { NavView.account: t.tabMe, NavView.contact: t.contactTitle, NavView.settings: t.settingsTitle, - NavView.plans: t.choosePlan, NavView.redeem: t.redeemTitle, NavView.devices: t.myDevices, NavView.purchase: t.purchaseTitle, @@ -76,9 +75,6 @@ class DesktopShell extends ConsumerWidget { case NavView.settings: return const SettingsPage(); // 账户下钻子页(内容区,顶栏带返回) - case NavView.plans: - // 只有 pro 走 pay v2 购买通道;team 等仍走既有兑换/联系人工流程。 - return PlansScreen(t: t, embedded: true, onChoose: (code) => go(code == 'pro' ? NavView.purchase : NavView.redeem)); case NavView.redeem: return RedeemScreen(t: t, embedded: true); case NavView.devices: diff --git a/client/lib/state/navigation_provider.dart b/client/lib/state/navigation_provider.dart index bed5534..cd9ba5e 100644 --- a/client/lib/state/navigation_provider.dart +++ b/client/lib/state/navigation_provider.dart @@ -3,11 +3,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; /// 一级视图 + 账户子页。 /// desktop 侧栏暴露 6 个一级项(connect..settings);mobile/tablet 取前 4 项, -/// contact/settings 在 mobile 走账户子页。plans/redeem 是 account 的下钻页。 -enum NavView { connect, servers, stats, account, contact, settings, plans, redeem, devices, purchase, payment, orders, invite, notifications } +/// contact/settings 在 mobile 走账户子页。redeem 是 account 的下钻页。 +enum NavView { connect, servers, stats, account, contact, settings, redeem, devices, purchase, payment, orders, invite, notifications } /// 账户下钻子页(desktop 在内容区切换、顶栏带返回;mobile/tablet 走全屏 push)。 -const Set kAccountSubViews = {NavView.plans, NavView.redeem, NavView.devices, NavView.purchase, NavView.payment, NavView.orders, NavView.invite}; +const Set kAccountSubViews = {NavView.redeem, NavView.devices, NavView.purchase, NavView.payment, NavView.orders, NavView.invite}; /// 当前视图。 final navViewProvider = StateProvider((ref) => NavView.connect); diff --git a/client/lib/widgets/account_screens.dart b/client/lib/widgets/account_screens.dart index 3079469..583efcd 100644 --- a/client/lib/widgets/account_screens.dart +++ b/client/lib/widgets/account_screens.dart @@ -20,7 +20,6 @@ import '../services/auth_api.dart'; import '../state/account_providers.dart'; import 'pangolin_button.dart'; import 'pangolin_icons.dart'; -import 'plan_card.dart'; /// 通用:带返回箭头的子页骨架。embedded=true 时只返回内容(desktop 内容区下钻, /// 返回/标题由外层 shell 顶栏提供),否则整页 Scaffold(mobile/tablet 全屏 push)。 @@ -67,66 +66,6 @@ class SettingsScreen extends StatelessWidget { } } -/// ── 套餐选择 ── (价格/额度来自 GET /v1/plans;当前档由 me.plan 判定; -/// 功能清单仍取 l10n,后端无此字段) -class PlansScreen extends ConsumerWidget { - const PlansScreen({super.key, required this.t, this.onChoose, this.onBack, this.embedded = false}); - final AppText t; - final ValueChanged? onChoose; - final VoidCallback? onBack; - final bool embedded; - - List _feats(String code) => switch (code) { - 'free' => t.featsFree, - 'pro' => t.featsPro, - 'team' => t.featsTeam, - _ => const [], - }; - - // 套餐名是 UI 文案(后端 plans 表无名称列),按 code 取 l10n。 - String _name(String code) => switch (code) { - 'free' => t.freePlan, - 'pro' => t.proPlan, - 'team' => t.teamPlan, - _ => code, - }; - - @override - Widget build(BuildContext context, WidgetRef ref) { - final c = context.pangolin; - final plansAsync = ref.watch(plansProvider); - final myPlan = ref.watch(meProvider).valueOrNull?.plan ?? 'free'; - - Widget body() => plansAsync.when( - loading: () => const Center(child: Padding(padding: EdgeInsets.all(40), child: CircularProgressIndicator())), - error: (_, __) => Center( - child: Padding(padding: const EdgeInsets.all(40), child: Text(t.lang.loadFailedRetry, style: PangolinText.body.copyWith(color: c.fg3)))), - data: (plans) => ListView( - padding: const EdgeInsets.fromLTRB(20, 14, 20, 24), - children: [ - for (final p in plans) - Padding( - padding: EdgeInsets.only(bottom: 14, top: p.code == 'pro' ? 12 : 0), - child: PlanCard( - name: _name(p.code), - price: p.priceLabel(), - period: t.perMonth, - features: _feats(p.code), - ctaLabel: p.code == myPlan ? t.current : (p.code == 'team' ? t.choose : t.upgrade), - featured: p.code == 'pro', - isCurrent: p.code == myPlan, - popularLabel: p.code == 'pro' ? t.mostPopular : null, - onPressed: () => onChoose?.call(p.code), - ), - ), - ], - ), - ); - - return _SubScaffold(title: t.choosePlan, onBack: onBack, embedded: embedded, child: body()); - } -} - /// ── 设备管理 ── (真实 GET /v1/me/devices;移除 = DELETE。本机高亮待 P6 设备 id) class DevicesScreen extends ConsumerWidget { const DevicesScreen({super.key, required this.t, this.onBack, this.embedded = false}); diff --git a/client/test/golden/desktop_pages_golden_test.dart b/client/test/golden/desktop_pages_golden_test.dart index 53385c9..a5db857 100644 --- a/client/test/golden/desktop_pages_golden_test.dart +++ b/client/test/golden/desktop_pages_golden_test.dart @@ -70,7 +70,6 @@ void main() { testWidgets('desktop 联系页', (t) => _shoot(t, NavView.contact, 'desktop_contact')); testWidgets('desktop 设置页', (t) => _shoot(t, NavView.settings, 'desktop_settings')); // 账户下钻子页(内容区 + 顶栏返回) - testWidgets('desktop 套餐选择', (t) => _shoot(t, NavView.plans, 'desktop_plans')); testWidgets('desktop 兑换购买', (t) => _shoot(t, NavView.redeem, 'desktop_redeem')); testWidgets('desktop 设备管理', (t) => _shoot(t, NavView.devices, 'desktop_devices')); } diff --git a/client/test/golden/goldens/desktop_plans.png b/client/test/golden/goldens/desktop_plans.png deleted file mode 100644 index c7dcea1548c1502dc27a533b60b30232b65c5f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23684 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