Skip to content

Commit 4f664ec

Browse files
committed
feat(details): show similar headlines section
- Added similar headlines section - Implemented SimilarHeadlinesBloc - Displays similar headlines list
1 parent 877e2fd commit 4f664ec

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

lib/headline-details/view/headline_details_page.dart

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import 'package:flutter/material.dart';
66
import 'package:flutter_bloc/flutter_bloc.dart';
77
import 'package:ht_main/account/bloc/account_bloc.dart'; // Import AccountBloc
88
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
911
import 'package:ht_main/l10n/l10n.dart';
12+
import 'package:ht_main/router/routes.dart'; // Import Routes
1013
import 'package:ht_main/shared/shared.dart';
1114
import '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

Comments
 (0)