// account_providers.dart — 账户域 Riverpod 装配。 // // 此处只做依赖装配:把 authProvider 的令牌/刷新接到统一 ApiClient, // 再产出 AccountApi。具体数据 provider(meProvider/devicesProvider/usage…) // 在后续阶段加入本文件。 import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../models/device.dart'; import '../models/me.dart'; import '../models/plan.dart'; import '../models/usage_point.dart'; import '../services/account_api.dart'; import '../services/api_client.dart'; import '../services/api_config.dart'; import 'auth_provider.dart'; /// 统一鉴权 HTTP 客户端:令牌取自 authProvider,401 时触发 AuthNotifier.refresh。 final apiClientProvider = Provider((ref) { return ApiClient( baseUrl: kApiBaseUrl, getToken: () => ref.read(authProvider).accessToken, refresh: () => ref.read(authProvider.notifier).refresh(), ); }); /// 账户域端点封装。 final accountApiProvider = Provider( (ref) => AccountApi(ref.watch(apiClientProvider)), ); // ── 数据 provider ─────────────────────────────────────────────────────────── /// 当前账户聚合视图(GET /v1/me)。登录态变化自动重取;未登录返回默认免费档。 class MeNotifier extends AsyncNotifier { @override Future build() async { final auth = ref.watch(authProvider); if (!auth.isLoggedIn) return const Me(email: '', plan: 'free'); return ref.read(accountApiProvider).me(); } /// 手动刷新(如连接/兑换后)。 Future refresh() async { state = const AsyncLoading(); state = await AsyncValue.guard(() => ref.read(accountApiProvider).me()); } } final meProvider = AsyncNotifierProvider(MeNotifier.new); /// 套餐定义(GET /v1/plans)。未登录返回空。 final plansProvider = FutureProvider>((ref) async { if (!ref.watch(authProvider).isLoggedIn) return const []; return ref.read(accountApiProvider).plans(); }); /// 最近 N 天用量(GET /v1/usage?days=N)。未登录返回空。 final usageProvider = FutureProvider.family, int>((ref, days) async { if (!ref.watch(authProvider).isLoggedIn) return const []; return ref.read(accountApiProvider).usage(days: days); }); /// 已登录设备列表(GET /v1/me/devices)。 class DevicesNotifier extends AsyncNotifier> { @override Future> build() async { if (!ref.watch(authProvider).isLoggedIn) return const []; return ref.read(accountApiProvider).devices(); } /// 移除设备(DELETE)后刷新列表。 Future remove(String uuid) async { await ref.read(accountApiProvider).removeDevice(uuid); ref.invalidateSelf(); await future; } } final devicesProvider = AsyncNotifierProvider>(DevicesNotifier.new);