/// Loyalty Points Provider /// /// State management for user's loyalty points and balance information. library; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'loyalty_points_provider.g.dart'; /// Loyalty Points State /// /// Contains user's available points and expiration information. class LoyaltyPointsState { /// Current available points final int availablePoints; /// Points that will expire soon final int expiringPoints; /// Expiration date for expiring points final DateTime? expirationDate; /// Points earned this month final int earnedThisMonth; /// Points spent this month final int spentThisMonth; const LoyaltyPointsState({ required this.availablePoints, required this.expiringPoints, this.expirationDate, required this.earnedThisMonth, required this.spentThisMonth, }); /// Factory for initial state factory LoyaltyPointsState.initial() { return const LoyaltyPointsState( availablePoints: 0, expiringPoints: 0, expirationDate: null, earnedThisMonth: 0, spentThisMonth: 0, ); } /// Copy with method LoyaltyPointsState copyWith({ int? availablePoints, int? expiringPoints, DateTime? expirationDate, int? earnedThisMonth, int? spentThisMonth, }) { return LoyaltyPointsState( availablePoints: availablePoints ?? this.availablePoints, expiringPoints: expiringPoints ?? this.expiringPoints, expirationDate: expirationDate ?? this.expirationDate, earnedThisMonth: earnedThisMonth ?? this.earnedThisMonth, spentThisMonth: spentThisMonth ?? this.spentThisMonth, ); } } /// Loyalty Points Provider /// /// Manages user's loyalty points balance. /// Currently returns mock data matching the HTML design. @riverpod class LoyaltyPoints extends _$LoyaltyPoints { @override LoyaltyPointsState build() { // Mock data matching HTML design: 9,750 points available // 1,200 points expiring on 31/12/2023 return LoyaltyPointsState( availablePoints: 9750, expiringPoints: 1200, expirationDate: DateTime(2023, 12, 31), earnedThisMonth: 2500, spentThisMonth: 800, ); } /// Refresh points data Future refresh() async { // TODO: Fetch from API // For now, just reset to mock data state = build(); } /// Deduct points after redemption void deductPoints(int points) { if (state.availablePoints >= points) { state = state.copyWith( availablePoints: state.availablePoints - points, spentThisMonth: state.spentThisMonth + points, ); } } /// Add points (e.g., from earning activity) void addPoints(int points) { state = state.copyWith( availablePoints: state.availablePoints + points, earnedThisMonth: state.earnedThisMonth + points, ); } /// Check if user has enough points for a redemption bool hasEnoughPoints(int requiredPoints) { return state.availablePoints >= requiredPoints; } } /// Provider to check if user has enough points for a specific amount @riverpod bool hasEnoughPoints(Ref ref, int requiredPoints) { final points = ref.watch(loyaltyPointsProvider).availablePoints; return points >= requiredPoints; }