import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../data/pes_models.dart'; import '../data/pes_repository.dart'; /// Main PES status provider — polls every 10 seconds for live updates. final pesStatusProvider = AsyncNotifierProvider( PesStatusNotifier.new, ); class PesStatusNotifier extends AsyncNotifier { Timer? _pollTimer; @override Future build() async { ref.onDispose(() => _pollTimer?.cancel()); _startPolling(); return _fetch(); } Future _fetch() async { final repo = ref.read(pesRepositoryProvider); return repo.getStatus(); } void _startPolling() { _pollTimer?.cancel(); _pollTimer = Timer.periodic(const Duration(seconds: 10), (_) async { try { final status = await _fetch(); state = AsyncData(status); } catch (_) { // Keep last known state on error } }); } Future refresh() async { state = const AsyncLoading(); state = await AsyncValue.guard(_fetch); } } /// XP log provider. final pesXpLogProvider = FutureProvider>((ref) async { final repo = ref.watch(pesRepositoryProvider); return repo.getXpLog(limit: 30); }); /// Timeline provider (7-day activity). final pesTimelineProvider = FutureProvider>((ref) async { final repo = ref.watch(pesRepositoryProvider); return repo.getTimeline(days: 7); });