···
import 'package:flutter/foundation.dart';
import '../models/post.dart';
import '../services/coves_api_service.dart';
6
-
import '../services/vote_service.dart';
import 'auth_provider.dart';
import 'vote_provider.dart';
···
CovesApiService? apiService,
VoteProvider? voteProvider,
23
-
VoteService? voteService,
24
-
}) : _voteProvider = voteProvider,
25
-
_voteService = voteService {
22
+
}) : _voteProvider = voteProvider {
// Use injected service (for testing) or create new one (for production)
// Pass token getter, refresh handler, and sign out handler to API service
// for automatic fresh token retrieval and automatic token refresh on 401
···
final AuthProvider _authProvider;
late final CovesApiService _apiService;
final VoteProvider? _voteProvider;
71
-
final VoteService? _voteService;
// Track previous auth state to detect transitions
bool _wasAuthenticated = false;
···
debugPrint('✅ $feedName loaded: ${_posts.length} posts total');
199
-
// Load initial vote state from PDS (only if authenticated)
200
-
if (_authProvider.isAuthenticated &&
201
-
_voteProvider != null &&
202
-
_voteService != null) {
204
-
final userVotes = await _voteService.getUserVotes();
205
-
_voteProvider.loadInitialVotes(userVotes);
206
-
} on Exception catch (e) {
208
-
debugPrint('⚠️ Failed to load vote state: $e');
210
-
// Don't fail the feed load if vote loading fails
211
-
// Keep silent per PR review discussion
195
+
// Initialize vote state from viewer data in feed response
196
+
// IMPORTANT: Call setInitialVoteState for ALL feed items, even when
197
+
// viewer.vote is null. This ensures that if a user removed their vote
198
+
// on another device, the local state is cleared on refresh.
199
+
if (_authProvider.isAuthenticated && _voteProvider != null) {
200
+
for (final feedItem in response.feed) {
201
+
final viewer = feedItem.post.viewer;
202
+
_voteProvider.setInitialVoteState(
203
+
postUri: feedItem.post.uri,
204
+
voteDirection: viewer?.vote,
205
+
voteUri: viewer?.voteUri,
} on Exception catch (e) {