import 'package:flutter/material.dart'; import 'package:neomovies_mobile/data/repositories/reactions_repository.dart'; import 'package:neomovies_mobile/presentation/providers/auth_provider.dart'; class ReactionsProvider with ChangeNotifier { final ReactionsRepository _repository; final AuthProvider _authProvider; ReactionsProvider(this._repository, this._authProvider) { _authProvider.addListener(_onAuthChanged); } bool _isLoading = false; bool get isLoading => _isLoading; String? _error; String? get error => _error; Map _reactionCounts = {}; Map get reactionCounts => _reactionCounts; String? _userReaction; String? get userReaction => _userReaction; String? _currentMediaId; String? _currentMediaType; void _onAuthChanged() { // If user logs out, clear their specific reaction data if (!_authProvider.isAuthenticated) { _userReaction = null; // We can keep the public reaction counts loaded notifyListeners(); } } Future loadReactionsForMedia(String mediaType, String mediaId) async { if (_currentMediaId == mediaId && _currentMediaType == mediaType) return; // Already loaded _currentMediaId = mediaId; _currentMediaType = mediaType; _isLoading = true; _error = null; notifyListeners(); try { _reactionCounts = await _repository.getReactionCounts(mediaType, mediaId); if (_authProvider.isAuthenticated) { final userReactionResult = await _repository.getMyReaction(mediaType, mediaId); _userReaction = userReactionResult.reactionType; } else { _userReaction = null; } } catch (e) { _error = e.toString(); } finally { _isLoading = false; notifyListeners(); } } Future setReaction(String mediaType, String mediaId, String reactionType) async { if (!_authProvider.isAuthenticated) { _error = 'User not authenticated'; notifyListeners(); return; } final previousReaction = _userReaction; final previousCounts = Map.from(_reactionCounts); // Optimistic UI update if (_userReaction == reactionType) { // User is deselecting their reaction - send empty string to remove _userReaction = null; _reactionCounts[reactionType] = (_reactionCounts[reactionType] ?? 1) - 1; reactionType = ''; } else { // User is selecting a new or different reaction if (_userReaction != null) { _reactionCounts[_userReaction!] = (_reactionCounts[_userReaction!] ?? 1) - 1; } _userReaction = reactionType; _reactionCounts[reactionType] = (_reactionCounts[reactionType] ?? 0) + 1; } notifyListeners(); try { await _repository.setReaction(mediaType, mediaId, reactionType); } catch (e) { // Revert on error _error = e.toString(); _userReaction = previousReaction; _reactionCounts = previousCounts; notifyListeners(); } } @override void dispose() { _authProvider.removeListener(_onAuthChanged); super.dispose(); } }