Skip to content

Commit 1393b60

Browse files
committed
feat(entity_details): Inject feed items
- Inject items into feed - Use FeedInjectorService - Handle app config - Update pagination logic
1 parent 3a9da2f commit 1393b60

File tree

1 file changed

+71
-22
lines changed

1 file changed

+71
-22
lines changed

lib/entity_details/bloc/entity_details_bloc.dart

Lines changed: 71 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import 'dart:async';
33
import 'package:bloc/bloc.dart';
44
import 'package:equatable/equatable.dart';
55
import 'package:ht_data_repository/ht_data_repository.dart';
6-
import 'package:ht_main/account/bloc/account_bloc.dart'; // Corrected import
6+
import 'package:ht_main/account/bloc/account_bloc.dart';
7+
import 'package:ht_main/app/bloc/app_bloc.dart'; // Added
78
import 'package:ht_main/entity_details/models/entity_type.dart';
8-
import 'package:ht_shared/ht_shared.dart';
9+
import 'package:ht_main/shared/services/feed_injector_service.dart'; // Added
10+
import 'package:ht_shared/ht_shared.dart'; // Ensures FeedItem, AppConfig, User are available
911

1012
part 'entity_details_event.dart';
1113
part 'entity_details_state.dart';
@@ -15,12 +17,16 @@ class EntityDetailsBloc extends Bloc<EntityDetailsEvent, EntityDetailsState> {
1517
required HtDataRepository<Headline> headlinesRepository,
1618
required HtDataRepository<Category> categoryRepository,
1719
required HtDataRepository<Source> sourceRepository,
18-
required AccountBloc accountBloc, // Changed to AccountBloc
19-
}) : _headlinesRepository = headlinesRepository,
20-
_categoryRepository = categoryRepository,
21-
_sourceRepository = sourceRepository,
22-
_accountBloc = accountBloc,
23-
super(const EntityDetailsState()) {
20+
required AccountBloc accountBloc,
21+
required AppBloc appBloc, // Added
22+
required FeedInjectorService feedInjectorService, // Added
23+
}) : _headlinesRepository = headlinesRepository,
24+
_categoryRepository = categoryRepository,
25+
_sourceRepository = sourceRepository,
26+
_accountBloc = accountBloc,
27+
_appBloc = appBloc, // Added
28+
_feedInjectorService = feedInjectorService, // Added
29+
super(const EntityDetailsState()) {
2430
on<EntityDetailsLoadRequested>(_onEntityDetailsLoadRequested);
2531
on<EntityDetailsToggleFollowRequested>(
2632
_onEntityDetailsToggleFollowRequested,
@@ -43,10 +49,12 @@ class EntityDetailsBloc extends Bloc<EntityDetailsEvent, EntityDetailsState> {
4349
final HtDataRepository<Headline> _headlinesRepository;
4450
final HtDataRepository<Category> _categoryRepository;
4551
final HtDataRepository<Source> _sourceRepository;
46-
final AccountBloc _accountBloc; // Changed to AccountBloc
52+
final AccountBloc _accountBloc;
53+
final AppBloc _appBloc; // Added
54+
final FeedInjectorService _feedInjectorService; // Added
4755
late final StreamSubscription<AccountState> _accountBlocSubscription;
4856

49-
static const _headlinesLimit = 10;
57+
static const _headlinesLimit = 10; // For fetching original headlines
5058

5159
Future<void> _onEntityDetailsLoadRequested(
5260
EntityDetailsLoadRequested event,
@@ -101,11 +109,33 @@ class EntityDetailsBloc extends Bloc<EntityDetailsEvent, EntityDetailsState> {
101109
queryParams['sources'] = (entityToLoad as Source).id;
102110
}
103111

104-
final headlinesResponse = await _headlinesRepository.readAllByQuery(
112+
final headlineResponse = await _headlinesRepository.readAllByQuery(
105113
queryParams,
106114
limit: _headlinesLimit,
107115
);
108116

117+
final currentUser = _appBloc.state.user;
118+
final appConfig = _appBloc.state.appConfig;
119+
120+
if (appConfig == null) {
121+
emit(
122+
state.copyWith(
123+
status: EntityDetailsStatus.failure,
124+
errorMessage: 'App configuration not available.',
125+
entityType: entityTypeToLoad,
126+
entity: entityToLoad,
127+
),
128+
);
129+
return;
130+
}
131+
132+
final processedFeedItems = _feedInjectorService.injectItems(
133+
headlines: headlineResponse.items,
134+
user: currentUser,
135+
appConfig: appConfig,
136+
currentFeedItemCount: 0, // Initial load for this entity's feed
137+
);
138+
109139
// 3. Determine isFollowing status
110140
var isCurrentlyFollowing = false;
111141
final currentAccountState = _accountBloc.state;
@@ -131,10 +161,10 @@ class EntityDetailsBloc extends Bloc<EntityDetailsEvent, EntityDetailsState> {
131161
entityType: entityTypeToLoad,
132162
entity: entityToLoad,
133163
isFollowing: isCurrentlyFollowing,
134-
headlines: headlinesResponse.items,
164+
feedItems: processedFeedItems, // Changed
135165
headlinesStatus: EntityHeadlinesStatus.success,
136-
hasMoreHeadlines: headlinesResponse.hasMore,
137-
headlinesCursor: headlinesResponse.cursor,
166+
hasMoreHeadlines: headlineResponse.hasMore, // Based on original headlines
167+
headlinesCursor: headlineResponse.cursor,
138168
clearErrorMessage: true,
139169
),
140170
);
@@ -203,7 +233,7 @@ class EntityDetailsBloc extends Bloc<EntityDetailsEvent, EntityDetailsState> {
203233
EntityDetailsLoadMoreHeadlinesRequested event,
204234
Emitter<EntityDetailsState> emit,
205235
) async {
206-
if (!state.hasMoreHeadlines ||
236+
if (!state.hasMoreHeadlines || // Still refers to original headlines pagination
207237
state.headlinesStatus == EntityHeadlinesStatus.loadingMore) {
208238
return;
209239
}
@@ -218,7 +248,6 @@ class EntityDetailsBloc extends Bloc<EntityDetailsEvent, EntityDetailsState> {
218248
} else if (state.entityType == EntityType.source) {
219249
queryParams['sources'] = (state.entity as Source).id;
220250
} else {
221-
// Should not happen
222251
emit(
223252
state.copyWith(
224253
headlinesStatus: EntityHeadlinesStatus.failure,
@@ -228,19 +257,39 @@ class EntityDetailsBloc extends Bloc<EntityDetailsEvent, EntityDetailsState> {
228257
return;
229258
}
230259

231-
final headlinesResponse = await _headlinesRepository.readAllByQuery(
260+
final headlineResponse = await _headlinesRepository.readAllByQuery(
232261
queryParams,
233262
limit: _headlinesLimit,
234-
startAfterId: state.headlinesCursor,
263+
startAfterId: state.headlinesCursor, // Cursor for original headlines
264+
);
265+
266+
final currentUser = _appBloc.state.user;
267+
final appConfig = _appBloc.state.appConfig;
268+
269+
if (appConfig == null) {
270+
emit(
271+
state.copyWith(
272+
headlinesStatus: EntityHeadlinesStatus.failure,
273+
errorMessage: 'App configuration not available for pagination.',
274+
),
275+
);
276+
return;
277+
}
278+
279+
final newProcessedFeedItems = _feedInjectorService.injectItems(
280+
headlines: headlineResponse.items,
281+
user: currentUser,
282+
appConfig: appConfig,
283+
currentFeedItemCount: state.feedItems.length, // Pass current total
235284
);
236285

237286
emit(
238287
state.copyWith(
239-
headlines: List.of(state.headlines)..addAll(headlinesResponse.items),
288+
feedItems: List.of(state.feedItems)..addAll(newProcessedFeedItems), // Changed
240289
headlinesStatus: EntityHeadlinesStatus.success,
241-
hasMoreHeadlines: headlinesResponse.hasMore,
242-
headlinesCursor: headlinesResponse.cursor,
243-
clearHeadlinesCursor: !headlinesResponse.hasMore, // Clear if no more
290+
hasMoreHeadlines: headlineResponse.hasMore, // Based on original headlines
291+
headlinesCursor: headlineResponse.cursor,
292+
clearHeadlinesCursor: !headlineResponse.hasMore,
244293
),
245294
);
246295
} on HtHttpException catch (e) {

0 commit comments

Comments
 (0)