import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/network/api_exception.dart'; import '../models/membership_models.dart'; import '../services/membership_service.dart'; import '../services/user_service.dart'; import 'auth_provider.dart'; /// 会员中心状态 class MemberState { const MemberState({ this.plans = const [], this.benefits = const [], this.me, this.isLoading = false, this.loadFailed = false, this.redeeming = false, }); final List plans; final List benefits; final MyMemberState? me; final bool isLoading; final bool loadFailed; final bool redeeming; MemberState copyWith({ List? plans, List? benefits, MyMemberState? me, bool? isLoading, bool? loadFailed, bool? redeeming, }) => MemberState( plans: plans ?? this.plans, benefits: benefits ?? this.benefits, me: me ?? this.me, isLoading: isLoading ?? this.isLoading, loadFailed: loadFailed ?? this.loadFailed, redeeming: redeeming ?? this.redeeming, ); } /// 会员中心 Notifier:套餐列表 + 我的会员状态 + 积分开通 class MemberNotifier extends StateNotifier { MemberNotifier(this._ref) : super(const MemberState()) { load(); } final Ref _ref; Future load() async { state = state.copyWith(isLoading: true, loadFailed: false); try { final plans = await MembershipService.fetchPlans(); MyMemberState? me; // 游客无会员状态接口权限,未登录时跳过 if (_ref.read(authProvider).isLoggedIn) { me = await MembershipService.fetchMe(); } state = state.copyWith( plans: plans.plans, benefits: plans.benefits, me: me, isLoading: false, ); } catch (_) { state = state.copyWith(isLoading: false, loadFailed: true); } } /// 积分开通会员。 /// 成功返回结果文案;失败抛 [ApiException] 由 UI 提示(2001 积分不足 / 2004 终身卡重复开通)。 Future redeem(String planCode) async { state = state.copyWith(redeeming: true); try { final result = await MembershipService.redeem(planCode); // 刷新我的会员状态 + 全局用户信息(积分/会员标识已变化) final me = await MembershipService.fetchMe(); final user = await UserService.fetchMe(); state = state.copyWith(me: me, redeeming: false); await _ref.read(authProvider.notifier).onLoginSuccess(user); return result; } catch (_) { state = state.copyWith(redeeming: false); rethrow; } } } /// autoDispose:进入会员页时创建并加载,离开即销毁;登录态变化后自动取最新 final memberProvider = StateNotifierProvider.autoDispose( MemberNotifier.new, );