Skip to content

Commit 3fe5a50

Browse files
committed
fix: These changes should ensure correct navigation from the "Similar Headlines" section and prevent the erroneous display of the "headline removed from saved" snackbar.
1 parent 6365082 commit 3fe5a50

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

lib/headline-details/view/headline_details_page.dart

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import 'package:flutter/foundation.dart' show kIsWeb; // Import kIsWeb
55
import 'package:flutter/material.dart';
66
import 'package:flutter_bloc/flutter_bloc.dart';
7+
import 'package:go_router/go_router.dart'; // Import GoRouter
78
import 'package:ht_main/account/bloc/account_bloc.dart'; // Import AccountBloc
89
import 'package:ht_main/headline-details/bloc/headline_details_bloc.dart'; // Import BLoC
910
import 'package:ht_main/headline-details/bloc/similar_headlines_bloc.dart'; // Import SimilarHeadlinesBloc
@@ -73,10 +74,6 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
7374
listenWhen: (previous, current) {
7475
final detailsState = context.read<HeadlineDetailsBloc>().state;
7576
if (detailsState is HeadlineDetailsLoaded) {
76-
if (current.status == AccountStatus.failure &&
77-
previous.status != AccountStatus.failure) {
78-
return true;
79-
}
8077
final currentHeadlineId = detailsState.headline.id;
8178
final wasPreviouslySaved =
8279
previous.preferences?.savedHeadlines.any(
@@ -88,9 +85,21 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
8885
(h) => h.id == currentHeadlineId,
8986
) ??
9087
false;
91-
return (wasPreviouslySaved != isCurrentlySaved) ||
92-
(current.status == AccountStatus.success &&
93-
previous.status != AccountStatus.success);
88+
89+
// Condition 1: Actual change in saved status for this headline
90+
if (wasPreviouslySaved != isCurrentlySaved) {
91+
// Only trigger if the status is success (to show confirmation)
92+
// or failure (to show error). Avoid triggering if status is just loading.
93+
return current.status == AccountStatus.success ||
94+
current.status == AccountStatus.failure;
95+
}
96+
97+
// Condition 2: A specific save/unsave operation just failed
98+
// This triggers if an operation was attempted (loading) and then failed.
99+
if (current.status == AccountStatus.failure &&
100+
previous.status == AccountStatus.loading) {
101+
return true;
102+
}
94103
}
95104
return false;
96105
},
@@ -487,7 +496,15 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
487496
),
488497
child: HeadlineItemWidget(
489498
headline: similarHeadline,
490-
targetRouteName: Routes.articleDetailsName,
499+
// Use the onTap callback for navigation
500+
onTap: (tappedHeadline) {
501+
context.pushNamed(
502+
Routes.articleDetailsName,
503+
pathParameters: {'id': tappedHeadline.id},
504+
extra: tappedHeadline,
505+
);
506+
},
507+
// targetRouteName: Routes.articleDetailsName, // No longer needed here
491508
),
492509
);
493510
},

lib/headlines-feed/widgets/headline_item_widget.dart

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,22 @@ class HeadlineItemWidget extends StatelessWidget {
99
/// Creates a [HeadlineItemWidget].
1010
const HeadlineItemWidget({
1111
required this.headline,
12-
required this.targetRouteName, // Add targetRouteName
12+
this.targetRouteName, // Make optional
13+
this.onTap, // Add optional onTap callback
1314
this.trailing, // Add optional trailing widget
1415
super.key,
15-
});
16+
}) : assert(targetRouteName != null || onTap != null, 'Either targetRouteName or onTap must be provided');
1617

1718
/// The headline to display.
1819
final Headline headline;
1920

2021
/// The named route to navigate to when the item is tapped.
21-
final String targetRouteName; // Add targetRouteName
22+
/// Used if [onTap] is null.
23+
final String? targetRouteName;
24+
25+
/// Optional callback to handle tap events.
26+
/// If provided, this is used instead of navigating via [targetRouteName].
27+
final void Function(Headline headline)? onTap;
2228

2329
/// An optional widget to display at the end of the row.
2430
final Widget? trailing;
@@ -47,11 +53,15 @@ class HeadlineItemWidget extends StatelessWidget {
4753
cardTheme.clipBehavior ?? Clip.antiAlias, // Use theme's clip behavior
4854
child: InkWell(
4955
onTap: () {
50-
context.goNamed(
51-
targetRouteName, // Use the new parameter here
52-
pathParameters: {'id': headline.id},
53-
extra: headline, // Pass the full headline object
54-
);
56+
if (onTap != null) {
57+
onTap!(headline);
58+
} else {
59+
context.goNamed(
60+
targetRouteName!, // Not null due to assert
61+
pathParameters: {'id': headline.id},
62+
extra: headline, // Pass the full headline object
63+
);
64+
}
5565
},
5666
child: Padding(
5767
padding: const EdgeInsets.all(AppSpacing.md), // Internal padding

0 commit comments

Comments
 (0)