@@ -6,7 +6,10 @@ import 'package:flutter/material.dart';
66import 'package:flutter_bloc/flutter_bloc.dart' ;
77import 'package:ht_main/account/bloc/account_bloc.dart' ; // Import AccountBloc
88import '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
911import 'package:ht_main/l10n/l10n.dart' ;
12+ import 'package:ht_main/router/routes.dart' ; // Import Routes
1013import 'package:ht_main/shared/shared.dart' ;
1114import 'package:ht_shared/ht_shared.dart'
1215 show Headline; // Import Headline model
@@ -365,6 +368,17 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
365368 padding: EdgeInsets .only (bottom: AppSpacing .paddingLarge),
366369 sliver: SliverToBoxAdapter (child: SizedBox .shrink ()),
367370 ),
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),
368382 ],
369383 );
370384 }
@@ -469,4 +483,65 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
469483
470484 return chips;
471485 }
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+ }
472547}
0 commit comments