import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../shared/utils/app_logger.dart'; import 'di_providers.dart'; class TraktScrobbleStatus { final DateTime? lastSuccessAt; final String? lastError; final int pendingCount; const TraktScrobbleStatus({ this.lastSuccessAt, this.lastError, this.pendingCount = 0, }); TraktScrobbleStatus copyWith({ DateTime? lastSuccessAt, String? lastError, bool clearError = false, int? pendingCount, }) { return TraktScrobbleStatus( lastSuccessAt: lastSuccessAt ?? this.lastSuccessAt, lastError: clearError ? null : (lastError ?? this.lastError), pendingCount: pendingCount ?? this.pendingCount, ); } } class TraktScrobbleStatusNotifier extends Notifier { static const _tag = 'TraktStatus'; @override TraktScrobbleStatus build() => const TraktScrobbleStatus(); void recordSuccess() { state = state.copyWith(lastSuccessAt: DateTime.now(), clearError: true); _refreshPending(); } void recordError(String error) { state = state.copyWith(lastError: error); _refreshPending(); } Future refreshPending() => _refreshPending(); Future retryPending() async { try { final queue = await ref.read(traktSyncQueueProvider.future); await queue.drain(); } catch (e) { AppLogger.warn(_tag, 'retryPending failed', e); } await _refreshPending(); } Future _refreshPending() async { try { final queue = await ref.read(traktSyncQueueProvider.future); final count = await queue.pendingCount(); state = state.copyWith(pendingCount: count); } catch (e) { AppLogger.debug(_tag, 'refreshPending failed', e); } } } final traktScrobbleStatusProvider = NotifierProvider( TraktScrobbleStatusNotifier.new, );