@@ -6,7 +6,10 @@ import 'package:flutter/material.dart';
6
6
import 'package:flutter_bloc/flutter_bloc.dart' ;
7
7
import 'package:ht_main/account/bloc/account_bloc.dart' ; // Import AccountBloc
8
8
import 'package:ht_main/headline-details/bloc/headline_details_bloc.dart' ; // Import BLoC
9
+ import 'package:ht_main/headline-details/bloc/similar_headlines_bloc.dart' ; // Import SimilarHeadlinesBloc
10
+ import 'package:ht_main/headlines-feed/widgets/headline_item_widget.dart' ; // Import HeadlineItemWidget
9
11
import 'package:ht_main/l10n/l10n.dart' ;
12
+ import 'package:ht_main/router/routes.dart' ; // Import Routes
10
13
import 'package:ht_main/shared/shared.dart' ;
11
14
import 'package:ht_shared/ht_shared.dart'
12
15
show Headline; // Import Headline model
@@ -365,6 +368,17 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
365
368
padding: EdgeInsets .only (bottom: AppSpacing .paddingLarge),
366
369
sliver: SliverToBoxAdapter (child: SizedBox .shrink ()),
367
370
),
371
+ // --- Similar Headlines Section ---
372
+ SliverToBoxAdapter (
373
+ child: Padding (
374
+ padding: horizontalPadding.copyWith (top: AppSpacing .xl),
375
+ child: Text (
376
+ l10n.similarHeadlinesSectionTitle, // Add this l10n key
377
+ style: textTheme.titleLarge,
378
+ ),
379
+ ),
380
+ ),
381
+ _buildSimilarHeadlinesSection (context),
368
382
],
369
383
);
370
384
}
@@ -469,4 +483,65 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
469
483
470
484
return chips;
471
485
}
486
+
487
+ Widget _buildSimilarHeadlinesSection (BuildContext context) {
488
+ final l10n = context.l10n;
489
+ return BlocBuilder <SimilarHeadlinesBloc , SimilarHeadlinesState >(
490
+ builder: (context, state) {
491
+ return switch (state) {
492
+ SimilarHeadlinesInitial () ||
493
+ SimilarHeadlinesLoading () =>
494
+ const SliverToBoxAdapter (
495
+ child: Padding (
496
+ padding: EdgeInsets .all (AppSpacing .lg),
497
+ child: Center (child: CircularProgressIndicator ()),
498
+ ),
499
+ ),
500
+ final SimilarHeadlinesError errorState => SliverToBoxAdapter (
501
+ child: Padding (
502
+ padding: const EdgeInsets .all (AppSpacing .lg),
503
+ child: Text (
504
+ errorState.message,
505
+ textAlign: TextAlign .center,
506
+ style: TextStyle (color: Theme .of (context).colorScheme.error),
507
+ ),
508
+ ),
509
+ ),
510
+ SimilarHeadlinesEmpty () => SliverToBoxAdapter (
511
+ child: Padding (
512
+ padding: const EdgeInsets .all (AppSpacing .lg),
513
+ child: Text (
514
+ l10n.similarHeadlinesEmpty, // Add this l10n key
515
+ textAlign: TextAlign .center,
516
+ ),
517
+ ),
518
+ ),
519
+ final SimilarHeadlinesLoaded loadedState => SliverList (
520
+ delegate: SliverChildBuilderDelegate (
521
+ (context, index) {
522
+ final similarHeadline = loadedState.similarHeadlines[index];
523
+ // Use a more compact item or reuse HeadlineItemWidget
524
+ // For now, reusing HeadlineItemWidget for simplicity
525
+ return Padding (
526
+ padding: const EdgeInsets .symmetric (
527
+ horizontal: AppSpacing .paddingMedium,
528
+ vertical: AppSpacing .sm,
529
+ ),
530
+ // Navigate to a new HeadlineDetailsPage instance
531
+ // Ensure the targetRouteName is appropriate or handle navigation differently
532
+ child: HeadlineItemWidget (
533
+ headline: similarHeadline,
534
+ targetRouteName: Routes .articleDetailsName,
535
+ ),
536
+ );
537
+ },
538
+ childCount: loadedState.similarHeadlines.length,
539
+ ),
540
+ ),
541
+ // Add a default case to satisfy exhaustiveness for the switch statement
542
+ _ => const SliverToBoxAdapter (child: SizedBox .shrink ()),
543
+ };
544
+ },
545
+ );
546
+ }
472
547
}
0 commit comments